面向对象三大特征:封装、继承、多态
public class Dog {
String name; //名字
String kind; //品种
public void bark(){ //发出叫声方法
System.out.println(kind + name +"在汪汪叫");
}
}
比如我们要使用发出叫声方法,需要使用到name,和kind成员变量,所以我们应该把它们都放到Dog类中
显然,平常写类都是这麽写的,那么封装性还有什麽值得注意的点呢?当然有,那就是↓
在我们平常设计类的时候,其实是有?一个封装的设计规范的,其核心思想为下面八个字:
合理隐藏,合理暴露
那么什麽是合理隐藏、合理暴露呢?
我们平常在设计类对象时,一般是会有多个成员变量和多个成员方法的,对于这些成员,一个好的对象设计,应该是合理安全的暴露,而对于那些不该暴露的,我们应该统统隐藏起来
举个比喻:计算机
我们知道,计算机是由软件和硬件组成的,而在硬件和软件中其实暴露给我们的都只是一部分,比如我们平常要使用的外设:键盘鼠标开机按钮之类,像存储器、处理器这些都是集成在主板上,用铁皮盒子(机箱)包起来的
我们在设计类时也应该是这样的,不应该随便把类的成员变量全部暴露给别人,这样既不安全也徒增烦恼
举个栗子,有一个学生类长这样:
public class Student {
double score;
public void result(){
System.out.println(this.score > 60 ? "及格" : "不及格");
}
}
那么在这个类中,score成员变量应该暴露还是隐藏呢?
明显我们是要使用score类,所以是要给它赋值的,应该暴露,但是出于防止有人乱赋不合法的值,我们又应该隐藏,那我们到底应该怎么办呢?
怎麽才能做到可以赋值又防止瞎赋值呢?
其实很简单,我们首先把这个变量隐藏,然后设计公开的方法去赋值和获得它就好了,如果要想控制不让随便赋值,就在对应方法里面加限制语句就ok了
比如:
public class Student {
private double Score;
public void setScore(double score){
if(score >= 0 && score <= 120)
this.Score = score;
else
System.out.println("请输入正确的分数!");
}
public double getScore(){
return this.Score;
}
public void result(){
System.out.println(this.Score > 60 ? "及格" : "不及格");
}
}
然后再去赋值就不用怕乱赋值了,在保护数据的同时不影响赋值取值:
public class Test {
public static void main(String[] args) {
Student s = new Student();
s.setScore(100);
System.out.println(s.getScore());
s.result();
}
}
怎样做到合理隐藏,合理暴露?
一句话总结:将所有的成员变量隐藏起来,然后设计对应的赋值取值方法暴露给外界访问,这样就可以做到合理隐藏,合理暴露
那关于方法的隐藏和暴露呢?
也很简单,只需要看方法需不需要供外界使用,需要的话就公开,不需要的话就隐藏,像上面的result方法显然就是需要供外界访问的,所以应该设置为公开