Java应该以静态方式访问静态字段,但为什么呢?

时间:2015-09-21 22:42:35

标签: java polymorphism

BEHOLD CODE

public class Main {
    static int bob;
    //create a foo
    static Foo foo;
    //cuz why not have a second foo
    static Foo foo2; 
    public static void main (String args){
        foo = new Foo();
        foo2 = new Foo();
        //creating a local variable with foo2's value +5
        bob = foo2.anIntThatWillNeverChageValue+5;
    }
}

Foo的课很简单

public class Foo {
    static int anIntThatWillNeverChageValue =5;

    public Foo(){

    }
}

所以你可能会想“这个代码编译好了,问题是什么?”。好吧,java在线说:

bob = foo2.anIntThatWillNeverChageValue + 5;

中的主要课程

  

应该访问静态字段Foo.anIntThatWillNeverChageValue   以静态的方式

现在我明白这通常是一种很好的做法,只需通过说

来访问Foo的静态类
bob = Foo.anIntThatWillNeverChageValue + 5;

会更好,更有效,更简单。然而,当foo被3个类扩展时,在多态环境中怎么样?我不想只访问基本的Foo变量,我希望我的特定对象的变量。当然,对此的明显解决方案是简单地使变量非静态,但在这种情况下,每次创建Foo的新子项时都要创建一个新变量。静态访问它会不会更有效率?

编辑:

引自Why should the static field be accessed in a static way?

  

解决原因的问题:在Java中,当你将某些东西声明为静态时,你会说它是类的成员,而不是对象(因此只有一个)。

基本上是我所要求的答案。我试图使用静态方法来避免非静态字段的UNECISARY副本。我的问题是询问为什么反对Java约定以多态方式访问静态方法,并且还打算询问可能通常可接受和/或更高效的可能解决方案。

1 个答案:

答案 0 :(得分:0)

如果您希望仅Foo的子类可以访问该变量,那么您应该声明它protected

如果它仅被声明的类使用,则将其设为private

无需实例化类型即可访问静态变量。如果您想通过使用类的实例化类型来访问它,那么您不应该声明变量static