1

在下面的代码中,我得到了输出 Hello。谁能解释为什么编译器没有报告错误,因为我在类和继承链之外调用了一个受保护的函数。

package sampleproject;

public class SampleProject 
{
    public static void main(String[] args) 
    {
        Sample s=new Sample();
        s.finalize();
    }
}

class Sample
{
    @Override
    protected void finalize()
    {
        System.out.println("Hello");
    }
}

谢谢。

4

4 回答 4

4

protected范围包括,以及类和子类。你的两个类都是同一个包的一部分。

我希望你不打算打电话finalize(),顺便说一句。这应该留给垃圾收集器(而不是依赖,。或者!)。有关更多信息,请参阅此答案

于 2012-10-11T08:29:47.960 回答
0

protected使方法在同一个包中可见

这可能会有所帮助:控制对类成员的访问

于 2012-10-11T08:30:11.600 回答
0

受保护的成员只能由他们自己的类、该类的子类或同一包中的类的成员访问。

这里

于 2012-10-11T08:30:23.777 回答
0

SampleProject.java您在 package中有一个名为的文件sampleproject。SampleProject.java 包含定义的两个类,即SampleProjectSample。因此,当您编译文件 SampleProject.java 时,您将看到SampleProject.classSample.class在同一个文件夹中。所以它们在同一个包中(因为编译器插入包作为samplepackageSample.class因此调用该finalize方法成功。

于 2012-10-11T08:38:44.917 回答