为什么我无法访问受保护的字段?

时间:2012-08-06 15:41:32

标签: java

我正在学习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);
}
}

我受到了受保护的印象,只要您将其子类化,就可以从不同包中的其他类访问成员!为什么可见性错误呢?

5 个答案:

答案 0 :(得分:9)

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

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

可以说班级BA继承了受保护的成员,所以现在每个B都有这些成员。它不会继承对A本身的受保护成员的访问权限,因此它不能对A的受保护成员进行操作,而只能对B的成员进行操作,即使它们是从A继承的{1}}。

答案 1 :(得分:1)

尝试:

public class B extends A
{

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

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

答案 2 :(得分:0)

1。 protected是一种访问修饰符,当您希望在程序包外部拥有访问权限时使用。

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

3。我们可以访问 <{strong> Super class 继承成员,而不是超类的直接成员。 < / p>

<强>例如

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"成员,同一个包中的另一个类会看到它作为私有成员的子类的那个..所以考虑到这个包中的另一个类甚至看不到这个受保护的成员......

答案 3 :(得分:0)

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

答案 4 :(得分:0)

您要做的是:

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

请注意,a.a是一个限定名称,在这种情况下,只有B左侧的表达式类型为.,才能在类B的正文中调用它。 {{1}}或它的子类。

Relevant part of JLS