大家好,又见面了,我是全栈君。
一、由一个问题开始
在进行面向对象开发中,在编写一个Class的时候,会定义这个Class的属性(字段)为Private,然后去生成对应的get和set方法,通过这样的方式去对属性进行操作,那你有没有思考过为什么要这样做呢?这样做有哪些好处呢?
请先自行思考30秒,在看下面的内容。
二、回顾相关知识
回答这个问题之前,让我们先回顾一些的基础知识:
1、访问修饰符
,从访问的范围由小及大依次是:private < default(默认)< protected < public ,通过访问修饰符 来控制和改变所修饰对象的可访问范围。
名称 | 说明 | 备注 |
---|---|---|
public | 可以被任何类访问 | |
protected | 可以被所有子类访问,可以被同一包中的所有类访问 | 子类没有在同一包中也可以访问 |
private | 只能够被当前类的方法访问 | |
缺省无访问修饰符 | 可以被同一包中的所有类访问 | 如果子类没有在同一个包中,也不能访问 |
由表格可知,设置成 private
只能够被当前类访问, 因为其他类不能够访问这个类中private
定义的属性,也就不能进行更改操作。那么可以说这个属性是 :安全的。
但是很多时候,一个类中的属性是需要被其他类所使用(获取值/修改值)的,那么其他类要使用这个类中私有属性,当前类就必须提供可供外部类使用的方法,如公共的public
的方法,此时外部的其他来就可以通过提供的方法来操作私有的属性了。
上面这两段说明了问题中 为什么要这样做的第一个答案:隐藏内部实现细节,保证代码的安全,同时也可以提升数据的安全性。
举例说明:如果一个Person类有一个属性为age,假定 age 的范围是 0 -150 岁,如果你将age定义为public
那么任何类都可以进行访问,并修改age的值,此时age的值就是不安全的。使用private
并提供get、set, 我们可以在修改age的 set方法中进行判断,如果age值不在 0—150之间,那么不容许对age进行修改的。其他类也只能通过get这唯一渠道去获取age的值。(又如:学生的成绩score 在 0-100之间,等等的例子)
用get()与set()可以控制变量
setAge(int age){
if(age<1||age>150)
throw new Exception(" 年龄不合法");
}else{
this.age=age;
}
2、继承
:继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
说白了继承就是免费使用父类的特征和行为,实现代码的复用。这和我们问题有什么关系呢? 请看下面的代码例子,你会发现一点什么的。
- Person 人
setAge(int age){
if(age<1||age>150)
throw new Exception(" 年龄不合法");
}else{
this.age=age;
}
- AlienPerson extends Person 外星人
setAge(int age){
if(age<1||age>500)
throw new Exception(" 年龄不合法");
}else{
this.age=age;
}
三、总结
1、隐藏内部实现细节,保证代码的安全,同时也可以提升数据的安全性。
- 使用类的人不关心你的类中有什么,只关心类提供了什么功能
- 所以设计类的时候要尽量不提供public的成员变量,最好一个都没有,只提供接口
- 提供类的人要尽量将类中有什么隐藏起来,只告诉使用者你能做什么
2、在继承的时候,更灵活的数据管理 。
3、by the way:目前我们使用的一些开源的框架,是必须要求你实现get和set的,否则会出错的。也可以称为是规范或者是框架设计要求。
四、参考
关于面向对象编程中很多人用get()和set()方法,而不用public的一点总结
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/121047.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...