面向对象三大特征:封装、继承、多态
什麽是封装?
- 就是用类设计对象处理某一个事务的数据时,应该把要处理的数据,以及处理这些数据的方法,设计到一个对象中去
用通俗一点的话来说就是设计对象时应该把要使用到的数据和使用这些数据的方法都写到对象中,比如: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;elseSystem.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方法显然就是需要供外界访问的,所以应该设置为公开