Java封装类get方法无法返回set设置的属性值问题
问题产生原因
- 所有自定义get方法的设计完全违背Java封装的标准实现逻辑,存在两个核心错误:
- 错误为get方法定义了同名入参:按照Java封装的规范,get方法的作用是读取对象内部的私有属性,不需要接收任何外部入参;你写的带参get方法在调用时如果不传入对应类型的参数,代码甚至无法通过编译。
- get方法内部逻辑完全错位:你在每个get方法里都写了
this.xxx = 入参值的赋值逻辑,把set方法的赋值逻辑搬到了get方法里,最后还直接返回外部传入的参数值,全程没有读取对象内部存储的私有属性。
- 原代码中main方法使用无参方式调用get方法的写法,因为方法签名不匹配根本无法通过Java编译器校验,不存在正常运行返回值的可能;就算强行调整调用方式传入参数,返回值也只会是调用时传入的临时值,和之前set方法写入的属性完全无关,自然拿不到预期的"Evander O A"这类预设值。
修复实现
调整规则
按照Java封装的通用规范调整方法逻辑:
- set方法保留现有逻辑:接收入参,将入参赋值给当前对象的私有属性,无返回值
- get方法移除所有入参,删除方法内部的赋值逻辑,直接返回当前对象对应的私有属性值即可
修复后完整代码
// 封装属性类 public class OOP_10_Encapsulation { private String firstName; private String favFood; private int age; private float weight; // firstName的set方法 public void setFirstName(String firstName){ this.firstName = firstName; } // firstName的get方法 public String getFirstName(){ return firstName; } // favFood的set方法 public void setFavFood(String favFood){ this.favFood = favFood; } // favFood的get方法 public String getFavFood(){ return favFood; } // age的set方法 public void setAge(int age){ this.age = age; } // age的get方法 public int getAge(){ return age; } // weight的set方法 public void setWeight(float weight){ this.weight = weight; } // weight的get方法 public float getWeight(){ return weight; } } // 测试类 public class OOP_11_TestEncapsulation { public static void main(String[] args) { OOP_10_Encapsulation learner1 = new OOP_10_Encapsulation(); learner1.setFirstName("Evander O A"); learner1.setAge(31); learner1.setWeight(98.6F); learner1.setFavFood("waakye"); // 修复后调用get方法会正常返回set写入的属性值 System.out.println("Hi, my name is " + learner1.getFirstName()); } }
运行以上修复后的代码,控制台会正常输出Hi, my name is Evander O A,所有get方法都可以正确返回之前set方法写入的属性值。
内容的提问来源于stack exchange,提问作者NanaBoakye
相关产品推荐
相关产品推荐

