我定义了一个对象并声明了一个静态变量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();
}
}
答案 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
。您可以使用static
或YourClass.StaticField
访问instance.StaticField
字段。
this.i
test.i
指的是test
类的实例方法的上下文中的相同值。
使用static
或this.i
访问instance.i
字段被视为不良做法。
答案 2 :(得分:0)
static是类级变量,非static是实例变量(对象级变量)。所以在这里你只声明静态变量,并以不同的方式调用它们,但意思相同。
this.i
test.i
都被视为类级变量或静态变量。
答案 3 :(得分:0)
你没有在here.only中声明任何实例变量一个静态变量。如果你声明实例变量而没有赋值,那么如果你尝试使用“this”关键字打印该实例变量值,你可以得到默认值0