在下面的代码中,我得到输出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");
}
}
感谢。
答案 0 :(得分:4)
protected
范围包括包,以及类和子类。你的两个类都属于同一个包。
我希望你不打算打电话给finalize()
,顺便说一下。这应该留给垃圾收集器(并且不依赖,或者!)。有关详细信息,请参阅this answer。
答案 1 :(得分:0)
protected
使方法在同一个包中可见
答案 2 :(得分:0)
受保护成员只能由自己的班级成员访问, 该类的子类或来自同一包的类。
来自here
答案 3 :(得分:0)
您在包SampleProject.java
中有一个名为sampleproject
的文件。 SampleProject.java包含两个定义的类,即SampleProject
和Sample
。因此,在编译SampleProject.java文件时,您会在同一文件夹中看到SampleProject.class
和Sample.class
。所以它们在同一个包中(因为编译器为samplepackage
插入包Sample.class
,因此调用finalize
方法成功。