为什么这个程序会编译?

Ian*_*ath 0 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";
    }
}
Run Code Online (Sandbox Code Playgroud)

这两个类都没有toString适当地覆盖该方法.

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

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

JB *_*zet 8

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

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