为什么这个程序会编译?

时间:2014-03-30 08:24:22

标签: java

public class Fir extends Test 
{
    public static void main(String args[])  
    {
        Fir fir = new Fir();
        System.out.println(fir);
    }

    public String toString(String x) throws RuntimeException
    {
        return "Fir";
    }
}

class Test
{
    protected String toString(String x) throws NullPointerException
    {
        return "Test";
    }
}

两个类都没有适当地覆盖toString方法。

问题:这些方法是否被覆盖?

如果是,那么这个规则怎么样:如果超类方法声明了一个异常,子类重写方法可以声明相同,子类异常或没有异常但不能声明父异常。 RuntimeExceptionNullPointerException的父级。

2 个答案:

答案 0 :(得分:8)

您提供的规则是正确的,但它适用于已检查的异常,而不适用于运行时异常。允许任何方法抛出它想要的任何运行时异常,而不声明它。您可以声明它们,但它纯粹是出于文档目的。

要回答您的问题,是的,Fir中的toString(String)方法会覆盖Test中的toString(String)方法。将@Override注释添加到Fir.toString(),编译器将为您检查:如果Fir.toString(String)没有覆盖任何方法,您将收到编译错误。

答案 1 :(得分:3)

  

问题:这些方法是否重写?

没有。这些方法是overloaded

原始方法如下所示:

public String toString()