当前位置: 首页 > 知识库问答 >
问题:

如何在子类中访问超类的“受保护的静态”变量,子类驻留在不同的包中..?

严正诚
2023-03-14

下面是对同一问题稍加阐述的版本。

我们不能访问子类中的受保护变量(超类的),因为子类在不同的包中。我们只能访问supeclass的继承变量。但是如果我们将修饰符更改为“受保护的静态”,那么我们也可以访问超类的变量。为什么会这样?

下面是我试图解释的相同代码片段。

package firstOne;

public class First {
    **protected** int a=7;
}

package secondOne;

import firstOne.*;

public class Second extends First {
    protected int a=10; // Here i am overriding the protected instance variable

    public static void main (String [] args){
        Second SecondObj = new Second();
        SecondObj.testit();
    }
    public void testit(){
        System.out.println("value of A in Second class is " + a);
        First b = new First();
        System.out.println("value in the First class" + b.a ); // Here compiler throws an error.
    }
}

上述行为在意料之中。但我的问题是,如果我们将超类实例变量“a”的访问修饰符更改为“protected static”,那么我们也可以访问该变量(超类的变量)…!我的意思是,

package firstOne;

public class First {
    **protected static** int a=7;
}

package secondOne;

import firstOne.*;

public class Second extends First {
    protected int a=10;

    public static void main (String [] args){
        System.out.println("value in the super class" + First.a ); //Here the protected variable of the super class can be accessed..! My question is how and why..?
        Second secondObj = new Second();
        secondObj.testit();
    }

    public void testit(){
        System.out.println("value of a in Second class is " + a);
    }

}

上面的代码显示了输出:

超类中的值7

test1类中的x值为10

这怎么可能...?

共有2个答案

穆展鹏
2023-03-14

重写仅应用于方法,而不是类变量。不存在重写变量这回事。您正在跟踪访问超类的变量a的符号。

郭华美
2023-03-14

从“检查对Java虚拟机中受保护成员的访问”:

设m是属于包P的类c中声明的成员。如果m是公共的,它可以被任何类中的(代码)访问。如果m是私有的,则只能由C访问。如果m具有默认访问权限,则只能由属于P的任何类访问。

如果m受到保护,事情就稍微复杂一些。首先,m可以被属于p的任何类访问,就好像它有默认的访问权限一样。此外,它可以被属于不同于p的包的c的任何子类s访问,有如下限制:如果m不是静态的,那么正在访问其成员的对象的类o必须是s或s的子类,写为o≤s(如果m是静态的,限制不适用:m总是可以被s访问)。

我在JLS第6.6.2.1节中找到了这个引用,它支持关于“其成员被访问的对象必须是s或子类...”的部分。我没有看到支持static子句的任何东西,但基于您自己的示例,这显然是正确的。

 类似资料:
  • 问题内容: 这是相同问题的详细阐述版本。 我们无法访问子类(位于不同包中)的子类中的(超类的)受保护变量。我们只能访问supeclass的继承变量。但是,如果将修饰符更改为“ protected static”,那么我们也可以访问超类的变量。为什么会这样呢? 这是我试图解释的相同代码段。 以上行为是预期的。但是我的问题是,如果我们将超类实例变量“ a”的访问修饰符更改为“保护静态”,那么我们也可以

  • 我有两个不同包的亲子班。我正在重写受保护类型的方法。我想访问子类中的超类保护方法。 考虑以下代码: 认为我是Java新手,并在main方法中提供替代comment的答案。

  • 问题内容: 我有一个抽象类,封装和它的一个子类,在包。有一个名为的受保护成员。 在: 上线 和 我收到以下错误: 字段Relation.mStructure不可见 如果我将两个类放在同一包中,则效果很好。谁能解释这个问题? 问题答案: 它有效,但是只有您自己的孩子会尝试访问它 自己的 变量,而不是其他实例的变量(即使它属于同一继承树)。 请参阅以下示例代码以更好地理解它: 如果我们尝试使用进行编译

  • 我正在阅读这本Java SCJP的书,我偶然发现了以下内容: 但是我得到了这个错误: 那么,出什么问题了?

  • 我的子类是,我需要在我的超类中使用字段和。我知道如何在子类中使用超类变量,但我必须学会如何做相反的事情?谢谢。

  • 问题内容: 我想对此进行一些讨论,但无法推断出我的情况的答案。仍然需要帮助。 这是我的代码: 在上面的示例中,下面的一些定义似乎令人困惑: 问题: 为什么我不能从子类实例(对象)访问受保护的成员()? 问题答案: 作为声明类的子类的其他包中的类只能访问其自己的继承成员。 …但不是其他对象的继承成员。