JAVA:使用类名和实例对象的静态方法调用之间的区别
我对调用静态方法有点困惑,无论如何我都知道这种规则JAVA:使用类名和实例对象的静态方法调用之间的区别,java,static,Java,Static,我对调用静态方法有点困惑,无论如何我都知道这种规则 Foo.staticMethod(); //accessing static method. 对于非静态方法,我们必须实例化该类 Foo person1 = new Foo(); //instantiating person1.nonStaticMethod(); //accessing non-static method. 所以我们知道静态方法在类中是已知的,所以当我们在对象引用中调用它时,不会给出se
Foo.staticMethod(); //accessing static method.
对于非静态方法,我们必须实例化该类
Foo person1 = new Foo(); //instantiating
person1.nonStaticMethod(); //accessing non-static method.
所以我们知道静态方法在类中是已知的,所以当我们在对象引用中调用它时,不会给出sens,如中所示
它说:
Note: You can also refer to static methods with an object reference like
instanceName.methodName(args)
but this is discouraged because it does not make it clear that they are class methods.
最后,我的问题如下:
public class Foo{
static int x = 10;
public static void method(){
System.out.println("ANYTHING TO SHOW !!!!");
}
public static void main(String[] args) {
Foo object = new Foo();
object.method(); // ANYTHING TO SHOW !!!!
Foo.method(); // ANYTHING TO SHOW !!!!
System.out.println(object.x); // Will display as result 10
System.out.println(Foo.x); //Also this will display as result 10
}
}
那么为什么文档中提到静态字段/方法不再使用object ref,而给出了相同的结果呢
注:
我知道static关键字的用法,它给内存提供平滑的ref,每个变量在被调用时声明一次
附加到静态关键字,我也很清楚,静态关键字
在处理继承时,用于隐藏方法以避免重写。
所以这些没有包括在我的问题中
按照惯例
- 如果看到
,他们会假定object.method()
是一个实例方法,需要使用method()
的实例Foo
- 如果看到
,他们就会知道Foo.method()
是一个静态方法,不需要使用method()
的实例Foo
- 如果看到
,他们会假定object.method()
是一个实例方法,需要使用method()
的实例Foo
- 如果看到
,他们就会知道Foo.method()
是一个静态方法,不需要使用method()
的实例Foo
记住:静态方法不需要实例。如果您发现自己需要该方法的实例,那么可能需要重新考虑其设计。因为局部变量x是静态的。如果它是私有的,Foo.x将无法工作,并将返回一个错误。可以使用ClassName.staticThing或instance.staticThing调用静态方法、变量等。因为变量x是静态的,所以object.x和Foo.x都可以调用它。如果x是一个私有变量,Foo.x将不起作用。因为局部变量x是静态的。如果它是私有的,Foo.x将无法工作,并将返回一个错误。可以使用ClassName.staticThing或instance.staticThing调用静态方法、变量等。因为变量x是静态的,所以object.x和Foo.x都可以调用它。如果x是一个私有变量,那么Foo.x就不起作用。这里的问题是什么?是的,这是预期的行为,只是不鼓励使用编码样式。“静态字段/方法不再具有对象引用”只是意味着对象不拥有该变量x。它不是实例变量,也不是作为对象实例创建的一部分进行初始化。它是在类加载时初始化的,并存储在Prem Gen.@maytham-ɥɥʇʎɐɯ:不,这不是一个合适的副本。是的,这两者之间有区别,但这并不是问静态方法和实例方法之间的区别,因为问题中唯一的方法是静态的。@makoto我知道了,谢谢你的信息这里的问题是什么?是的,这是预期的行为,只是不鼓励使用编码样式。“静态字段/方法不再具有对象引用”只是意味着对象不拥有该变量x。它不是实例变量,也不是作为对象实例创建的一部分进行初始化。它是在类加载时初始化的,并存储在Prem Gen.@maytham-ɥɥʇʎɐɯ:不,这不是一个合适的副本。是的,这两者之间有区别,但这并不是在问静态方法和实例方法之间的区别,因为问题中唯一的方法是静态的。@makoto谢谢你的信息,我得到了它