为什么在最终课程中允许受保护的成员?
这不应该是编译时错误吗?
编辑:正如人们所指出的,您可以使用默认修饰符来获得相同的包访问权限。它应该以完全相同的方式运行,因为protected只是默认的+子类,而final修饰符明确拒绝子类化,所以我认为答案不仅仅是提供相同的包访问。
答案 0 :(得分:17)
对于从基类覆盖protected
方法的方法,protected
修饰符是必需的,而不会将这些成员公开给public
。
一般情况下,您可以引入许多不必要的规则来取缔不可信的组合(例如protected static
),但这并没有多大帮助。你不能禁止愚蠢。
答案 1 :(得分:15)
因为受保护的成员可以被同一个包中的其他类以及子类访问。
答案 2 :(得分:9)
protected修饰符还允许在同一个包中进行访问,而不仅仅是子类。所以在最后一堂课上并没有完全没有意义。
答案 3 :(得分:6)
这里说的论点是protected
成员可以被同一个包的类访问是有效的,但在这种情况下protected
变得等于默认可见性(包私有),以及问题遗骸 - 为什么两人都允许。
我猜两件事:
final
,直到作出设计决定。每次添加或删除final
答案 4 :(得分:0)
你可以争辩说,但无论如何都没有真正的伤害。非final类也可能有一个受保护的成员,但没有子类,也不会打扰任何人。
答案 5 :(得分:-1)
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();
}
}