为什么在最终的java类中允许受保护的成员?

时间:2010-09-07 17:54:21

标签: java oop

为什么在最终课程中允许受保护的成员?

这不应该是编译时错误吗?

编辑:正如人们所指出的,您可以使用默认修饰符来获得相同的包访问权限。它应该以完全相同的方式运行,因为protected只是默认的+子类,而final修饰符明确拒绝子类化,所以我认为答案不仅仅是提供相同的包访问。

6 个答案:

答案 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();
    }
}