2012-11-19 166 views
0

可能重复:
What is the reason behind “non-static method cannot be referenced from a static context”?的Java:非静态变量这不能从静态上下文中引用

我是新来的Java。我有以下几组代码,如下所示。

class Default 
{ 
    private short s; 
    private int i; 
    private long l; 
    private float f; 
    private double d; 
    private char c; 
    private String str; 
    private boolean b; 

    public static void main (String args[ ]) 
    { 

     Default df = new Default(); 

     System.out.println("\n Short = "+s); 

     System.out.println ("\n int i =" + i); 
     System.out.println ("\n long l =" + l); 
     System.out.println ("\n float f =" + f); 
     System.out.println ("\n double d =" + d); 
     System.out.println ("\n char c =" + c); 
     System.out.println ("\n String s =" + str); 
     System.out.println("\n boolean b =" + b); 
    } 
} 

这产生了一个错误消息作为这个问题的主题,但下面的代码完美的作品。

class Default 
{ 
    private short s; 
    private int i; 
    private long l; 
    private float f; 
    private double d; 
    private char c; 
    private String str; 
    private boolean b; 

    public static void main (String args[ ]) 
    { 

     Default df = new Default(); 

     System.out.println("\n Short = "+df.s); 

     System.out.println ("\n int i =" + df.i); 
     System.out.println ("\n long l =" + df.l); 
     System.out.println ("\n float f =" + df.f); 
     System.out.println ("\n double d =" + df.d); 
     System.out.println ("\n char c =" + df.c); 
     System.out.println ("\n String s =" + df.str); 
     System.out.println("\n boolean b =" + df.b); 
    } 
} 

这给出了期望的结果。这两组代码有什么区别。

回答

2

您有一个名为df的实例化对象Default,它正在调用这些变量。由于您创建的变量不是static,它们必须是已创建的某个对象的一部分。

Default df = new Default(); 
df.i //<- is now a part of the instantiated object df. 

如果关键字static未与对象一起使用,则使用关键字static。所以,你可以只说:

private static char c; 

然后你就可以随时打电话char c,这将是null因为你没有给它的值呢。当你使用那个没有对象的变量或方法时,你使用static

1

这两组代码之间的区别在于,在第二个示例中,您有一个类的实例,当您说Default df = new Default();时,您创建了这个实例。

您已将Default类中的所有变量声明为实例级变量,这意味着要访问它们,您必须通过类的特定实例。换句话说,你的类的每个实例都有自己的一组变量,所以编译器知道你实际访问哪一个的唯一方法就是如果你先指定了你想使用的实例。

例如,你可以这样做:

Default df = new Default(); 
Default anotherOne = new Default(); 

df.s = 1; 
anotherOne.s = 2; 

System.out.println("\n Short(df) = "+df.s);     //'1' 
System.out.println("\n Short(anotherOne) = "+anotherOne.s); //'2' 

与试图直接从main()访问实例变量(或任何其他静态方法)的问题是,main()方法不直接与任何实例相关联你的班。因此,在这种情况下,编译器不知道从哪个实例获取变量,除非您明确指定。

你当然可以让你的变量成为静态的,但是不用为每个实例设置一组值,不管你创建了多少个实例,只需要一组变量。在这种情况下,示例中的代码仍然会编译并运行(尽管它会/应该产生编译器警告),但是这两个语句都会打印'2',因为每个变量只有一个s变量而不是一个类的实例。

+0

aroth的回复非常有助于可视化差异。谢谢。 – user1837224

相关问题