Java 这个程序为什么要编译?

Java 这个程序为什么要编译?,java,Java,这两个类都不会适当地重写toString方法 问题:这些方法是否被覆盖 如果是,那么这个规则呢:如果超类方法声明了一个异常,子类重写的方法可以声明相同的异常、子类异常或无异常,但不能声明父类异常RuntimeException是NullPointerException的父级 问题:这些方法是否被覆盖 否。这些方法是重载的 原始方法如下所示: public class Fir extends Test { public static void main(String args[])

这两个类都不会适当地重写
toString
方法

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

如果是,那么这个规则呢:如果超类方法声明了一个异常,子类重写的方法可以声明相同的异常、子类异常或无异常,但不能声明父类异常
RuntimeException
NullPointerException
的父级

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

否。这些方法是重载的

原始方法如下所示:

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";
    }
}

您给出的规则是正确的,但它适用于已检查的异常,而不适用于运行时异常。任何方法都可以抛出它想要的任何运行时异常,而无需声明它。您可以声明它们,但这纯粹是为了文档目的


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

您尝试过编译/运行它吗?
适当地
。。。他们根本不想做超控@克里斯蒂安,我当然知道。输出为Fir@5e8fce95well,它是-见JB Nizet'sanswer@IanMcGrath我误解了。我以为您指的是重写
对象
中的
toString()
方法,而不是
测试
中的方法。对不起,哎呀,我忘了这条规则。谢谢。JB对
@Override
注释提出了一个很好的观点。重写方法时应始终使用它,以便编译器帮助您捕获错误。但是
Fir
中的
toString(String)
方法确实重写了
Test
中的
toString(String)
方法。因此,相对于
Object.toString()
重载,但相对于彼此重写。
public String toString()