3.1 类的继承
3.1.1 相关概念
- 基类(base class)
- 也称超类(super class)或父类(parent class),是被直接或间接继承 的类
- 派生类(derived-class)
- 也称子类 (sub class),是继承自其他类而得到的类
- 继承所有父类的属性和行为,也可以增加变量和方法,也可以覆盖 (override)继承的方法
3.1.2 继承的特点
- 通过继承,新类拥有已有类的所有功能
- Java只支持类的单继承,即每个子类只能有一个直接父类
- 继承机制可以提高程序的抽象程度,提高代码的可重用性
3.1.3 Object类
- 如果一个类的声明中没有使用extends关键字,则系统默认其为Object类的子类
- Java中所有类的直接或间接父类,处在类层次最高点
- public final Class getClass() : 获取当前对象所属的类信息,返回Class对象
- public String toString() : 返回当前对象本身的有关信息,按字符串对象返回
- public boolean equals(Object obj):? 比较两个对象是否是同一对象,是则返回true
3.1.3.1 getClass 和 toString
package test;public class test {public static void main(String args[]){Hello h= new Hello();System.out.println(h); //test.Hello@15db9742System.out.println(h.getClass()); //class test.HelloSystem.out.println(h.toString()); //test.Hello@15db9742Class classh=h.getClass();System.out.println(classh.getName());//test.HelloSystem.out.println(classh.getSuperclass().toString());//class java.lang.Object}
}
3.1.3.2 equals
同一和相等
- 两个对象具有相同的类型及相同的成员值,则称二者相等(equal)
- 两个引用类型的变量引用的是同一个对象,则称这两个变量同一(identical)
- 同一一定相等,相等不一定同一
- Object类中的 equals() 方法的定义如下:
public boolean equals(Object x) { return this == x; }
equals 重写
- ·
- String类中已经重写了Object类的equals方法,可以判别两个字符串是否内容相同
人物 a = new 人物(); 人物 b = new 人物(); a.equals(b);//b由人物类强制转换到Object类
3.1.4 隐藏和覆盖
隐藏
- 成员变量只能隐藏
- 静态(static)只能隐藏,不能覆盖,毕竟是类变量嘛
- 子类对象不仅拥有子类重定义的成员变量,而且还拥有父类原有的同名成员变量,只是这些成员变量感觉上被“隐藏”了。
覆盖
- 针对方法而言
- 对于覆盖,子类对象只拥有覆盖后的成员方法
- 无论隐藏或覆盖,都可以使用“super”去访问父类的成员变量或方法。
隐藏成员的访问
覆盖方法的访问
覆盖父类的方法时,不可以降低方法的访问权限
构造方法中的继承问题
3.2 对象的上转型对象
3.2.1 定义
上转型——用父类声明的对象指向子类创建的实体,此时称为“上 转型”操作,而父类对象是子类对象的“上转型”对象。
父类 a; 子类 b = new 子类(); a = b; //a是b的上转型对象
下转型——与上转型相反
3.2.2 对象类型与“类型转换”
上转型:隐式类型转换——只要类A是类B的直接/间接父类
下转型:显示类型转换——必须确保父类对象指向是子类的实体,且要进行显式类型转换
强调:
- 如果子类覆盖了父类的某个方法,那么上转型对象调用这个方法时, 一定是调用了这个重写的方法
- 由于静态方法只能被隐藏,因此访问父类的静态方法时不受限制
***final成员变量的应用
- 可以结合static定义一些程序中能直接使用的常量
public static final PI = 3.141592653589793;
良好的编程习惯不提倡过多的使用static
***instanceof 运算符
3.3 多态性
方法的多态性:方法的重载
继承的多态性:应用上转型对象调用子类覆盖的方法,从而产生不同的行为
3.4 abstract类和abstract方法
用abstract修饰的类
abstract class A { abstract int min(int x,int y); }
特点
- 抽象类可包含普通类所具有的任何成员,例如:构造方法,非abstract方法
- 与普通类不同的是,抽象类可以有抽象方法(abstract方法), 并且对于抽象 方法,只允许声明,不允许实现
- 抽象类是没有具体实例对象的类,不能使用new方法进行实例化; 要想使用抽象类,必须创建该类的子类,并且实现其中的抽象方 法(覆盖) ,然后使用子类的对象。也正因为如此,抽象类和抽象方法不能用final修饰。
应用
- 抽象类是对一系列子类的高层抽象,描述了这些类的公共属性和行为
- 如果这些类都具有同一种行为,但行为的具体实施内容不同,那么可以在抽象类中将其定义为抽象方法,这样就强制子类必须给出这些方法的具体实现
Attention
- 一个抽象类的子类如果不是抽象类,则它必须覆盖父类中的所有抽象方法
- 只有抽象类才能具有抽象方法,即:如果一个类中含有抽象方法, 则必须将这个类声明为抽象类
- 抽象类中也可以包含非抽象方法
- 抽象类中也可以没有抽象方法
3.5 super关键字
- super代表“父类”
- super可以在子类的构造方法中调用父类的构造方法
- super可以在子类的方法中调用被隐藏的父类成员或者方法