【问题标题】:static variable vs non static variable静态变量与非静态变量
【发布时间】:2013-09-27 05:18:33
【问题描述】:

我已经定义了一个对象并声明了一个静态变量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();
    }

}

【问题讨论】:

  • static 变量是在类级别而非实例上声明的。对于每个实例,它总是相同的。可以引用为this.VARIABLEType.Variable
  • 顺便说一句,即使对于测试代码,最好遵循命名约定。如果你的班级被称为Test 而不是test,那么发生的事情会更明显。

标签: java


【解决方案1】:

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

不幸的是,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);

【讨论】:

  • 从技术上讲,您不能通过引用访问静态成员。相反,javac 中有一点“语法醋”,它可以让你使用引用变量的 DECLARED TYPE 来引用一个静态变量——变量的值/实际类是无关紧要的(我还没有尝试过,但它可能是可能为空)。
  • @HotLicks:是的,这个值是无关紧要的——但它是通过一个作为参考的表达式。它是那种类型的表达。会编辑,但我认为已经相当清楚了。
  • 感谢您检查那个空的东西!
  • 我最喜欢的例子是Thread.Sleep
  • @Brian:是的,我也是——我在很多地方都用过这个例子:)
【解决方案2】:

字段i 被声明为static。您可以使用YourClass.StaticFieldinstance.StaticField 访问static 字段。所以两者都

this.i
test.i

test 类的实例方法的上下文中引用相同的值。

使用this.iinstance.i 访问static 字段被认为是不好的做法。

【讨论】:

    【解决方案3】:

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

    this.i
    test.i
    

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

    【讨论】:

      【解决方案4】:

      您没有在此处声明任何实例变量。只有一个静态变量。如果您声明实例变量而不分配值,那么如果您尝试使用“this”关键字打印该实例变量值,您可以获得默认值0.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多