Подтвердить что ты не робот

Методы переопределения Java при создании нового экземпляра класса

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

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

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

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

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

4b9b3361

Ответ 1

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

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


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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

Так много ответов было для "защищенных", поэтому я иду на другой:)
@override информирует компилятор о переопределении метода базового класса, а если нет метода базового класса этой сигнатуры, то генерирует ошибку компиляции.

Они называются аннотациями. Вы можете искать тему аннотаций в java. Вы также можете создавать пользовательские аннотации.

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