Preface:
1、封装
(encapsulation,有时称为数据隐藏)从形式上看,封装将数据和行为组合在一个包中,并对对象的使用者隐藏了数据的实现方式。实现封装的关键在于绝对不能让类中的方法直接地访问其他类的实例域(对象中的数据instance field)。程序仅通过对象的方法与对象数据进行交互。封装给对象赋予了"黑盒"特征,这是提高复用性和可靠性的关键。这意味着一个类可以全面地改变存储数据的方式,只要仍然使用同样的方法操作数据,其他对象就不会知道或介意所发生的变化
2、继承
(inheritance)利用继承,人们可以基于已存在的类构造一个新类。继承已存在的类就是复用(继承)这些类的方法和域。在此基础上,还可以添加一些新的方法和域,以满足新的需求(子类比超类封装了更多数据,拥有更多功能)
3、多态
在Java程序设计语言中,对象变量是多态的。一个 A类 变量既可以引用一个A类对象,也可以引用一个A类的任何一个子类的对象
* "is-a" 规则:
表明子类的每个对象也是超类的对象。例:每个manager都是employee,因此将Manager类设计为Employee类的子类是显而易见的,反之则不然,并非每个employee都是manager
"is-a" 规则的另一种表述法是"置换法则"。它表明程序中出现超类对象的任何地方都可以用子类对象置换[1]
继承
一些性质:
Java所有类都默认继承自Object
实现:class Child extends Parent 关键字extends表明正在构造的新类派生于一个已存在的类
单根性:一个类只能存在一个父类
继承层次(inheritance hierarchy):
由一个公共超类派生出来的所有类的集合被称为继承层次。仔继承层次中,从某个特定的类到其祖先的路径被称为该类的继承链(inheritance chain)
Java不支持多继承。有关Java中多继承功能的实现方式,见于接口部分。
关于parent class 和 child class:
子类的method不能直接访问超类的private fields,只有超类的method才能访问private部分。如果子类的method一定要访问private fields,就必须借助于共有的接口,超类中的公有方法正是这样一个接口(与子类方法重名时使用super.方法名())
super在构造器中的应用,例:
public Manager(String n,double s,int year,int month,int day){
super(n,s,year,month,day);
bonus=0;
}
//这里的关键字super具有不同的含义
语句 super(n,s,year,month,day);
是"调用超类Employee中含有n、s、year、month和day参数的构造器"的简写形式
由于Manager类的构造器不能访问Empliyee类的私有域,必须利用Employee类的构造器对这部分私有域进行初始化,可以通过super实现对超类构造器的调用。使用super调用构造器的语句必须是子类构造器的第一条语句
如果子类的构造器没有显式地调用超类的构造器,则将自动调用超类默认(无参)的构造器。如果超类没有无参constructor,并且子类的构造器中又没有显式调用超类的其他构造器,Java编译器将报告错误
* this与super:
关键字this用途:1、引用隐式参数 2、调用该类其他构造器
关键字super用途:1、调用超类的method 2、调用超类的构造器
调用构造器的语句只能作为另一个构造器的第一条语句出现,构造参数既可以传递给本类(this)的其他构造器,也可以传递给超类(super)的构造器