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 成员或字段。 不要认为只有 intString 才能成为字段。 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。