2017-04-05 90 views
-2

我从来没有真正理解为什么这样的代码,下面给出的是有效的,会很感激,如果有人帮了我。为什么我们可以在一个静态方法内创建一个类的实例?

public class A{ 

    int x; 
    int y; 

    void hello() { 
     System.out.println("Hello World"); 
    } 

    public static void main(String[] args) { 
     A my_instance = new A(); 

     my_instance.hello(); 
    } 
} 

OUTPUT:

Hello World 

问题:为什么我们允许创建其自己的静态方法的内部之一的实例?

我的理解是静态方法属于类,而不是任何特定的实例,但是这是否意味着在引擎盖下的编译器首先分析了一切,这不是静态的,使得可用的静态方法的代码?

+3

“为什么我们允许在其自己的静态方法之一内创建A的实例?” - 为什么*不会被允许这么做?你可以在任何地方创建一个A的实例。 A的静态方法没有什么特别之处。 – user2357112

+1

[为什么让一个类创建自己的实例?](http://stackoverflow.com/questions/22263772/why-make-a-class-create-an-instance-of-itself) –

+0

它只是对我来说似乎是错误的,我可以创建一个我仍在构建的东西的实例。我不太了解真正发生了什么以及为什么允许这样做 –

回答

1

看看这些要点帮你。

1. Java程序的执行开始于一种特殊的方法public static void main(String[] args)。由于Java是一种面向对象的语言,一切都必须是内部类,而这个特殊的方法main()也不例外。这就是为什么它在课堂上,即A这里。

2.

它只是似乎是错误的,我认为我可以创造的东西的实例,我仍然在建设

的过程中你的这种想法是错误的。当程序是运行,一切都已经已建已经(当然你知道编译运行之前),所以在编译过程中的概念没有任何意义,当程序已经启动和运行。如果你在构建A实例的建设的过程中你的声明关联,然后再那将是错误的,因为main()方法是静态的,所以不需要的A一个实例,以存在它被调用。实际上,在JVM实例化应用程序中的任何其他类之前,将调用main()

3.main(String[] args)被执行的起点,它必须允许一些实例化类。现在,你的类A一类,就像任何其他的,因此main()可以实例化了。

一些更多的阅读这里:

  1. Why is the Java main method static?
  2. Why make a class create an instance of itself?
+0

啊,这样做更有意义,谢谢! –

+0

很高兴能有所帮助;-) –

0

它的工作,因为你可以在任何情况下一个对象。它的工作原理是,如果它不工作,你永远不会创建一个对象。静态成员在类初始化时可用,不是“可用于非静态代码”,而是在类初始化完成后静态或非静态成员。 main甚至在课程初始化之后才运行。在这一点上,类的所有力量都可以用于静态和非静态代码,并且包括创建对象的能力。它的工作原理是因为JLS说这就是它的工作原理。

+0

谢谢您的回答 –

0

JVM需要静态成员的执行护理,在这种情况下,以这样的方式静态方法JVM设计。因为,我们需要从静态成员中创建一个对象

相关问题