由于常常将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();
}
}
在子类中定义与父类中同名的成员域不仅与多态性没有关系。并且不提倡
能够用superkeyword调用父类中被屏蔽的成员方法和成员域,即:super.xxx
动态多态性仅仅针对非静态的成员方法,即静态成员方法不具有动态多态性:当在子类和父类的类体中定义了具有全然同样声明的静态成员方法。且类型为父类的变量a指向子类的实例对象时,通过变量a调用该静态成员方法将调用在父类类体中定义的静态成员方法。
三. 封装性
这里主要须要搞清楚类成员的訪问控制模式及相应的訪问范围,例如以下表:
* 上述图片来自《Java程序设计教程》 第2版。雍俊海编著
至此,Java中面向对象的三大特性讨论完成,下一篇博客将会讨论抽象类、接口和内部类等内容。