多肽引入:
class A { public void f() { System.out.printf("AAAA\n"); } } class B extends A { public void f() { // 重写方法的权限不能低于被重写方法的权限 System.out.printf("BBBB\n"); } } public class TestPoly { public static void main(String[] args) { A aa = new A(); B bb = new B(); aa.f(); // => AAAA bb.f(); // => BBBB aa = bb; // 把 bb 当作 aa 看待 因为子类可以当作父类看待,所有本语句OK //bb = aa; //error 把 aa 当作 bb 看 因为父类不能当作子类看待,所有本语句ERROR aa.f(); // 多肽语法 => BBBB } } 一个父类的引用类型变量它既可以指向父类对象也可以指向子类对象,他可以根据当前时刻指向的不同,自动调用不同对象的方法,这就是多肽多肽的优点 利用多肽可以实现:同一段代码做不同事情比如:假设A派生出B,B派生出C,试着编写一个函数实现调用整个A类族所有对象f方法;所谓A类族就是A及其A的子孙类所形成的一个族群多肽的小例子
class A { public void f() { System.out.printf("AAAA\n"); } } class B extends A { public void f() { System.out.printf("BBBB\n"); } } class C extends B { public void f() { System.out.printf("CCCC\n"); } } public class TestPoly { public static void g(A aa) { aa.f(); // 类似C语言 (*aa).f(); } public static void main(String[] args) { A aa = new A(); B bb = new B(); C cc = new C(); g(aa); // => AAAA g(bb); // => BBBB g(cc); // => CCCC } }为什么要把父类对象强制转化成子类对象?