涉及继承的代码片段

时间:2015-10-26 15:43:50

标签: java inheritance

我正在运行的代码如下:

public class Triangle {   
     public void draw() { 
         System.out.println("Base::draw\n");  
     }  
     public void computeCentroid(Triangle t) {  
         System.out.println("Base::centroid");
     }
}


class RightAngledTr extends Triangle {  
    public void draw() { 
       System.out.println("RightAngle::draw\n" );  
    }  
    public void computeCentroid(RightAngledTr t) {
       System.out.println("RtAngle::centroid");    
    } 
}


public static void main(String[] args) {
    Triangle tr= new RightAngledTr();
    RightAngledTr rtr= new RightAngledTr();  
    tr.computeCentroid(tr); 
    tr.draw(); 
    tr.computeCentroid(rtr);
}

这给出的输出如下:

Base::centroid
RightAngle::draw
Base::centroid

我不明白第三条输出线背后的原因。 我怀疑: tr.computeCentroid(rtr)应该调用Derived类RightAngledTr的方法(因为传递的参数是rtr)。因此打印:RtAngle :: centroid

请帮帮我。提前谢谢!

3 个答案:

答案 0 :(得分:3)

public void computeCentroid(RightAngledTr t)

public void computeCentroid(Triangle t)

有不同的方法签名,所以这里根本没有覆盖。

答案 1 :(得分:2)

RightAngledTr 重写方法,但重载,因为Java方法是不变的。

RightAngledTr本质上有2个方法,一个需要Triangle而另一个需要RightAngledTr)所以通过指定最具体的参数,JVM知道哪些方法通过将参数类型与匹配它的最具体方法相匹配来调用。

查看更多:

答案 2 :(得分:0)

要使RightAngledTr.computeCentroid覆盖Triangle.computeCentroid,它必须具有匹配的参数声明。但你的不是。如果您将RightAngledTr中的声明更改为:

@Override
public void computeCentroid(Triangle t)

然后你会看到你期望的行为。请注意使用@Override,这有助于您将来确定此问题。