- 继承或实现是多态的前提。
- 一个对象拥有多种形态,简称“对象的多态性”。
- 方法才能覆盖重写,成员变量不可覆盖重写。
父类引用指向子类对象,格式:
父类名称 对象名 = new 子类名称();
或者:
接口名称 对象名 = new 实现类名称();
-
多态访问成员变量的两种方式:
- 直接通过对象名称访问成员变量,看等号左边是谁,优先用谁,没有则向上找。
public class Demo{
public static void main(String[] args){
//使用多态
Fu f = new Zi();
//等号左边是Fu,所以显示 35.
System.out.println(f.age);
}
}
public class Zi extends Fu{
int age = 10;
}
public class Fu{
int age = 35;
}
- 间接通过成员方法使用访问,看方法属于哪个类,则优先调用此类,没有则向上找。
public class Demo{
public static void main(String[] args){
//使用多态
Fu f = new Zi();
//子类没有覆盖,show()方法属于Fu, 100.
System.out.println(f.show());
//子类覆盖父类方法,调用子类方法, 50.
System.out.println(f.show());
}
}
public class Zi extends Fu{
int age = 10;
int num = 50;
}
public class Fu{
int age = 35;
int num = 100;
public void show(){
System.out.println(num);
}
}
-
多态访问成员方法:
- 看new的是谁,优先用谁,没有则向上找。
编译看左边,运行看右边。
public static void main(String[] args){
Fu obj = new Zi();
obj.method();//父子都有,优先用右边。
obj.methodFu();//子没有,向上找,用父的。
}
public class Zi extends Fu{
public void method(){
}
}
public class Fu{
public void method(){
}
public void methodFu(){
}
}
编译看左,运行看右。
-
对象的上下转型