基本的Java继承练习

时间:2015-02-06 15:21:27

标签: java inheritance hierarchy multiple-inheritance

我正在学习Java,我正在做这个练习,我不得不说主要方法打印的是什么。它的目标是更好地理解Java继承。

interface X extends Remote{
    A m(B bb) throws RemoteException;
}

class A implements Serializable{
     int a;
     A m(A aa){ 
         aa.a = 3; 
         System.out.println("A.m"); 
         return aa;
     }
}

class B extends A{
     int b;
     A m(B bb){
        bb.b = 7; 
        System.out.println("B.m");
        return bb;
     }
}

class C extends A implements X{
    public B m(B bb){
        if(bb.b == 7) bb.b = 9; else bb.b = 1;
        System.out.println("C.m");
        return bb;
    }
}

现在我有一个主要的方法,我打电话:

X x = new C();
B b = new B();
(x.m(b)).m(b);   // prints C.m() A.m()

我的main方法的第三行打印“C.m()A.m()”但我不明白它为什么打印A.m()。 x.m(b)返回一个具有静态和动态类型== B的对象;在这个对象上调用m(b)方法;那么为什么它不被称为B类的m()方法?

我已经看到B类中的m()方法不是A类中m()方法的重写,因为它们有不同的显式参数。

提前致谢

1 个答案:

答案 0 :(得分:5)

b的{​​{1}}实例中的

B,其范围为A。因此,B有两种m方法。

要知道调用哪个,重要的是调用该方法的对象的类型。

(x.m(b))

m界面调用X方法的结果,因为x的声明类型为X

因此(x.m(b))A类型的对象(即使实际实现是B)。

这是A类型,调用m类的A方法。

如果更改方法的名称,mA中的B方法实际上是不同的对象会更清楚。

你的错误是假设

  

x.m(b)返回一个同时具有静态和动态类型== B;

的对象

哪个错误,因为x被声明为X类型,因此x.m的结果为A类型。