一、方法重写(override)
1. 什么是方法重写:
在子类中将父类的方法再重新定义一遍
如果子类从父类继承的方法不能满足子类的需要,或者不适合子类的需要。
此时子类可以将从父类继承的方法重写定义成满足自己需要的方法。
重新定义称为重写。
2. 方法重写的注意事项
- 方法重写时,方法的返回值类型 方法名 参数列表都要与父类一样。(同名,同参,同返回)
- 子类方法覆盖父类方法,必须要保证权限大于等于父类权限。
class Fu(){
void show(){}
public void method(){}
}
class Zi() extends Fu{
public void show(){} //扩大show的访问权限,编译运行没问题
void method(){} //缩小method的访问权限,编译错误
}
- 方法的返回值类型 方法名 参数列表都要一样。
二、里氏替换原则
父类引用指向子类实例
里氏替换是指用子类实例替换父类实例,这种替换叫做里氏替换
Pet pet = new Pet();
Pet pet = new Dog();
2.1 父类引用指向子类对象的结论:
-
父类引用可以代表任何其子类对象,代码表现为
Pet pet = new Dog()
或者Pet pet = new Cat()
-
父类引用指向哪个子类对象,调用的方法就是哪个子类中的方法。例如:
Pet pet = new Dog(); pet.sound(); //调用Dog的sound方法 pet = new Cat(); pet.sound(); //调用Cat的sound方法
-
父类引用指向子类对象其实是增强了父类的功能。
2.2 里氏替换中的调用规则
- 父类引用只能调用子类从父类继承的方法。
- 当子类重写父类方法后,父类引用调用的是子类重写的方法,否则调用子类从父类继承的方法。
三、多态
3.1 什么是多态
多态就是多种形态,多种形式。
多态的实现方法有两种
- 方法重写(公认的多态)
- 方法重载(非公认的多态)
3.2 多态的语法格式
多态的定义格式:就是父类的引用变量指向子类对象(里氏替换原则)
父类类型 变量名 = new 子类类型();
变量名.方法名();
Pet pet = new Cat();
pet.toString();
3.3 多态的实现(方法重写)
3.3.1 普通类实现多态
- 普通类多态定义的格式
父类 变量名 = new 子类();
例如:
class Fu {}
class Zi extends Fu {}
Fu f = new Zi();//类的多态使用
3.3.2 抽象类实现多态
- 抽象类多态定义的格式
抽象类 变量名 = new 抽象类子类();
例如:
abstract class Fu {
public abstract void method();
}
class Zi extends Fu {
public void method(){
System.out.println(“重写父类抽象方法”);
}
}
Fu fu= new Zi();//类的多态使用
3.3.3 接口实现多态
- 接口多态定义的格式
接口 变量名 = new 接口实现类();
例如:
interface Fu {
public abstract void method();
}
class Zi implements Fu {
public void method(){
System.out.println(“重写接口抽象方法”);
}
}
Fu fu = new Zi();//接口的多态使用
- 注意事项
同一个父类的方法会被不同的子类重写。父类引用在调用方法时,调用的为各个子类重写后的方法。
Person p1 = new Student();
Person p2 = new Teacher();
p1.work(); //p1会调用Student类中重写的work方法
p2.work(); //p2会调用Teacher类中重写的work方法
当变量名指向不同的子类对象时,由于每个子类重写父类方法的内容不同,所以会调用不同的方法。
【信息由网络或者个人提供,如有涉及版权请联系COOY资源网邮箱处理】
© 版权声明
部分内容为互联网分享,若有侵权请联系站长删除。
THE END
暂无评论内容