代码之家  ›  专栏  ›  技术社区  ›  Tom Tresansky

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

  •  15
  • Tom Tresansky  · 技术社区  · 16 年前

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

    6 回复  |  直到 16 年前
        1
  •  17
  •   Tom Hawtin - tackline    16 年前

    这个 protected 对于重写的方法,修饰符是必需的 方法,而不将这些成员暴露给 public .

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

        2
  •  15
  •   skaffman    16 年前

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

        3
  •  9
  •   Affe    16 年前

        4
  •  7
  •   Bozho    16 年前

    这里的论点是 protected 成员可以由相同包的类访问是有效的,但在这种情况下 变为等于默认可见性(包私有),问题仍然是-为什么两者都允许。

    我猜有两件事:

    • 没必要禁止
    • 一节课可以做 final 最终的
        5
  •  0
  •   irreputable    16 年前

    你可以这么说,但也没什么害处。一个非final类也可能有一个受保护的成员,但没有子类,它也不会打扰任何人。

        6
  •  -1
  •   Michael Myers KitsuneYMG    13 年前
    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();
        }
    }