- 多态的实现基于类的继承和方法的重写,即使用父类变量指向子类对象,编译时调用父类被重写的方法,运行时执行子类重写的方法,因此多态发生在运行时。
- 对于重载,编译器在方法调用之前就确定所要调用的方法,称为静态绑定;对于多态,编译器在方法调用之时才确定所要调用的方法,称为动态绑定。
- 抽象类和接口存在的意义依赖于多态。
- 父类变量不能直接调用子类对象特有的属性和方法,需要先通过强制类型转换将父类变量赋给子类变量,再通过子类变量才能调用子类对象特有的属性和方法。
- 为了避免在向下转型时出现异常,通常先利用关键字instanceof判断父类变量之前指向的是否是对应的子类对象。
public class Polymorphic {
public static void main(String[] args) {
Test1 test12 = new Test2();
Test1 test13 = new Test3();
Test.print(test12);
Test.print(test13);
if (test12 instanceof Test2) {
Test2 test2 = (Test2) test12;
test2.print2();
}
if (test13 instanceof Test3) {
Test3 test3 = (Test3) test13;
test3.print2();
}
}
}
class Test {
public static void print(Test1 test1) {
test1.print1();
}
}
class Test1 {
public void print1() {
System.out.println("Test1.print1");
}
}
class Test2 extends Test1 {
@Override
public void print1() {
System.out.println("Test2.print1");
}
public void print2() {
System.out.println("Test2.print2");
}
}
class Test3 extends Test2 {
@Override
public void print1() {
System.out.println("Test3.print1");
}
@Override
public void print2() {
System.out.println("Test3.print2");
}
}