9

我正在学习 java 中的访问级别,并创建了 3 个类: 在包 my.inheritance 中,我有 A 类和 C 类

package my.inheritance;
public class A {
protected int a=15; 
}

package my.inheritance;
public class C {

public static void main(String[] args)
{
    A a = new A();
    System.out.println(a.a);
}
}

在另一个名为 my.inheritance.test 的包中,我有一个 B 类试图访问 int 值 a 的受保护字段,但编译器为此抱怨!

package my.inheritance.test;
import my.inheritance.A;
public class B extends A{

public static void main(String[] args)
{
    A a = new A();
    int value = a.a;
    System.out.println(value);
}
}

我的印象是受保护的你可以访问来自不同包中不同类的成员,只要你对它进行子类化!为什么可见性错误呢?

4

5 回答 5

9

每个方法都可以访问其自己的类及其所有父类的受保护字段。这不包括对另一个类的受保护字段的访问,即使它们具有共同的相应基类。

因此类中的方法B可以从类的对象访问受保护的字段B,即使它们是在其中声明的A,但不能从类的其他对象访问A

可以说该类B从 继承受保护的成员A,因此现在每个人都B拥有这些成员。它不继承对A自身受保护成员的访问权限,因此它不能对任何受保护成员进行操作,A而只能对 的受保护成员进行操作B,即使它们是从 继承的A

于 2012-08-06T15:45:11.753 回答
1

尝试:

public class B extends A
{

    public static void main(String[] args)
    {
        B a = new B();
        int value = a.a;
        System.out.println(value);
    }
}

只有当它在同一个对象中时,您才能访问它。

于 2012-08-06T15:43:45.017 回答
0

1. protected是一个访问修饰符,当您想要在包外部进行访问时使用。

2.大多数人尝试通过创建 Super 类的Object 引用变量来访问 Super 类的受保护成员,然后使用点运算符访问该受保护成员....但那是错误的。

3.我们获得了继承的成员 Super class 不是超类的直接成员。

例如:

package com.demo1;

public class A{

protected int a = 5;

}

package com.demo2;

public class B extends A{

public static void main(String[] args){

         System.out.println(new B().a);   // This "a" is the inherited member

  }

}

4.还有一点很重要,子类"a"中的这个继承的成员,会被同一个包中的另一个类视为子类的私有成员..所以考虑这个包中的另一个类可以'甚至看不到这个受保护的成员...

于 2012-08-06T16:05:43.423 回答
0

您可以使用 this.a 从 B 访问此字段,因为 B 扩展了 A,但在这种情况下,您尝试通过 A 的实例访问此字段,这受到受保护访问的限制。

于 2012-08-06T16:06:42.773 回答
0

你想要做的是:

A a = new A();
int value = a.a;

请注意,这a.a是一个限定名称,在这种情况下,B只有当左侧表达式的类型.B或其子类时,您才能在类的主体中调用它。

JLS的相关部分

于 2012-08-06T16:29:14.913 回答