更好的阅读体验:Java 封装、继承、多态的理解
1.封装
封装:就是隐藏对象的属性和实现细节,仅对外提供公共访问方式。让使用者知道的才暴露出来,不需要让使用者知道的全部隐藏起来
封装的好处:避免使用者直接操作属性值,隐藏类的实现细节;让使用者只能通过程序员规定的方法来访问数据;可以方便的加入存取控制语句,限制不合理操作,提高程序安全性。
1.1.封装的实现
Java是使用“访问控制符”来控制哪些细节需要封装的,哪些细节需要暴露的。
Java中有4种访问控制符,分别为private,default,protected,public。它们说明了面向对象的封装性,所以我们编写代码的时候,尽可以让访问权限降到最低,从而提高安全性。
访问修饰符作用范围
private
被private修饰的属性和方法,只能在所在类内部访问,不能被其他类访问,子类不能继承也不能访问。
default(缺省)
变量或者方法前没有访问修饰符时,可以被所在类访问,可以被同一包内的其他类访问或者继承。但是不能被其他包访问。
protected
被protected修饰的方法和属性,在同一包内可被访问和继承。不同包内,子类可继承,非子类不能访问。
public
方法和属性前有public修饰,可以被任意包内的类访问。
另外,类要想被其他包导入,必须声明为public。被public修饰的类,类名必须与文件名相同。
2.继承
继承是类与类之间的关系,与现实世界中的继承(例如孩子继承父母基因)类似。
继承可以理解为一个类从另一个类获取方法和属性的过程。
例如:类B继承于类A,那么B就拥有A的部分方法和属性(private修饰或不在同一个包default修饰的无法访问)。
2.1.继承的实现
通过使用关键字 extends 来实现继承。
方法重写(Override)
有继承才有重写,重写就是将父类的方法重新写一遍--重新实现为需要的功能。
只有能继承的方法才可以重写,重写时只能改花括号“{}”里面的内容。
重写的意义是:不同的子类有着差异化的功能实现,是父子类之间的多态性的一种表现。
方法重载(Overload)
重载指的是在同一个类中存在多个具有不同参数个数或者类型的同名方法。
所有方法都可以重载,包括构造方法。
重载的意义是:让类以统一的方式处理不同类型数据的一种手段,是一个类中多态性的一种表现。
2.2.继承的优缺点
优点
- 多态特性,父类引用可以指向多个子类实例对象
- 相互关联,共享特性
缺点
- 父类变,子类就必须变
- 继承破坏了封装,对于父类而言,它的实现细节对与子类来说都是透明的
- 继承是一种强耦合关系
- Java中是单继承,子类只能有一个爸爸,和真实的世界一样你就一个爸爸
如果只是共享特性,那可以使用组合来解决继承(在子类中new 父类,把父类当作是子类的属性来使用)-- 强耦合不具备多态特性
3.多态
多态是同一个行为具有多个不同表现形式或形态的能力。
3.1.多态分类和实现
-
编译时多态(静态多态):方法重载实现的多态
-
运行时多态(动态多态):类继承/接口实现 + 重写 + 向上转型实现的多态
基于继承/接口来实现的多态:面向接口的方式编程为的就是可以使用多态的特性让编程变得更加灵活。
3.2.多态的优点
消除类型之间的耦合关系
- 可替换性
- 可扩充性
- 接口性
- 灵活性
- 简化性
3.3.向上转型
将一个父类的引用指向一个子类的对象,称为向上转型。向上转型是自动完成的。
向上转型后,通过父类引用变量调用的方法是子类覆盖或继承父类的方法,不是父类的方法。但通过父类引用变量无法调用子类特有的方法。
例如:可是使用以下多种引用来指向该对象。
不同的对象指向相同的引用:虽然都是list集合,但有着不同的实现。
查看一下 List、ArrayList和LinkedList 等依赖关系:ArrayList 和 LinkedList 直接和间接都实现了List 接口。
3.4.向下转型
将子类引用指向父类的对象,称为向下转型。向下转型是强制完成的。
向上转型无法使用子类特有的方法,如果非要使用这些特有方法,那么又得向下转型,再使用子类的特有方法。
例如:将List 对象强制转换为ArrayList,需要使用"(ArrayList)"来完成强转。