Методы переопределения 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, прежде чем спрашивать, но не смог найти ответ.
Ответы
Ответ 1
protected
означает (грубо) "доступный для подклассов". (См. эту таблицу.) Поскольку new View(this) { ... }
создает подкласс, возможно переопределить метод внутри него.
В этом случае не имеет значения, что вы находитесь в другом пакете. (См. Строку protected
и второй столбец в этой таблице.) Тот факт, что метод находится в подклассе, достаточен для "получения доступа" к защищенному методу.
Потенциальный следующий вопрос: какой смысл он делает, если я вообще не могу назвать метод?
Все методы в Java являются виртуальными. Это означает, что всякий раз, когда класс View
выполняет кажущийся внутренний вызов метода onDraw
, этот вызов будет отправлен на переопределенный метод.
Ответ 2
Это не совсем своего рода кодирование. Это анонимный класс Java. Это очень распространено в Android и вообще с прослушивателями событий и такими вещами.
Для получения дополнительной информации вы можете прочитать эту ссылку (возможно, не самую лучшую):
Анонимные внутренние классы очень полезны в некоторой ситуации. Для пример рассмотрим ситуацию, когда вам нужно создать экземпляр объект без создания подкласса класса, а также выполнение дополнительные задачи, такие как перегрузка метода.
О вашем втором вопросе ключевое слово protected
означает, что метод доступен только для подклассов, поэтому можно переопределить метод.
Ответ 3
Это анонимный класс. Вы правы, что вы переопределяете защищенный метод, и это совершенно нормально. Защищенный метод видим и поэтому может быть переопределен подклассом, который вы создали здесь.
Защищенный пакет - это область по умолчанию, когда вы не предоставляете область для своей переменной или метода. Это отличается от защищенного.
Ответ 4
Так же, как и другие, здесь уже ответили, это называется анонимным классом, а переопределение защищенных методов является законным, так как защищенные методы видны дочерним классам и классам в одном пакете.
Ответ 5
Так много ответов было для "защищенных", поэтому я иду на другой:)
@override информирует компилятор о переопределении метода базового класса, а если нет метода базового класса этой сигнатуры, то генерирует ошибку компиляции.
Они называются аннотациями. Вы можете искать тему аннотаций в java. Вы также можете создавать пользовательские аннотации.
С уважением,
SSuman185