JAVA的三大特性
众所周知,java的三大特性为:封装,继承和多态。
一、 封装
1. 封装就是将类的信息隐藏在类内部,不允许外部程序直接访问,而是通过该类的方法实现对隐藏信息的操作和访问。
2. 封装是怎么实现的呢?
a. 需要修改属性的访问控制符(修改为private);
b. 创建getter/setter方法(用于属性的读写);
c. 在getter/setter方法中加入属性控制语句(用于判断属性值的合法性);
public class Student { private String id; private int score; public String getId() { return id; } public void setId(String id) { this.id = id; } public int getScore() { return score; } public void setScore(int score) { this.score = score; } }
封装不是简单地将类的属性进行封装,还可以对方法进行封装。
说道这里,我就一直很奇怪为什么要封装,封装的好处是什么。
至于为什么需要封装,因为面向对象中所有的实体都是以对象为基本单位的,以宏观世界的实体来映射到计算机世界中,每个对象有它自己的属性和自己的行为,我们用类来将这些属性和行为封装到一起,当它实例化出来一个对象的时候,我们可以说这个对象具有这些属性和行为。不同类别的对象正是因为这些特性的不同,我们才可以将它们区分开,而这也正反映了我们现实生活中不同种类个体的不同。
举个例子,比如现在有一个Int类型的数据a,它的初始值为0,通过这个变量可以表达出学生的考试成绩。但是仅仅只能表达出学生的成绩为0分,不能表达出学生缺考的情况。但是如果我们现在成绩的类型变为Integer ,那么就不一样了,现在有一个Integer类型的数据b,它的初始值为null,通过null和0我们就能区分出来学生是0分还是缺考的两种不同状态。显然这就是分装的好处,能够更好地模拟现实情况。
二、 继承
继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力,允许连续继承。
java继承的特性:
(1)继承关系是传递的。继承是在一些比较一般的类的基础上构造、建立和扩充新类的最有效的手段。
(2)继承简化了人们对事物的认识和描述,能清晰体现相关类间的层次结构关系。
(3)继承提供了软件复用功能,能减小代码和数据的冗余度,大大增加程序的重用性。
(4)继承通过增强一致性来减少模块间的接口和界面,大大增加了程序的易维护性。
class Person { public Person() { //person的属性 } } class Man extends Person { public Man() { //man的属性 } } class Woman extends Person { public Woman () { //woman 的属性 } }
如上可以看出,Person类有Man和Woman的共同属性,但是Man和Woman又有不同的属性,这样既方便了代码的书写有增强了代码的可读性。继承就是当写一个类时,虽然这个类满足了某些功能但是又想拓展它的功能,此时就可以使用继承机制在写一个该类的子类,来完成需要的功能,一旦子类继承了父类就拥有了父类的方法与域(除私有方法和私有域),在子类中也可以重写父类的方法,覆盖父类中同名的方法,定义与父类相同的域,隐藏父类同名的域,实现子类需要的功能。继承的优点是提高了代码的效率,避免了代码重写。
三、 多态
多态指的是对象的多种形态。多态有两种:引用多态和方法多态。从一定角度来看,封装和继承几乎都是为多态而准备的。
多态是指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式(发送消息就是函数调用)。
它的作用是去耦合。
多态存在的三个必要条件:1,要有继承;2,要有重写;3,父类引用指向子类对象。
Java中多态的实现方式:接口实现,继承父类进行方法重写,同一个类中进行方法重载。
public class Person { public void haircut() { System.err.println("我要剪发!"); } }
public class Man extends Person { public void haircut() { System.err.println("我要剪短发!"); } }
public class Woman extends Person { public void haircut () { System.err.println("我要剪长发!"); } }
如上的方法,同样是剪发,man和woman都是继承自person,并且重写了haircut()方法。