代码之家  ›  专栏  ›  技术社区  ›  vico

受保护的访问修饰符允许在非派生情况下访问字段

  •  0
  • vico  · 技术社区  · 5 年前

    我有课 c1 包装内 bbb

    package bbb;
    
    public class c1 {
    
         protected static  int a = 5;
    
    }
    

    c1

        package aaa;
        import bbb.c1;
        public class c2 extends c1 {
    
            public c2() {
                a = 10;
                c1 c = new c1();
                c.a = 60;
            }
        }
    
    
    package aaa;
    import bbb.c1;
    public class c4 {
    
        public c4() {
    
            c1 c = new c1();
            c.a = 60;
        }
    }
    

    两者兼而有之 c2 c4 使用 c1 c2 c1 虽然 -不是。我对变量感兴趣 c 在这两个班里。上课的时候 补体第四成份 "a has protected access in bbb.c1" 案例 变量工作正常。

    我希望派生类可能使用内部字段 a ,但不应允许在新创建的 c 就像它在 补体第四成份

    UPD公司

    Mala Gupta "OCA Java SE 8 Programmer I Certification Guide" 具有指示派生类对象只能通过继承而不能通过引用访问受保护方法的引用:

    默认访问可以与包私有(可访问)进行比较 private+kids(kids指派生类)。孩子们可以访问受保护的 方法只通过继承而不是通过引用(通过 在对象上使用点运算符)

    这是错误吗?

    0 回复  |  直到 5 年前
        1
  •  0
  •   Burcea Bogdan Madalin    5 年前

    我认为这是人们常有的误解。如果一个类可以访问它自己的属性(比如在您的例子中是c1.a),那么它可以在同一个类的另一个实例中访问同一个属性,而不管它的访问修饰符(甚至是private)。例如,这是可行的:

    class Base {
        private int x = 0;
    
        public void method(Base other) {
            other.x += 5;
        }
    }
    

    注意:这与您的问题无关,但是用大写字母(这里是C1、C2、C4)命名类是一个很好的惯例,这样代码更容易被其他人阅读。

        2
  •  1
  •   Guy    5 年前

    进入受保护区域 a 允许进入 c2 c2 c1 JLS

    如果通过限定名Q.Id进行访问,其中Q是 ExpressionName,则当且仅当类型 表达式Q的是S或S的子类。

        3
  •  0
  •   Oleg Cherednik    5 年前
    public class c4 {
    
        public c4() {
    
            c1 c = new c1();
            c.a = 60;
        }
    }
    

    等级 c1 public c4 从另一个包可以访问它。但是,变量 c1.a protected ,这意味着它只对包可见 bbb 或任何孩子 c1 . 所以, c.a = 60; CompileTimeError c1.a.段 bbb公司 包装和 补体第四成份 c1 .


    The official tutorial

    ______________________________________________________________
    |           │ Class │ Package │ Subclass │ Subclass │ World  |
    |           │       │         │(same pkg)│(diff pkg)│        |
    |───────────┼───────┼─────────┼──────────┼──────────┼────────|
    |public     │   +   │    +    │    +     │     +    │   +    | 
    |───────────┼───────┼─────────┼──────────┼──────────┼────────|
    |protected  │   +   │    +    │    +     │     +    │        | 
    |───────────┼───────┼─────────┼──────────┼──────────┼────────|
    |no modifier│   +   │    +    │    +     │          │        | 
    |───────────┼───────┼─────────┼──────────┼──────────┼────────|
    |private    │   +   │         │          │          │        |
    |___________|_______|_________|__________|__________|________|
     + : accessible         blank : not accessible