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

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

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

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

对于从基类覆盖protected方法的方法, protected修饰符是必需的,而不会将这些成员publicpublic

一般来说,你可能会引入许多不必要的规则来取缔不可信的组合(例如protected static组合),但它没有多大帮助。 你不能禁止愚蠢。

因为受保护的成员可以被同一个包中的其他类以及子类访问。

protected修饰符还允许在同一个包中进行访问,而不仅仅是子类。 所以在最后一堂课上并没有完全没有意义。

这里所说的论点是protected成员可以被同一个包的类访问是有效的,但在这种情况下, protected变得等于默认的可见性(package-private),问题仍然存在 – 为什么两者都允许。

我猜两件事:

  • 没有必要禁止它
  • 在作出设计决定之前,可以暂时提出课程。 每次添加或删除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(); } }