Java set 方法和static 方法的用途
同一个对象的同一个字段先通过 构造函数 初始化,然后再通过 setter 方法 修改,是完全合法的,这在 Java 中是一个非常常见的操作
构造函数初始化的字段值,setter 方法在对象的生命周期中动态修改字段的值。这种覆盖是预期中的操作
具体示例
public class MyClass {
private int field1; // 字段1
private int field2; // 字段2
// 构造函数初始化字段
public MyClass(int q, int p) {
this.field1 = p;
this.field2 = q;
}
// setter 方法修改字段1
public void setField1(int pp) {
this.field1 = pp;
}
// getter 方法获取字段值
public int getField1() {
return field1;
}
public int getField2() {
return field2;
}
}
外部代码使用:
public class Main {
public static void main(String[] args) {
// 用构造函数初始化字段
MyClass myObject = new MyClass(10, 20);
System.out.println("初始值:field1 = " + myObject.getField1() + ", field2 = " + myObject.getField2());
// 使用 setter 方法修改字段1
myObject.setField1(50);
System.out.println("修改后:field1 = " + myObject.getField1() + ", field2 = " + myObject.getField2());
}
}
运行结果:
初始值:field1 = 20, field2 = 10
修改后:field1 = 50, field2 = 10
用处
-
初始化和动态更新的分离:构造函数用来设置对象创建时的必要值,而 setter 方法用来在后续的程序运行中动态更新值。例如:
创建银行账户时,设置初始余额(构造函数),之后更新余额时,用 setter 方法。用户注册时,可以用默认的用户名或昵称,但允许昵称后期更改。 -
测试时只需要始终用同一个对象。setter 方法允许在测试中灵活修改对象的字段,便于模拟各种场景
private static
方法和 private
实例方法的用处
private static
方法通常用来执行与具体实例无关的通用逻辑,比如工具类中的方法、静态工厂方法等。private
实例方法用于实现需要访问实例状态或其他实例方法的辅助逻辑。
两者共存的必要
-
private
实例方法表明方法需要访问或依赖实例状态。如果只有private static
方法,但某些逻辑需要访问实例变量,也不行。 -
如果只有
private
实例方法,但某些方法不依赖实例,仍然需要创建对象来调用这些方法,这显然是多余的。
特性 | private static 方法 | private 实例方法 |
---|---|---|
所属 | 类本身 | 类的实例 |
调用方式 | ClassName.methodName() | instance.methodName() |
能否访问实例变量 | 否 | 是 |
能否访问静态变量 | 是 | 是 |
常用场景 | 与实例无关的通用逻辑、工具方法 | 与实例状态有关的内部辅助逻辑 |
混合使用场景
以下是 private static
和 private
实例方法在同一类中合理共存的例子:
public class Calculator {
private double result; // 实例变量:存储计算结果
// private static 方法:通用逻辑,与实例无关
private static double add(double a, double b) {
return a + b;
}
private static double multiply(double a, double b) {
return a * b;
}
// private 实例方法:需要访问实例变量
private void storeResult(double value) {
this.result = value;
}
// 公共方法:使用静态和实例方法
public void calculateSum(double a, double b) {
double sum = add(a, b); // 使用 static 方法
storeResult(sum); // 使用实例方法
System.out.println("Stored Sum: " + result);
}
public void calculateProduct(double a, double b) {
double product = multiply(a, b); // 使用 static 方法
storeResult(product); // 使用实例方法
System.out.println("Stored Product: " + result);
}
}
运行示例:
public class Main {
public static void main(String[] args) {
Calculator calc = new Calculator();
calc.calculateSum(10, 20); // 输出:Stored Sum: 30.0
calc.calculateProduct(5, 6); // 输出:Stored Product: 30.0
}
}
- 如果
add
和multiply
是实例方法,我们需要创建一个Calculator
对象才能调用它们,而它们实际上与对象状态无关。 - 假设
Calculator
还有一个字段:指定的你要存储的文件名作为路径,那么你要存储,就必须知道某个实例的this.filename,而storeResult
是静态方法,则不行。
如果缺少构造函数和 set 方法
上一个示例中,没有定义构造函数,也没有定义set
方法。当一个类没有显式定义构造函数时,Java 会提供一个默认的无参构造函数,但它不会初始化实例变量(它们会有默认值)。对于 result
这种 double
类型的变量,它的默认值是 0.0
。只有调用 storeResult()
方法时,result
才会被更新。