面向对象-多态
代码中多态的使用
代码当中体现多态性,其实就是一句话:父类引用指向子类对象。
格式:
父类名称 对象名 = new 子类名称();
或者:
接口名称 对象名 = new 实现类名称();
public class Demo01Multi {
public static void main(String[] args) {
// 使用多态的写法
// 左侧父类的引用,指向了右侧子类的对象
Fu obj = new Zi();
obj.method();
obj.methodFu();
}
}
多态下访问成员变量
- 父类
public class Fu /*extends Object*/ {
int num = 10;
public void showNum() {
System.out.println(num);
}
public void method() {
System.out.println("父类方法");
}
public void methodFu() {
System.out.println("父类特有方法");
}
}
- 子类
public class Zi extends Fu {
int num = 20;
int age = 16;
@Override
public void showNum() {
System.out.println(num);
}
@Override
public void method() {
System.out.println("子类方法");
}
public void methodZi() {
System.out.println("子类特有方法");
}
}
- Main
public static void main(String[] args) {
// 使用多态的写法,父类引用指向子类对象
Fu obj = new Zi();
System.out.println(obj.num); // 父:10
// System.out.println(obj.age); // 错误写法!
System.out.println("=============");
// 子类没有覆盖重写,就是父:10
// 子类如果覆盖重写,就是子:20
obj.showNum();
}
直接访问
直接通过对象名称访问成员变量:看等号左边是谁,优先用谁,没有则向上找。
Fu obj = new Zi(); // 父类引用对象,子类实例类型
obj.num; // 指向引用对象中的成员变量-> 父:10
间接访问
间接通过成员方法访问成员变量:看该方法属于谁,优先用谁,没有则向上找。
- 父类
public class Fu /*extends Object*/ {
String champion = "lpl";
public void getChampion(){
System.out.println(this.champion);
}
...
}
- 子类
public class Zi extends Fu {
String champion = "lck";
}
- main
Zi ins = new Zi();
ins.getChampion(); // lpl
Fu champion = new Zi();
champion.getChampion(); // lpl
不论引用类型是什么,因为getChampion存在于父类中,所以成员变量num从父类开始找,没有则继续向上找,永远不会向下找。
多态下访问成员方法
- 父类
public class Fu /*extends Object*/ {
public void method() {
System.out.println("父类方法");
}
}
- 子类
public class Zi extends Fu {
@Override
public void method() {
System.out.println("子类方法");
}
}
- main
public static void main(String[] args) {
Fu obj = new Zi(); // 多态
obj.method(); // 父子都有,优先用子
// obj.methodFu(); // 子类没有,父类有,向上找到父类
// 编译看左边,左边是Fu,Fu当中没有methodZi方法,所以编译报错。
// obj.methodZi(); // 错误写法!
}
总结
- 成员变量:编译看左边,运行还看左边。
- 成员方法:编译看左边,运行看右边。