1.方法的重写或方法的覆盖(overriding)
子类根据需求对从父类继承的方法进行重新编写
重写时,可以用 super.方法 的方式来保留父类的方法
构造方法不能被重写
- 方法重写规则
方法名相同
参数列表相同
返回值类型相同或者是其子类
访问权限不能严于父类
父类的静态方法不能被子类覆盖为非静态方法,父类的非静态方法不能被子类覆盖为静态方法
子类可以定义与父类同名的静态方法,以便在子类中隐藏父类的静态方法(注:静态方法中无法使用super)
父类的私有方法不能被子类覆盖
不能抛出比父类方法更多的异常
3.方法重载与方法重写区别
比较项 |
位置 |
方法名 |
参数表 |
返回值 |
访问修饰符 |
方法重写 |
子类 |
相同 |
相同 |
相同或是其子类 |
不能比父类更严格 |
方法重载 |
同类 |
相同 |
不相同 |
无关 |
无关 |
4.多态
类型转换
大类型接收小类型
向上转型:Pet pet=new Dog()父类引用子类方法
abstract 抽象化父类方法,将父类转化为抽象类,写一个抽象方法为空public abstract play();然后在子类中重写方法,最后在使用向上转型可以使父类引用变量调用的方法是子类覆盖或继承父类的方法,不是父类的方法
也可以不进行抽象化。 直接void toHospital(){};在另写一个主人类,在里面写满足条件去医院,测试时向上转型,调用父类引用
向下转型:Dog d=(Dog)pet;将pet 转换为Dog类型,执行子类所特有的方法,父类没有
dog. catchingFlyDisc();//执行Dog特有的方法
转换失败会有异常
如何减少在向下转型的过程中,没有转换为真实子类类型的类型转换异常?
instanceof运算符来进行类型的判断
使用instanceof时,对象的类型必须和instanceof后面的参数所指定的类在继承上有上下级关系
public class Test {
public static void main(String[] args) {
//使用instanceof判断具体宠物类型,调用特定宠物方法
if (pet instanceof Dog) {
Dog dog = (Dog) pet;
dog.catchingFlyDisc();//执行狗狗特有的方法接飞盘
} else if (pet instanceof Penguin) {
Penguin penguin = (Penguin) pet;
penguin.swim();//执行企鹅特有的方法在南极游泳
}
}
}
抽象方法好处:占用内存少,多使用