知识回顾9、继承和多态的问题3

三、方法中的引用传递的重载和覆盖问题

调用一个方法,传递一个引用类型数据,即对象进去,遵循下面规则:

(1)、如果该方法的参数,正好是这个对象的引用,那么就调用这个方法。

(2)、如果没有正好对这个对象的引用,那么就找参数是其父类引用的方法(如果是接口,就找相应的接口引用),如果父类也没有,就找父类的父类。。。直到找不到,报错。

那么,记住这一点,总和前面父类子类方法调用的问题,就无往而不利了。

看下面的一道题

public class Demo2 {
    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(a1.show(b));//   1
        System.out.println(a1.show(c)); //    2
        System.out.println(a1.show(d)); //    3
        
        System.out.println(a2.show(b));//     4
        System.out.println(a2.show(c));//    5
        
        System.out.println(a2.show(d));//6
        System.out.println(b.show(b));// 7
        System.out.println(b.show(c));//8
        System.out.println(b.show(d));//9
    }
}

class A {
    public String show(D obj) {
        return ("A and D");
    }
    public String show(A obj) {
        return ("A and A");
    }
}

class B extends A {
    public String show(B obj) {
        return ("B and B");
    }
    public String show(A obj) {
        return ("B and A");
    }
}

class C extends B {
}

class D extends B {
}


答案和解释

1、第1行的结果为   A  And  A

因为传递进去的是一个B类对象,而A类中没有B类对象相应的show方法,那么就找B类对象的父类引用,所以为A   And    A


2、第2行的结果为   A  And  A

原因和1相同


3、第3行的结果为   A  And  D

因为传递的是一个D对象,因为有与D类对象相应的show方法,所以调用相应的show方法,输出  A    And   D


4、第4行的结果为   B  And  A

a2是父类引用子类的对象,虽然传递进来的参数是B类对象,而子类B中也有相应的show方法,但是父类引用不能调用它,因为它是子类独有的方法。所以只能在自己类里面的方法里面找,找到了这个方法

  public String show(A obj) {
        return ("A and A");
    }

又因为子类重写了这个方法

  public String show(A obj) {
        return ("B and A");
    }

所以调用子类重写的方法,所以是B  And   A;


5 、第5行的结果为   B  And  A

原因和4类似。


6、第6行的结果为  A  And  D

父类的引用,在父类中找到了与D类相应的show()方法,所以调用

public String show(D obj) {
        return ("A and D");
    }

输出结果为A  And   D;


7、第7行的结果为  B And  B

这个就不解释了


8、第7行的结果为  B And  B

不解释

9、第9行的结果为  A  And  D

因为B从A类那里继承了 public String show(D obj) {
        return ("A and D");
    }

所以调用这个方法,结果是A   And    D



你可能感兴趣的:(c,String,Class)