Переопределение методов Java при создании нового экземпляра класса - PullRequest
33 голосов
/ 08 сентября 2011

Это может быть просто для опытных разработчиков Java, но я просто не могу понять это.Я прочитал пост отсюда.Код был

View v = new View(this) {
    @Override
    protected void onDraw(Canvas canvas) {
        System.out.println("large view on draw called");
        super.onDraw(canvas);
    }
};

Это был вопрос Android.Здесь пользователь создает экземпляр представления и переопределяет метод в одной строке.Есть ли название для этого вида кодирования?

Мое второе сомнение в том, что он переопределяет защищенный метод из другого пакета.Не защищен, значит пакет приватный.Я знаю, что это сработает, когда я попробовал, но я просто не мог понять, почему это сработало.Так почему этот код работает?

Я пытался найти это в Google и искать в SO, прежде чем спрашивать, но не смог найти ответ.

Ответы [ 5 ]

19 голосов
/ 08 сентября 2011

protected означает (примерно) «доступный для подклассов».(См. в этой таблице .) Поскольку new View(this) { ... } создает подкласс, можно переопределить метод внутри него.

В этом случае не имеет значения, что вы находитесь вдругой пакет.(См. Строку protected и второй столбец в этой таблице .) Тот факт, что метод находится в подклассе, является достаточным для "получения доступа" к защищенному методу.


Потенциальный дополнительный вопрос: какой смысл, если I не может вызвать метод в любом случае?

Все методы в Java virtual .Это означает, что всякий раз, когда класс View выполняет, казалось бы, внутренний вызов метода onDraw, этот вызов отправляется переопределенному методу.

10 голосов
/ 08 сентября 2011

Это не совсем вид кодирования.Это анонимный класс Java.Это очень часто встречается в Android и вообще со слушателями событий и тому подобными вещами.

Для более подробной информации вы можете прочитать эту ссылку (вероятно, не самый лучший):

В некоторых ситуациях анонимные внутренние классы очень полезны.Например, рассмотрим ситуацию, когда вам нужно создать экземпляр объекта без создания подкласса класса, а также выполнить дополнительные задачи, такие как перегрузка метода.

О вашем втором вопросе, ключевом словеprotected означает, что метод доступен только для подклассов, поэтому есть возможность переопределить метод.

3 голосов
/ 08 сентября 2011

Это анонимный класс. Вы правы в том, что переопределяете защищенный метод, и это совершенно нормально. Защищенный метод является видимым и поэтому может быть переопределен подклассом, который вы создали здесь.

Пакет защищен - это область по умолчанию, если вы не предоставляете область для своей переменной или метода. Это отличается от защищенного.

1 голос
/ 08 сентября 2011

Было так много ответов для «защищенных», так что я перейду к другому:)
@override сообщает компилятору о необходимости переопределить метод базового класса, и если для этой сигнатуры нет метода базового класса, тоВыдает ошибку компиляции.

Это так называемые аннотации.Вы можете искать тему аннотации в Java.Вы также можете создавать собственные аннотации.

С уважением,
SSuman185

1 голос
/ 08 сентября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...