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