在java中使用静态变量?

时间:2015-12-25 05:03:23

标签: java

我的意思是我们知道静态成员应该只属于Class,而不是从类创建的任何对象的一部分。但我们也可以通过对象访问静态方法吗?我们可以说getInstaceCount()Class CharStack的静态成员。 例如,我可以在这里创建对象并访问CharStack的静态成员:

CharStack stack1 = new Charstack(10);// declaring object
int count1 = stack1.getinstanceCount();//accessing Static member with the object

所以上面我也可以用对象stack1访问Charstack的静态成员,所以我怀疑静态成员的确切用法是什么,如果它甚至可以通过它的对象访问?同样为什么类的实例变量不能被类访问?

3 个答案:

答案 0 :(得分:8)

对于特定的类实例,static方法没有任何意义。

允许在实例上调用static方法的事实不应该欺骗你:它只是Java语言的设计错误,没有任何意义。

  • static方法没有this引用,因此无法在特定实例上调用它。
  • 另外,static方法不是多态的,所以在任何情况下都不能通过在实例上调用它来利用这个事实

短篇小说:static方法在某些情况下有意义,但你应该总是通过类调用它们,例如CharStakc.getInstanceCount()来澄清它们的预期行为,因为被允许通过它来调用它们实例只是一个不好的选择,不应该被允许

答案 1 :(得分:1)

  

同样为什么Class无法访问实例变量?

假设你有这门课程:

 class Foo{
    public static Bar barStatic;
    public Bar barInstance;
    public static void main(String[] args){
       Foo foo=new Foo();
       Bar barInstance=Foo.barInstance;//case 1
       Bar barStatic=foo.barStatic;// case 2
       .....
    }
 }

现在,在案例1中,您想要访问某个对象的实例变量。但是哪个对象呢? Foo类中的一个,多个或没有对象可能在堆中。但是基于运行时应该选择哪个对象(如果存在的话)。 但是在第2种情况下,即使你说foo.barStatic编译器“足够聪明”就知道foo是Foo的一个实例,并在编译代码时将foo.barStatic解释为Foo.barStatic。我绝对不喜欢这种设计,令人困惑。所以,你应该知道一切都很好,只是在代码设计过程中它并没有抱怨,尽管其他人已经注意到,好的IDE会警告你遵循首选的Foo.barStatic方式。

答案 2 :(得分:0)

静态变量在类加载时仅在类区域中获取内存。 它使您的程序内存效率(即节省内存)。 静态变量可用于引用所有对象的公共属性(对于每个对象而言不是唯一的),例如公司员工姓名,学生姓名等。