[英]Why are protected members allowed in final java classes?
為什么在最終課程中允許受保護的成員?
這不應該是編譯時錯誤嗎?
編輯:正如人們所指出的,您可以使用默認修飾符來獲得相同的包訪問權限。 它應該以完全相同的方式運行,因為protected只是默認的+子類,而final修飾符明確拒絕子類化,所以我認為答案不僅僅是提供相同的包訪問。
對於從基類覆蓋protected
方法的方法, protected
修飾符是必需的,而不會將這些成員public
給public
。
一般來說,你可能會引入許多不必要的規則來取締不可信的組合(例如protected static
組合),但它沒有多大幫助。 你不能禁止愚蠢。
因為受保護的成員可以被同一個包中的其他類以及子類訪問。
protected修飾符還允許在同一個包中進行訪問,而不僅僅是子類。 所以在最后一堂課上並沒有完全沒有意義。
這里說的參數可以通過相同包的類訪問protected
成員是有效的,但在這種情況下, protected
變得等於默認可見性(包私有),問題仍然存在 - 為什么兩者都允許。
我猜兩件事:
final
暫時,在外觀設計作出決定。 每次添加或刪除final
時,都不應該更改所有可見性修飾符 你可以爭論,但無論如何都沒有真正的傷害。 非final類也可能有一個受保護的成員,但沒有子類,它也不會打擾任何人。
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();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.