因为经常将Java和C++面向对象编程的原则搞乱,所以这次把相关要点分别总结一下,本文主要总结Java面向对象编程。
面向对象编程的三大特性是:继承性(inheritance), 多态性(polymorphism)和封装性(encapsulation)。
一. 继承性
[类修饰词列表] class 类名 [extends 父类名] [implements 借口列表名] { 类体 }
class Employee { public int workYear; public Employee() { workYear = 1; } } class Teacher extends Employee { public int classHour; public Teacher() { classHour = 10; } }
- 每个类有且仅有一个直接父类,但可以实现多个接口
- 当前定义的类的构造方法必须在其第一句调用其直接父类的构造方法,格式为:
super(参数列表);
如果程序员没有进行显式调用,则JVM会自动隐式调用不带任何参数的父类构造方法,即:super() - 子类和父类之间可以进行类型转换
(1) 将子类型数据转换为父类型数据可以直接采用隐式类型转换
(2) 将父类型数据转换为子类型数据需要采用强制类型转换,且要保证运行时的正确性。// correct Teacher tom = new Teacher(); Employee a = tom; Teacher b = (Teacher) a; // runtime error Employee a = new Employee(); Teacher b = (Teacher) a;
- 可以用instanceof 来判断一个对象是不是某个类的实例对象。
Teacher a = new Teacher(); Employee b = new Employee(); Employee c = a; System.out.println((b instanceof Teacher)); // false System.out.println((c instanceof Employee)); // true System.out.println((c instanceof Teacher)); // true
二. 多态性
静态多态性
静态多态性是指在同一个类中同名方法在功能上的重载(overload)。
动态多态性
动态多态性是指子类的成员方法对其父类相同声明的成员方法的覆盖(override),这里的“相同声明”指的是除了方法修饰词外完全相同。利用动态多态性可以通过父类型的引用调用子类型的方法。
class Employee { public int workYear; public Employee() { workYear = 1; } public printInfo() { System.out.println("This employee has worked for " + workYear + " years."); } } class Teacher extends Employee { public int classHour; public Teacher() { classHour = 10; } public printInfo() { System.out.println("This employee has worked for " + workYear + " years."); System.out.println("This teacher has worked for " + classHour + " hours."); } } public class Main { public static void main(String[] args) { Employee a = new Teacher(); a.printInfo(); } }
- 在子类中定义与父类中同名的成员域不仅与多态性没有关系,而且不提倡
- 可以用super关键字调用父类中被屏蔽的成员方法和成员域,即:super.xxx
- 动态多态性只针对非静态的成员方法,即静态成员方法不具有动态多态性:当在子类和父类的类体中定义了具有完全相同声明的静态成员方法,且类型为父类的变量a指向子类的实例对象时,通过变量a调用该静态成员方法将调用在父类类体中定义的静态成员方法。
三. 封装性
这里主要需要搞清楚类成员的访问控制模式及对应的访问范围,如下表:
* 上述图片来自《Java程序设计教程》 第2版,雍俊海编著
至此,Java中面向对象的三大特性讨论完毕,下一篇博客将会讨论抽象类、接口和内部类等内容。