利用继承可以复用已有的类,并为新的类添加需要的特性(方法和域)。
5.1 类,超类和子类
“is-a”是继承的明显特征,Manager类和Employee之间存在明显的继承关系。定义类的继承使用关键字extends。
C++注释:Java中定义继承使用extends关键字,而在C++中使用冒号“:”,并且Java中所有的继承都是公共的,而C++中还存在私有,保护方式。
定义类时,将通用的方法在超类中定义,特殊的方法在子类中定义。
注:super访问父类的方法,super和this被看作引用,但是super却不同于this,super不能作为引用赋值给一个引用变量,只是表示一个应用父类方法的关键字而已。
C++注释:C++中访问父类方法是使用父类名+::的形式。
super在构造函数中的使用又有不同的含义。因为父类的私有域不能在子类的构造函数中赋值或者初始化,因而需要使用super()对父类的域进行初始化,当要使用这项功能时,必须将super()作为子类构造函数的第一条语句。如果子类没有显示调用父类的构造函数,则默认调用父类的无参构造函数。如果父类没有默认无参的构造函数,又没有在子类中调用其它含参的构造函数,在编译器将给出错误。
C++注释:Java中不需要将方法声明为虚拟方式,动态绑定是默认的处理方式。如果不需要某个方法具有虚拟特征,则将方法标记为final。
5.1.1继承的层次
5.1.6 抽象类
Java中为了提高程序的清晰度,包含一个或者多个抽象方法的类本身必须被声明为抽象的。抽象类中除了包含抽象方法,还是可以包含具体方法和域的。
C++注释:C++中,有一种在尾部用=0标记的抽象方法,被称为纯虚函数。定义纯虚函数的类是抽象类。C++中没有表示抽象类的关键字。
5.2 Object:所有类的超类
5.2.1 Equals方法:默认操作时判断两个对象是否有相同的引用。通常这没什么意义,大多数情况需要自己定义。
5.4 对象包装器与自动打包
所有的基本类型都有一个与之对应的类。这些类称为包装器(Wrapper),这中类是一旦构造就不允许改变其值的,并且这项类都是final的。
list.add(3); 会被自动打包为list.add(new Integer(3));这在C#中成为boxing,装箱。相反的,将Integer类赋值给int变量,会自动解包。
包装器的另一个好处是可以将一些基本方法放在包装器中,入parseInt。
5.7 反射
5.7.1 Class类:程序运行期间,Java运行时为所有对象维护一个称为运行时的的类型标识,所有Object类都有一个getClass()方法用于返回这个Class类型信息。Class类中最常用的方法是getName()用于返回这个类的名称(如果有包的话,也包括包的完成类名)。另外可以调用静态方法forName()获得类名对应的对象。