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谢谢你的信息,我得到了它