2015-07-22 62 views
1

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

public class Main() { 
    Main(){ 

    } 

    Camera camera = new Camera(); 

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

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

+4

您可能对一些[教程](https://docs.oracle.com/javase/tutorial/)感兴趣。特别是,[语言基础教程](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/index.html)应该能够帮助你(查看[Variables](https:/ /docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html)部分)。 – Jeffrey

回答

2

在你已经提供的代码,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; 
+0

什么让相机成为一个领域? – Ryan

+0

Java中的一个字段只是一个类中的变量。正如Jeffrey在评论中所建议的那样,教程应该使这些概念清晰。这里是一个快速和容易阅读:http://tutorials.jenkov.com/java/index.html –

1

当你做到这一点:

Camera camera = new Camera(); 

你声明类的保护属性(场)主要。您还正在为此属性创建一个实例。

请注意,此属性不是静态的。这样,总是创建一个Main类的对象,一个Camera将被创建。

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

static Camera camera = new Camera(); 

那么Java编译器会保证只有一个该属性的实例将存在(无论创建了多少类主要的对象)。

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

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

+0

我喜欢这个答案,因为任何新手看这个例子会想知道他们为什么不能使用'相机'在'main'方法中。 “Main”的一个实例还没有创建,所以还没有一个“摄像头”。 – CandiedOrange

2

只是更@Chthonic项目的后期阐述:

按照这个例子中你给它显然,你没有一个阶级,这些通过Java文档不见了

成员变量被称为字段

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

为了详细阐述这更让我们另一示例

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

由于这是在类级别这成为一个类的成员或场的范围。 不要认为只有intString可以成为一个领域。类对象变量也可以是字段或类成员。

/*Here the BOX object is inside a method*/ 
public static void main(String[] args){ 
    Box box = new Box(); 
} 

A Box box对象在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. 
} 
1

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的原因。

+0

我明白我havnt创建了一个主要的实例,我只是问两个实例的区别。我不知道你是否用静态方法定义了一个实例,它也是静态的 – Ryan