我的意思是我们知道静态成员应该只属于Class,而不是从类创建的任何对象的一部分。但我们也可以通过对象访问静态方法吗?我们可以说getInstaceCount()
是Class CharStack
的静态成员。
例如,我可以在这里创建对象并访问CharStack的静态成员:
CharStack stack1 = new Charstack(10);// declaring object
int count1 = stack1.getinstanceCount();//accessing Static member with the object
所以上面我也可以用对象stack1访问Charstack的静态成员,所以我怀疑静态成员的确切用法是什么,如果它甚至可以通过它的对象访问?同样为什么类的实例变量不能被类访问?
答案 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)
静态变量在类加载时仅在类区域中获取内存。 它使您的程序内存效率(即节省内存)。 静态变量可用于引用所有对象的公共属性(对于每个对象而言不是唯一的),例如公司员工姓名,学生姓名等。