簡體   English   中英

為什么在最終的java類中允許受保護的成員?

[英]Why are protected members allowed in final java classes?

為什么在最終課程中允許受保護的成員?

這不應該是編譯時錯誤嗎?

編輯:正如人們所指出的,您可以使用默認修飾符來獲得相同的包訪問權限。 它應該以完全相同的方式運行,因為protected只是默認的+子類,而final修飾符明確拒絕子類化,所以我認為答案不僅僅是提供相同的包訪問。

對於從基類覆蓋protected方法的方法, protected修飾符是必需的,而不會將這些成員publicpublic

一般來說,你可能會引入許多不必要的規則來取締不可信的組合(例如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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM