什么是多态?
- 把学生对象赋值给他的父类类型:
- 多态的表现形式: 父类类型 对象名称 = 子类对象;
- 多态的前提:
- 有继承/实现关系
- 有父类引用指向子类对象 :Person per = new Student();
- 子类中需要对父类的方法进行重写 (可选);
多态的使用场景
- 谁注册,就调用谁的show()方法 --- Admin注册就调用Admin的Show方法;
- 只要Person为该注册用户的父类,那么他就都可以使用这个register()方法,解决了对象不同形参无法书写的问题;
多态调用成员的特点
- 变量调用: 编译看左边,运行也看左边
- 方法调用: 编译看左边,运行看右边
这样来理解:
Fu f = new Zi();
new Zi() : 这个世界上有一个儿子
把子类的对象赋值给父类的类型: 儿子穿上了爸爸的衣服
f.name: 在外人的眼中这个人仍是爸爸
f.show(): 让这个人开始干活
例:通过例子来阐述多态成员的特点:
- 父类如下:
public class Fu {
String name = "Fu";
public void fuShow() {
System.out.println("父类的fuShow被调用了");
}
public void show() {
System.out.println("父类的show被调用了");
}
}
- 子类如下:
public class Zi extends Fu {
String name = "Zi";
public void ziShow() {
System.out.println("子类的ziShow被调用了");
}
@Override
public void show() {
System.out.println("子类的show被调用了");
}
}
- 测试类:
- 展示1:
Fu f = new Zi();
f.name = "Fu";
f.age = 18;//报错 因为没有父类age这个属性,编译看左边,根本过不了编译;
- -展示2:
f.show();//子类的重写show被调用了
f.fuShow();//运行看右边 先去子类的方法里找show(),没有就去父类里面找 找到了输出父类的fuShow()
f.ziShow();//报错,编译看左边 父类没有这个方法,过不了编译
这也是多态的一个弊端
多态的弊端
- 多态下不能使用子类的独有方法;
类型转换
案例如下:
Fu f = new Zi();
Zi zi = (Zi)f;
zi.ziShow()//可以调用,不会报错
注意点: