如果没有对象实例,Java的Hello World如何工作?

web*_*kul 8 java

我是Java的新手,我对某些事感到困惑:

在Java中的简单hello world程序中,没有创建任何对象,所以该类在以下示例中如何工作?

public class HelloWorld 
{  
    public static void main (String args[]) 
    {  
        System.out.println ("Hello World!");  
    }  
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 17

这不会创建一个HelloWorld因为main静态方法的实例.静态方法(和静态字段)与类型相关,而不是与类型的特定实例相关.

有关更多详细信息,请参阅静态/实例成员Java Tutorial页面,以及此Stack Overflow问题(以及其他问题).


Dav*_*vis 11

声明为static的任何变量或方法都可以独立于类实例使用.

实验

尝试编译这个类:

public class HelloWorld {
    public static int INT_VALUE = 42;

    public static void main( String args[] ) {
        System.out.println( "Hello, " + INT_VALUE );
    }  
}
Run Code Online (Sandbox Code Playgroud)

这成功是因为变量INT_VALUE被声明为静态(如方法main).

尝试编译此类以及上一个类:

public class HelloWorld2 {
    public static void main( String args[] ) {
        System.out.println( "Hello, " + HelloWorld.INT_VALUE );
    }
}
Run Code Online (Sandbox Code Playgroud)

这是成功的,因为INT_VALUE变量既是静态的又是公共的.没有太多细节,通常避免公开变量通常是好的.

尝试编译这个类:

public class HelloWorld {
    public int int_value = 42;

    public static void main( String args[] ) { 
        System.out.println( "Hello, " + int_value );
    }  
}
Run Code Online (Sandbox Code Playgroud)

这不会编译,因为类HelloWorld中没有对象实例.要编译(和运行)此程序,必须进行更改:

public class HelloWorld {
    public int int_value = 42;

    public HelloWorld() { }

    public static void main( String args[] ) {
        HelloWorld hw = new HelloWorld();
        System.out.println( "Hello, " + hw.int_value );
    }  
}
Run Code Online (Sandbox Code Playgroud)


Bri*_*new 10

更多的OO版本看起来像:

public class HelloWorld {
   public void sayHello() {
      System.out.println("Hello World");
   }
   public static void main(String[] argv) {
     HelloWorld hw = new HelloWorld();
     hw.sayHello();
   }
}
Run Code Online (Sandbox Code Playgroud)

我怀疑它更像你期待的.它实例化一个新的HelloWord类实例,然后要求它做一些事情.为了学习OO,我发现这更直观,并且(由于我不会在这里讨论的原因)我在编写自己的类时(简要地说 - 线程问题/共享状态等)倾向于回避静态方法.