我有一个变量在名为Example的类中:
private static int number;
如果我想使用外部类赋值给变量,应该怎么做?
1)将Example类中的setter方法设为静态,这样我就可以像这样访问它:
Example.setNumber(3);
2) 或者将setter方法设为非静态,这样我就可以创建Example的对象来设置数字
Example e = new Example()
e.setNumber(3);
这两者之间有什么区别,哪一个更好?
在这种情况下,建议使用静态方法。
为什么呢?如果你将其设置为非静态方法,那么会导致以下惊人的效果:
Example e1 = new Example();
Example e2 = new Example();
e2.setNumber(3);
e1.setNumber(5);
System.out.println(e2.getNumber()); // surprise! prints 5,
所以即使你在 e1 上调用了方法,e2 也会受到影响。相应的静态示例则不那么令人惊讶:
Example e1 = new Example();
Example e2 = new Example();
Example.setNumber(5);
System.out.println(Example.getNumber()); // prints 5, no surprise...
首先,您真的不应该设置静态变量。这很容易引起问题,并且通常表明设计不良。唯一应该使用静态变量的时候是用于线程安全的不可变对象和单例模式。
话虽如此,如果您绝对仍然想要设置值,请将其设置为静态方法,因为您不需要实例化对象就可以设置静态值。
第一个是正确的。当您访问静态方法时,应使用类名而不是对象引用。
number
设置为公共变量。静态变量的设置器如果不依赖于任何实例变量/函数,则也应该是静态的。因此,1)。
但要注意不要创建全局变量!
没有必要创建一个类的实例,只是为了设置其中的静态变量。我会选择方案#1。(虽然我尽量避免使用全局变量,这就是静态变量的作用。)
静态成员变量对于类的所有实例都是相同的。您可以使用静态或常规 setter 来更改它。但在这种情况下,常规 setter 可能会让用户感到困惑:命名约定表示 setter 更改属于特定实例的字段的值。因此,您应该使用第一个版本:Example.setNumber(3)
。
静态变量被声明为静态的,因为它们不与任何特定对象相关联。
这两种方法都可以工作,但前者更明智,因为它不需要创建和使用任意对象。