多态是某一事物在不同时刻表现出的不同状态。
多态的好处:
- 1. 消除类型之间的耦合关系
- 2. 可替换性
- 3. 可扩充性
- 4. 接口性
- 5. 灵活性
- 6. 简化性
package cn.itcast.duotai;
class Fu{
public int num1 = 100;
public void show(){
System.out.println("fu show");
}
public static void function() {
System.out.println("fu function");
}
}
class Zi extends Fu{
public int num1 = 1000;
public void show() {
// TODO Auto-generated method stub
System.out.println("zi show");
}
public static void function() {
System.out.println("zi function");
}
}
public class Test {
public static void main(String[] args) {
Fu f = new Zi();
System.out.println(f.num1);
f.show();
f.function();
}
}
结果是
100
zi show
fu function
结论:
A:成员变量
编译看左边,运行看左边(因为变量已经被赋值,所以不能再改变了)。
B:构造方法
创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化。
C:成员方法
编译看左边,运行看右边(右边的子类把父类的方法重写了)。
D:静态方法
编译看左边,运行看左边 (静态算不上重写方法,它是和类相关,所以,访问还是左边的)
注意:这时调用method方法会报错
原因:
编译看左边,但左边的Fu没有method(),所以编译失败。这就是多态的弊端:不能访问子类特有方法。
解决方法:
1. 再new一个子,用子调用method方法
public class Test {
public static void main(String[] args) {
Fu f = new Zi();
Zi z = new Zi();
z.method();
}
这种方法一般不用,因为还要创建子类对象,占内存。
2.向下转型(把父的引用赋值给子的引用)
public class Test {
public static void main(String[] args) {
Fu f = new Zi();
Zi z = (Zi)f;
z.method();
}
引申:
向上转型:Fu f = new Zi()
向下转型:Zi z = (Zi)f