Как я могу вызвать финализировать ()

В следующем коде я получаю вывод 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 ответа

Решение

protected область действия включает в себя пакет, а также класс и подкласс (ы). Оба ваших класса являются частью одного пакета.

Я надеюсь, что вы не собираетесь звонить finalize()кстати Это следует оставить сборщику мусора (и не полагаться на это тоже!). Смотрите этот ответ для получения дополнительной информации.

protected делает метод видимым в том же пакете

Это может помочь: Управление доступом к членам класса

У вас есть файл с именем SampleProject.java внутри упаковки sampleproject, SampleProject.java содержит два определенных класса, а именно SampleProject а также Sample, Поэтому, когда вы скомпилируете файл SampleProject.java, вы увидите SampleProject.class а также Sample.class в той же папке. Таким образом, они находятся в одном пакете (потому что компилятор вставляет пакет как samplepackage для Sample.classследовательно, называя finalize метод успешен.

защищенные члены могут быть доступны только членам их собственного класса, подклассам или классам этого класса из одного пакета.

Отсюда

Другие вопросы по тегам