Java多态

tech2026-01-03  4

class A { public String str = "a"; public void fun1() { System.out.println("A-fun1-" + str); } public void fun2() { System.out.println("A-fun2-" + str); } public void fun3() { System.out.println("A-fun3-" + str); } public void funA() { System.out.println("A-funA-" + str); } } class B extends A{ public String str = "b"; public void fun1() { System.out.println("B-fun1-" + str); } public void fun2() { System.out.println("B-fun2-" + str); } public void funB() { System.out.println("B-funB-" + str); } } class C extends B{ public String str = "c"; public void fun1() { System.out.println("C-fun1-" + str); } public void funC() { System.out.println("C-funC-" + str); } } public class JavaTest { public static void main(String[] args) { A a = new B(); a.fun1(); //B-fun1-b ==>A中存在fun1(),B中重写了fun1()==》执行B.fun1() a.fun2(); //B-fun2-b ==>A中存在fun2(),B中重写了fun2()==》执行B.fun2() a.fun3(); //A-fun3-a ==>A中存在fun3(),B中未重写fun2()==》执行A.fun3() a.funA(); //A-funA-a ==>A中存在funA(),B中未重写fun2()==》执行A.funA() // a.funB(); //报错 Cannot resolve method 'funB()' ==>A中不存在funB() // a.funC(); //报错 Cannot resolve method 'funC()' ==>A中不存在funC() System.out.println("-----------------------"); A a2 = new C(); a2.fun1(); //C-fun1-c ==>A中存在fun1(),C中重写了fun1()==》执行C.fun1() a2.fun2(); //B-fun2-b ==>A中存在fun2(),C中重写了fun2(),此fun2是从B中继承过来==》执行B.fun2() a2.fun3(); //A-fun3-a ==>A中存在fun3(),C中未重写fun1()==》执行A.fun3() a2.funA(); //A-funA-a ==>A中存在funA(),C中未重写fun1()==》执行A.funA() // a2.funB(); //报错 Cannot resolve method 'funB()' ==>A中不存在funB() // a2.funC(); //报错 Cannot resolve method 'funC()' ==>A中不存在funC() System.out.println("-----------------------"); B b = new C(); b.fun1(); //C-fun1-c ==>B中存在fun1(),C中重写了fun1()==》执行C.fun1() b.fun2(); //B-fun2-b ==>B中存在fun2(),C中未重写fun2()==》执行B.fun2() b.fun3(); //A-fun3-a ==>B中本不存在fun3(),但从A中继承过来fun3,C中未重写fun3()==》执行A.fun3() b.funA(); //A-funA-a ==>B中本不存在funA(),但从A中继承过来funA,C中未重写funA()==》执行A.funA() b.funB(); //B-funB-b ==>B中存在funB(),C中未重写funB()==》执行B.funB() // b.funC(); //报错 Cannot resolve method 'funC()' ==>B中不存在funC() } }

逻辑说明

A a = new B(); a只能调用A中的函数,即fun1()和fun3(),不能调用子类新增的函数fun2(); 对于A中的fun1()和fun3(),查看子类B中是否存在(重写)了对应函数,存在则调用B中的函数,否则调用A


A a = new B(); a.fun() if (A中有fun()函数) { if (B中有fun()函数) { 执行B中的fun(); } else if (B中没有fun()函数) { 执行A中的fun(); } } else if (A中没有fun()函数) { 报错; }

例题

参考链接:https://blog.csdn.net/newchitu/article/details/90380094

class A { public int m = 10; public String show(D obj) { return ("A and D-" + m); } public String show(A obj) { return ("A and A-" + m); } } class B extends A{ public int m = 11; public String show(B obj){ return ("B and B-" + m); } public String show(A obj){ return ("B and A-" + m); } } class C extends B{ } class D extends B{ } public class Demo { public static void main(String[] args) { A a1 = new A(); A a2 = new B(); B b = new B(); C c = new C(); D d = new D(); System.out.println("1--" + a1.show(b)); System.out.println("2--" + a1.show(c)); System.out.println("3--" + a1.show(d)); System.out.println("4--" + a2.show(b)); System.out.println("5--" + a2.show(c)); System.out.println("6--" + a2.show(d)); System.out.println("7--" + b.show(b)); System.out.println("8--" + b.show(c)); System.out.println("9--" + b.show(d)); // 注释类B的public String show(A obj)进行对比 A a3 = new C(); System.out.println("10--" + a3.show(c)); } } 1--A and A-10 2--A and A-10 3--A and D-10 4--B and A-11 5--B and A-11 6--A and D-10 7--B and B-11 8--B and B-11 9--A and D-10

A a2 = new B(); a2.show(c);

在A中查看是否有show(C obj) 没有 查看A的show()的参数是否为C的父类 有 show(A obj) ,确定执行的函数为show(A obj) 查看B中是否重写了show(A obj) 是,执行B的show(A obj)==>B and A-11

对比

A a4 = new C(); a4.show(c);

在A中查看是否有show(C obj) 没有 查看A的show()的参数是否为C的父类 有 show(A obj) ,确定执行的函数为show(A obj) 查看C中是否重写了show(A obj) 是,是从B继承过来的,执行C的show(A obj)==>B and A-11


class A{ public int m = 10; public void showM() { System.out.println("A-showM-" + m); } public void showM2() { System.out.println("A-showM2-" + m); } public void test() { m += 2; showM2(); } } class B extends A{ public int m = 11; public void showM2() { System.out.println("B-showM2-" + m); } } class C extends B{ public int m = 13; } public class JavaTest { public static void main(String[] args) { A a = new B(); a.test(); //B-showM2-11 //==>A中存在test(),B未重写test()==>执行A.test(); // ==>m+=2,这里的m为A的m,执行后A.m=12,b.m=11 // showM2()判断==>a.showM2(),从A中继承showM2(),B重写了showM2()==>执行B中的showM2(),变量也为该方法所属类B中的变量 // ==>System.out.println(m),这里的m为B的m,b.m=11 A a2 = new C(); a2.test(); //11 //test()判断==>A中存在test(),C未重写test()==>执行A.test(); // ==>m+=2,这里的m为A的m,执行后A.m=12,c.m=13 // showM2()判断==>a2.showM2(),,A中存在showM2(),C重写了showM2()(该重写函数是从B继承而来)==>执行B中的showM2(),变量也为该方法所属类B中的变量 // ==>System.out.println(m),这里的m为B的m,b.m=11 } }

补充样例

class Father { public int money = 1; public Father() { money = 2; showMeTheMoney(); } public void showMeTheMoney() { System.out.println("I am Father, i have $" + money); } } class Son extends Father { public int money = 3; public Son() { money = 4; showMeTheMoney(); } public void showMeTheMoney() { System.out.println("I am Son, i have $" + money); } } public class JavaTest { public static void main(String[] args) { Father gay = new Son(); System.out.println("This gay has $" + gay.money); } }

结果输出

I am Son, i have $0 I am Son, i have $4 This gay has $2

代码

class Father { int x = 10; public Father() { this.print(); x = 20; } public void print() { System.out.println("Father.x:" + x); } } class Son extends Father { int x = 30; public Son() { this.print(); x = 40; } public void print() { System.out.println("Son.x:" + x); } } public class JavaTest { public static void main(String[] args) throws IOException { Father f = new Son(); System.out.println(f.x); } }

结果输出

Son.x:0 Son.x:30 20
最新回复(0)