静态变量与非静态变量

时间:2013-09-26 18:29:37

标签: java

我定义了一个对象并声明了一个静态变量i。在get()方法中,当我尝试打印实例和类变量时,两者都打印相同的值。

this.i不是实例变量吗?它应该打印0而不是50吗?

public class test {
    static int i = 50;
    void get(){
        System.out.println("Value of i = " + this.i);
        System.out.println("Value of static i = " + test.i);
    }

    public static void main(String[] args){
        new test().get();
    }

}

4 个答案:

答案 0 :(得分:8)

不,只有一个变量 - 你没有声明任何实例变量。

不幸的是,Java允许您访问静态成员,就像您通过相关类型的引用访问静态成员一样。这是一个设计缺陷IMO,一些IDE(例如Eclipse)允许您将其标记为警告或错误 - 但它是语言的一部分。您的代码是有效的:

System.out.println("Value of i = " + test.i);
System.out.println("Value of static i = " + test.i);

如果你通过相关类型的表达式,它甚至不检查值 - 例如:

test ignored = null;
System.out.println(ignored.i); // Still works! No exception

但仍会评估任何副作用。例如:

// This will still call the constructor, even though the result is ignored.
System.out.println(new test().i);

答案 1 :(得分:2)

字段i声明为static。您可以使用staticYourClass.StaticField访问instance.StaticField字段。

this.i
test.i

指的是test类的实例方法的上下文中的相同值。

使用staticthis.i访问instance.i字段被视为不良做法。

答案 2 :(得分:0)

static是类级变量,非static是实例变量(对象级变量)。所以在这里你只声明静态变量,并以不同的方式调用它们,但意思相同。

this.i
test.i

都被视为类级变量或静态变量。

答案 3 :(得分:0)

你没有在here.only中声明任何实例变量一个静态变量。如果你声明实例变量而没有赋值,那么如果你尝试使用“this”关键字打印该实例变量值,你可以得到默认值0