Java实例位置
Java Instance position
在创建另一个 class 的实例时,我注意到创建实例的位置可能会引发很多错误,或者无法正常工作。让我用这个例子
public class Main() {
Main(){
}
Camera camera = new Camera();
public static void main(String[] args) {
Box box = new Box();
}
}
这两种不同的实例有什么区别?我稍微知道它与静态引用有关,但我不确定。另外,在什么情况下你会在静态主体内部或外部创建一个实例?谢谢你的时间。
在您提供的代码中,Main
是一个 class,带有一个构造函数 Main()
,一个类型为 Camera
的字段 camera
(带有包本地可见性)和静态方法 main(String[])
。请注意,静态方法 main(String[])
与 class Main
或其构造函数 Main()
.
不同
Box
类型的 box
实例是在静态方法 main
内部创建的,在它之外是不可见的,而 camera
类型的实例 Camera
对与当前 class.
相同包中的每个 class 可见
此外,由于 camera
不是静态字段,它必须与类型 Main
的实例相关联。例如,您可以这样做:
Main m = new Main();
Camera thisCamera = m.camera;
但不是这个:
Camera myCamera = Main.camera;
当你这样做时:
Camera camera = new Camera();
您正在声明 class Main 的受保护属性(字段)。您还为此属性创建了一个实例。
请注意,此属性不是静态的。这样,您总是创建一个 class Main 的对象,一个 Camera 将被创建。
对于另一方,如果你声明:
static Camera camera = new Camera();
那么Java编译器会保证这个属性只有一个实例存在(不管你创建了多少个class Main对象)。
box 是在 static void main 方法中创建的变量。此变量在此方法之外不可见(即无法访问),因为此变量是在方法内部创建的(这是许多语言的标准范围规则)。
请注意,在静态方法中只能引用两种变量:局部变量(如框)或 class 静态变量(如上例)。
@Chthonic 项目 post 的详细说明:
根据您给出的示例,很明显您还没有阅读 java 文档
Member variables in a class—these are called fields.
Variables in a method or block of code—these are called local variables.
为了更详细地说明这一点,让我们再举一个例子
/*Camera object is class variable*/
Camera camera = new Camera();
由于其范围在 class 级别,因此它成为 class 成员或字段。
不要认为只有 int
或 String
才能成为字段。 class 对象变量也可以是字段或 class 成员。
/*Here the BOX object is inside a method*/
public static void main(String[] args){
Box box = new Box();
}
一个 Box box
对象在 main 方法中被声明和实例化。此对象的范围限于方法范围。它只会在 main 方法的大括号内。
例如假设现在修改你的例子:
public static void main(String[] args){
Box box = new Box();
if(null != camera){
// You can access camera inside main as it is a class member
// the scope is a full class.
}
} // mian method ends.
if(null == box){ // compiler will shout!!!
// accessing box object outside main method
// not allowed cause the box objects scope is over inside main method only.
}
甚至还没有创建 Main
的实例,因此还没有 camera
。解决方法如下:
public class Main() {
Main(){
}
Camera camera = new Camera();
public static void main(String[] args) {
Box box = new Box();
box.standOn();
Main main = new Main(); // <- now the camera exists.
System.out.println("Say cheese.");
main.camera.click();
}
}
一定要阅读人们指给您的教程。然而,考虑这里发生的事情的简单方法是:对象的静态部分是在创建它的实例(对象)之前工作的部分(通常使用 new
)。当然,static
也意味着每个实例共享相同的内存,这非常有用且很酷。但是让你的一部分在你存在之前工作也很酷。毕竟 static void main(String[] args)
是我们开始整个节目的方式。
到现在为止,您应该已经注意到 Main
、class、main
实例变量和 main()
方法是多么令人困惑。这就是为什么我们不将 classes 命名为 Main。
在创建另一个 class 的实例时,我注意到创建实例的位置可能会引发很多错误,或者无法正常工作。让我用这个例子
public class Main() {
Main(){
}
Camera camera = new Camera();
public static void main(String[] args) {
Box box = new Box();
}
}
这两种不同的实例有什么区别?我稍微知道它与静态引用有关,但我不确定。另外,在什么情况下你会在静态主体内部或外部创建一个实例?谢谢你的时间。
在您提供的代码中,Main
是一个 class,带有一个构造函数 Main()
,一个类型为 Camera
的字段 camera
(带有包本地可见性)和静态方法 main(String[])
。请注意,静态方法 main(String[])
与 class Main
或其构造函数 Main()
.
Box
类型的 box
实例是在静态方法 main
内部创建的,在它之外是不可见的,而 camera
类型的实例 Camera
对与当前 class.
此外,由于 camera
不是静态字段,它必须与类型 Main
的实例相关联。例如,您可以这样做:
Main m = new Main();
Camera thisCamera = m.camera;
但不是这个:
Camera myCamera = Main.camera;
当你这样做时:
Camera camera = new Camera();
您正在声明 class Main 的受保护属性(字段)。您还为此属性创建了一个实例。
请注意,此属性不是静态的。这样,您总是创建一个 class Main 的对象,一个 Camera 将被创建。
对于另一方,如果你声明:
static Camera camera = new Camera();
那么Java编译器会保证这个属性只有一个实例存在(不管你创建了多少个class Main对象)。
box 是在 static void main 方法中创建的变量。此变量在此方法之外不可见(即无法访问),因为此变量是在方法内部创建的(这是许多语言的标准范围规则)。
请注意,在静态方法中只能引用两种变量:局部变量(如框)或 class 静态变量(如上例)。
@Chthonic 项目 post 的详细说明:
根据您给出的示例,很明显您还没有阅读 java 文档
Member variables in a class—these are called fields.
Variables in a method or block of code—these are called local variables.
为了更详细地说明这一点,让我们再举一个例子
/*Camera object is class variable*/
Camera camera = new Camera();
由于其范围在 class 级别,因此它成为 class 成员或字段。
不要认为只有 int
或 String
才能成为字段。 class 对象变量也可以是字段或 class 成员。
/*Here the BOX object is inside a method*/
public static void main(String[] args){
Box box = new Box();
}
一个 Box box
对象在 main 方法中被声明和实例化。此对象的范围限于方法范围。它只会在 main 方法的大括号内。
例如假设现在修改你的例子:
public static void main(String[] args){
Box box = new Box();
if(null != camera){
// You can access camera inside main as it is a class member
// the scope is a full class.
}
} // mian method ends.
if(null == box){ // compiler will shout!!!
// accessing box object outside main method
// not allowed cause the box objects scope is over inside main method only.
}
甚至还没有创建 Main
的实例,因此还没有 camera
。解决方法如下:
public class Main() {
Main(){
}
Camera camera = new Camera();
public static void main(String[] args) {
Box box = new Box();
box.standOn();
Main main = new Main(); // <- now the camera exists.
System.out.println("Say cheese.");
main.camera.click();
}
}
一定要阅读人们指给您的教程。然而,考虑这里发生的事情的简单方法是:对象的静态部分是在创建它的实例(对象)之前工作的部分(通常使用 new
)。当然,static
也意味着每个实例共享相同的内存,这非常有用且很酷。但是让你的一部分在你存在之前工作也很酷。毕竟 static void main(String[] args)
是我们开始整个节目的方式。
到现在为止,您应该已经注意到 Main
、class、main
实例变量和 main()
方法是多么令人困惑。这就是为什么我们不将 classes 命名为 Main。