5

Java 约定第 10.2 节建议使用类名而不是对象来使用静态变量或方法,即MyClass.variable1orMyClass.methodName1()代替

MyClass Obj1 = new MyClass();    
Obj1.variable1;
Obj1.methodName1();

没有解释这背后的基本原理,尽管我怀疑这与内存使用有关。如果有人可以解释这一点,那就太好了。

4

6 回答 6

8

我猜你的意思是“用于静态方法和变量”。

内存方面没有区别,当然除非您创建实例只是为了调用该方法。约定不是为了内存效率,而是为了编码器效率,这与代码的可读性直接相关。

理由是通过阅读

MyClass.methodName1()

你知道它是一个静态方法,它不能使用或改变你的Obj1实例。

如果你写

obj1.variable1; // note the "o" instead of "O", please do follow conventions

那么读者必须阅读您的源代码才能知道 variable1 是否是静态的。

于 2012-08-29T09:20:28.057 回答
3

如果您使用对象进行静态变量访问,那么编译器将只替换它Class Name

所以

MyClass Obj1 = new MyClass();    
Obj1.variable1;
Obj1.methodName1();

它与

MyClass.variable1;
MyClass.methodName1();

Now Why to differentiate? Answer is - It is for better reading If someone see method being called on Class then he immediately come to know that it is static method. Also it prevents generation of one additional object to access the method.

于 2012-08-29T09:22:14.950 回答
0

这与public static方法和变量有关。由于这些方法/变量与相应的类而不是类的实例相关联,因此最好将这些方法或变量称为className.methodName()className.variableName

“了解实例和类成员”将是了解使用 static 关键字创建属于类而不是类的实例的字段和方法的一个很好的起点

于 2012-08-29T09:22:57.350 回答
0

只是因为,公共静态方法或公共静态变量不与任何对象相关联,而是与类相关联。尽管语言设计者提供了在对象上调用它们的灵活性,但代码的读者会混淆它们是静态变量/方法还是实例方法/变量。所以可读性是要求开发人员在类上调用它们的原因。

于 2012-08-29T09:28:04.793 回答
0

您可以使用类名表示法或使用对象访问静态成员。不建议使用对象表示法,因为它可能会非常混乱。

public class TheClass {
    public static final staticValue = 10;
    public static void staticMethod() {
        System.out.println("Hello from static method");
    }

    public static void main(String ... args) {
        TheClass obj = null;

        // This is valid
        System.out.println(obj.staticValue);
        // And this too
        System.out.println(obj.staticMethod());

        // And this is also valid
        System.out.println(((TheClass)null).staticValue);
        // And this too
        System.out.println(((TheClass)null).staticMethod());

    }
}

如果使用类名表示法调用静态方法和变量会更清楚。

于 2012-08-29T09:46:23.413 回答
-1

静态变量属于类而不属于对象(实例)。静态变量可以通过类名直接访问,不需要任何对象。它节省了空间,不必为每个类的相同数据设置变量。

Syntax : <class-name>.<variable-name>

public class AA{

 static int a =10;


}

你可以打电话

System.out.println(AA.a);
System.out.println(aObject.a);

两个调用之间没有区别,但保持编码约定以保持更多的可读性

于 2012-08-29T09:22:15.217 回答