Почему защищенные члены разрешены в финальных классах Java?
Почему защищенные члены разрешены в финальных классах?
Разве это не ошибка времени компиляции?
Изменить: как указали люди, вы можете получить тот же доступ к пакетам, используя вместо этого модификатор по умолчанию. Он должен вести себя точно так же, потому что protected является стандартным + подклассами, а последний модификатор явно запрещает подклассирование, поэтому я думаю, что ответ - это больше, чем просто предоставление такого же доступа к пакетам.
Ответы
Ответ 1
Модификатор protected
необходим для методов, которые переопределяют методы protected
из базового класса, не подвергая эти члены <<22 > .
В общем, вы могли бы ввести много ненужных правил, чтобы запрещать неправдоподобные комбинации (например, protected static
), но это не помогло бы. Вы не можете запрещать глупость.
Ответ 2
Поскольку защищенные члены могут быть доступны другими классами в одном пакете, а также подклассы.
Ответ 3
Защищенный модификатор также обеспечивает доступ в пределах одного и того же пакета, а не только к подклассам. Таким образом, это не совсем бессмысленно в конечном классе.
Ответ 4
Аргумент, указанный здесь, о том, что члены protected
могут быть доступны классами одного и того же пакета, действителен, но в этом случае protected
становится равным видимости по умолчанию (package-private), и остается вопрос - почему оба разрешены.
Я бы предположил две вещи:
- Не нужно запрещать его
- класс может быть сделан
final
временно, пока не будет принято конструктивное решение. Не нужно идти и изменять все модификаторы видимости каждый раз, когда он добавляет или удаляет final
Ответ 5
Вы можете утверждать, что, но в этом нет никакого реального вреда. Не конечный класс может также иметь защищенный член, но не подкласс, он никого не беспокоит.
Ответ 6
package p;
import java.sql.Connection;
public final class ProtectedTest {
String currentUser;
Connection con = null;
protected Object ProtectedMethod(){
return new Object();
}
public ProtectedTest(){
}
public ProtectedTest(String currentUser){
this.currentUser = currentUser;
}
}
package p;
public class CallProtectedTest {
public void CallProtectedTestMethod() {
System.out.println("CallProtectedTestMethod called :::::::::::::::::");
ProtectedTest p = new ProtectedTest();
Object obj = p.ProtectedMethod();
System.out.println("obj >>>>>>>>>>>>>>>>>>>>>>>"+obj);
}
}
package p1;
import p.CallProtectedTest;
public class CallProtectedTestFromp2 {
public void CallProtectedTestFromp2Method(){
CallProtectedTest cpt = new CallProtectedTest();
cpt.CallProtectedTestMethod();
}
public static void main(String[] args) {
CallProtectedTestFromp2 cptf2 = new CallProtectedTestFromp2();
cptf2.CallProtectedTestFromp2Method();
}
}