在子类中将父类的方法再重新定义一遍
如果子类从父类继承的方法不能满足子类的需要,或者不适合子类的需要。
此时子类可以将从父类继承的方法重写定义成满足自己需要的方法。
重新定义称为重写。
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();
父类引用可以代表任何其子类对象,代码表现为 Pet pet = new Dog()
或者 Pet pet = new Cat()
父类引用指向哪个子类对象,调用的方法就是哪个子类中的方法。例如:
Pet pet = new Dog();
pet.sound(); //调用Dog的sound方法
pet = new Cat();
pet.sound(); //调用Cat的sound方法
父类引用指向子类对象其实是增强了父类的功能。
多态就是多种形态,多种形式。
多态的实现方法有两种
多态的定义格式:就是父类的引用变量指向子类对象(里氏替换原则)
父类类型 变量名 = new 子类类型();
变量名.方法名();
Pet pet = new Cat();
pet.toString();
父类 变量名 = new 子类();
例如:
class Fu {}
class Zi extends Fu {}
Fu f = new Zi();//类的多态使用
抽象类 变量名 = new 抽象类子类();
例如:
abstract class Fu {
public abstract void method();
}
class Zi extends Fu {
public void method(){
System.out.println(“重写父类抽象方法”);
}
}
Fu fu= new Zi();//类的多态使用
接口 变量名 = 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方法
当变量名指向不同的子类对象时,由于每个子类重写父类方法的内容不同,所以会调用不同的方法。