为什么在最终的java类中允许受保护的成员?
为什么在最终课程中允许受保护的成员?
这不应该是编译时错误吗?
编辑:正如人们所指出的,您可以使用默认修饰符来获得相同的包访问权限。 它应该以完全相同的方式运行,因为protected只是默认的+子类,而final修饰符明确拒绝子类化,所以我认为答案不仅仅是提供相同的包访问。
对于从基类覆盖protected
方法的方法, protected
修饰符是必需的,而不会将这些成员public
给public
。
一般来说,你可能会引入许多不必要的规则来取缔不可信的组合(例如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(); } }