Java学习 -- 多肽

    xiaoxiao2023-10-02  151

    多肽

    多肽引入:

    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 } }

    多肽注意事项(难点)

    子类对象可以直接赋给父类引用,但父类对象在任何情况下都不可以直接赋给子类引用,因为子类是父类的一种,但父类不是子类的一种,或者讲“子类可以当作父类看待,但父类不可以当作子类看待”,“狗可以当作动物看待,但动物不可以当作狗来看待”通过父类引用只能访问子类对象从父类继承过来的成员通过父类引用不能访问子类对象所特有的成员父类引用永远不可能直接赋给子类引用 只有在父类引用本身指向的就是一个子类对象时,才可以把父类引用强制转化为子类引用其他情况下不允许把父类引用强制转化为子类引用,否则运行时会出现错误。 class A { } class B extends A { } public class TestPoly { public static void main(String[] args) { A aa = new A(); B bb = new B(); // bb = aa; // error // bb = (B)aa; // error 编译时没错,但运行时出错!因为不能把aa父类赋给子类bb A aa2 = new B(); //bb = aa2; // error 永远不可以把父类引用直接赋给子类引用 bb = (B)aa2; //OK 因为aa2 本身指向的就是一个B类对象 所有可以 } }

    为什么要把父类对象强制转化成子类对象?

    最新回复(0)