实现方法重写
深入理解继承相关概念
了解Object类
会使用重写实现多态机制
会使用instanceof运算符
会使用向上转型
会使用向下转型
方法的重写或方法的覆盖(overriding)
子类根据需求对从父类继承的方法进行重新编写
重写时,可以用super.方法的方式来保留父类的方法
构造方法不能被重写
方法重写规则
方法名相同
参数列表相同
返回值类型相同或者是其子类
访问权限不能严于父类
父类的静态方法不能被子类覆盖为非静态方法,父类的非静态方法不能被子类覆盖为静态方法
子类可以定义与父类同名的静态方法,以便在子类中隐藏父类的静态方法(注:静态方法中无法使用super) 父类的私有方法不能被子类覆盖
不能抛出比父类方法更多的异常
方法重写vs方法重载
比较项 | 位置 | 方法名 | 参数表 | 返回值 | 访问修饰符 |
方法重写 | 子类 | 相同 | 相同 | 相同或是其子类 | 不能比父类更严格 |
方法重载 | 同类 | 相同 | 不相同 | 无关 | 无关 |
Object类
Object类是所有类的父类(所有的类会直接或者间接的继承object类)
Object类被子类经常重写的方法
方法 | 说明 |
toString() | 返回当前对象本身的有关信息,按字符串对象返回 |
equals() | 比较两个对象是否是同一个对象,是则返回true |
hashCode() | 返回该对象的哈希代码值 |
getClass() | 获取当前对象所属的类信息,返回Class对象 |
多态
为什么使用多态
代码重复,多态可增加代码重用性。
抽象方法与抽象类
抽象方法没有方法体
抽象方法必须在抽象类里
抽象方法必须在子类中被实现,除非子类是抽象类
public abstract class Pet {
public abstract void toHospital();
}
这里就在pet类里有一个抽象方法,此时方法和类都是抽象的。
抽象类里也可以实现普通方法
向上转型
此时通过父类引用变量调用的方法是子类覆盖或继承父类的方法,不是父类的方法
此时通过父类引用变量无法调用子类特有的方法 所以就要用到向下转型
向下转型
在向下转型的过程中,如果没有转换为真实子类类型,会出现类型转换异常
instanceof
用于比较引用对象是否为同一个。
子类 instanceof 父类
使用instanceof时,对象的类型必须和instanceof后面的参数所指定的类在继承上有上下级关系