【问题标题】:Understanding the behavior of protected members in class了解类中受保护成员的行为
【发布时间】:2013-07-05 04:35:20
【问题描述】:

我正在尝试了解类中受保护成员的行为。我有一个类TopClass,其中包含受保护的整数pr

类:

package com.test;

import com.test.anotherpackage.SubClass1;
import com.test.anotherpackage.SubClass2;
import com.test.anotherpackage.SubClass3;

public class TopClass {
    protected int pr;

    void action(TopClass t, SubClass1 s1, SubClass2 s2, SubClass3 s3) {
        t.pr = 3;
        s1.pr = 0;
        s2.pr = 1;
        s3.pr = 1;
    }
}

还有另一个包com.test.anotherpackage,它有3个类SubClass1SubClass2SubClass3。继承层次如下:

  1. SubClass1 extends TopClass
  2. SubClass2 extends SubClass1
  3. SubClass3 extends SubClass2

子类 1

package com.test.anotherpackage;

import com.test.TopClass;

public class SubClass1 extends TopClass {

    void action(TopClass t, SubClass1 s1, SubClass2 s2, SubClass3 s3) {
        t.pr = 0; // Error because not in same package.
        s1.pr = 0; //(1)
        s2.pr = 1; // Does not throw an Exception. Why? (2)
        s3.pr = 1; // (3)
    }
}

子类2

package com.test.anotherpackage;

import com.test.TopClass;

public class SubClass2 extends SubClass1 {
    void action(TopClass t, SubClass1 s1, SubClass2 s2, SubClass3 s3) {
        t.pr = 0; // Error because not in same package.
        s1.pr = 0; // Throws Exception, why?  (4)
        s2.pr = 1; //  (5)
        s3.pr = 1; // Does not throw an Exception. Why?(6)
    }
}

子类3

package com.test.anotherpackage;

import com.test.TopClass;

public class SubClass3 extends SubClass2 {
    void action(TopClass t, SubClass1 s1, SubClass2 s2, SubClass3 s3) {
        t.pr = 0; 
        s1.pr = 0; // Not Visible (7)
        s2.pr = 1; // Not Visible (8)
        s3.pr = 1; // (9)
    }
}

在上面的代码中,(1)(2)(3)(5)(6)(9) 可以完美运行,没有任何可见性问题。但是(4)(7)(8) 存在可见性问题。

根据JLS§6.6.2.1

令 C 为声明受保护成员的类。访问是 只允许在 C 的子类 S 的主体内。

另外,如果Id表示一个实例字段或实例方法,那么:

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

如果通过字段访问表达式 E.Id 进行访问,其中 E 是 主表达式,或通过方法调用表达式 E.Id(. . .), 其中 E 是主表达式,则允许访问,如果并且 仅当 E 的类型是 S 或 S 的子类时。

我想在这里理解的是为什么if the type of the expression Q is S or a subclass of S 会出现。是否有任何特定场景可以使此实施受益?任何相关的例子都将受到高度赞赏。我尝试在 SO 上查看它,但找不到可以解决我疑问的解释。

【问题讨论】:

    标签: java inheritance packages protected


    【解决方案1】:

    您正在讨论的表达式也是代码中对您的问题负责的表达式:

    if the type of the expression Q is S or a subclass of S

    (2) 因为表达式s2 的类型是SubClass1 的子类
    (4) 因为表达式s1 的类型不是SubClass2 的子类
    @987654328 @ 因为表达式s3 的类型是SubClass2 的子类

    但是我不知道

    此实施可能有益的任何特定场景

    要么。

    【讨论】:

    • 您解释的原因已包含在 JLS§6.6.2.1 中。我想知道为什么实现有这个子句。我不明白允许通过超类中的子类引用进行访问的原因。
    猜你喜欢
    • 2012-10-03
    • 2017-08-01
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    • 2018-09-29
    • 2018-11-27
    相关资源
    最近更新 更多