【问题标题】:Java Instance positionJava 实例位置
【发布时间】:2015-07-22 02:48:50
【问题描述】:

在创建另一个类的实例时,我注意到创建实例的位置可能会引发很多错误,或者会起作用。让我用这个例子

public class Main() {
    Main(){

    }

    Camera camera = new Camera();

    public static void main(String[] args) {
        Box box = new Box();
    }
}

这两个不同的实例有什么区别?我有一个小小的想法,它与静态引用有关,但我不确定。另外,在什么条件下你会在静态主目录内部或外部创建一个实例?感谢您的宝贵时间。

【问题讨论】:

标签: java class instances


【解决方案1】:

在您提供的代码中,Main 是一个类,具有构造函数Main()、类型为Camera 的字段camera(具有包本地可见性)和静态方法main(String[])。请注意,静态方法main(String[]) 与类Main 或其构造函数Main() 不同。

Box 类型的 box 实例在静态方法 main 内部创建,在其外部不可见,而 Camera 类型的 camera 实例对同一包中的每个类都可见作为当前班级。

另外,由于camera 不是静态字段,它必须与Main 类型的实例相关联。例如,您可以这样做:

Main m = new Main();
Camera thisCamera = m.camera;

但不是这个:

Camera myCamera = Main.camera;

【讨论】:

  • 是什么让相机成为一个领域?
  • Java 中的字段只是类中的一个变量。正如 Jeffrey 在评论中所建议的那样,教程应该清楚地说明这些概念。这是一个快速且易于阅读的内容:tutorials.jenkov.com/java/index.html
【解决方案2】:

@Chthonic Project 帖子的更多细节:

根据您给出的示例,很明显您还没有阅读 java 文档

类中的成员变量——这些称为字段

方法或代码块中的变量——这些称为局部变量

为了更详细地说明这一点,让我们再举一个例子

/*Camera object is class variable*/
Camera camera = new Camera();

由于 this 的范围是类级别,因此它成为类成员或字段。 不要认为只有intString 可以成为字段。类对象变量也可以是字段或类成员。

 /*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.
 }

【讨论】:

    【解决方案3】:

    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 类、main 实例变量和main() 方法是多么令人困惑。这就是我们不将类命名为 Main 的原因。

    【讨论】:

    • 我知道我没有创建一个 main 实例,我只是询问两个实例的区别。我不知道你是否在静态方法中定义了一个实例,它也是静态的
    【解决方案4】:

    当你这样做时:

    Camera camera = new Camera();
    

    您正在声明 Main 类的受保护属性(字段)。您还为此属性创建了一个实例。

    请注意,此属性不是静态的。这样,只要您创建一个 Main 类的对象,就会创建一个 Camera。

    对于另一方,如果你声明:

    static Camera camera = new Camera();
    

    那么Java编译器会保证这个属性只有一个实例存在(不管你创建了多少Main类的对象)。

    box 是在静态 void main 方法中创建的变量。此变量在此方法之外不可见(即无法访问),因为此变量是在方法内部创建的(这是许多语言的标准范围规则)。

    请注意,在静态方法内部只能引用两种变量:局部变量(如框)或类静态变量(如上例)。

    【讨论】:

    • 我喜欢这个答案,因为任何看到这个例子的新手都会想知道为什么他们不能在main 方法中使用cameraMain 的实例还没有创建,所以还没有 camera
    猜你喜欢
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多