为什么超类中的实例成员无法通过另一个包中的子类中的超类引用进行访问

时间:2016-01-06 13:12:46

标签: java

我在PackageOne中有一个超级A,在PackageTwo中有一个子类B.

package PackageOne;

public class A {        
protected number = 0;        
}

第二课在这里

package PackageTwo;

public class B extends A {
    public static void main(String args[]) {
       A a = new A();
       System.out.println(a.number);// Here is the error occurs        
    }        
}

错误是The field Person.name is not visible;

据我所知,超类引用可以访问受保护的成员,但是为什么会发生错误。

4 个答案:

答案 0 :(得分:2)

Controlling Access to Members of a Class

  

protected修饰符指定只能在自己的包中访问该成员(与package-private一样),此外,还可以在另一个包中通过其类的子类访问。

因为它是protected成员。您需要extend(继承)该类才能访问另一个包中类的protected成员。

而不是通过A访问,而不是通过B访问它。扩展课程A后,它将成为课程B的一部分。您无法使用A的引用来访问它。

public class B extends A {
  public static void main(String args[]) {
    B b = new B();  // create the instance of B.
    System.out.println(b.number);  // access via the b.
  }
}

您还缺少班级A中的数据类型:

public class A {
  protected int number = 0;
}

在同一个包中,您可以使用实例引用引用成员。检查以下代码:

package PackageOne;

public class C {
  public static void main(String[] args) {
    A a = new A();
    System.out.println(a.number); // this works.
  }
}

答案 1 :(得分:2)

如果您使用的是其他软件包,则无法访问其他实例的字段。您只能访问自己的领域。

班级A

package a;

public class A {
    protected int i;
}

班级B

package b;

public class B extends A {

    void m() {
        A a = new A();
        System.out.println(a.i); // error here!

        System.out.println(i);   // but no error here
    }
}

如果AB在同一个套餐中,则不会出现任何错误。

答案 2 :(得分:1)

受保护的方法只能通过包外的子类中的继承来访问。因此第二种方法tryMeProtected();的工作原理。

下面的代码不会编译,因为我们没有调用受保护方法的继承版本。

Example
Class1 c = new ClassA();
c.tryMeProtected(); // ERROR: tryMeProtected() has protected access in ClassA

关注This stack link以获取更多解释。

答案 3 :(得分:0)

这不是继承的工作方式。您不要通过创建实例来使类成为另一个类的子类。

你必须extend

public class B extends A

这样您就可以访问protected字段了。但是,您必须import PackageOne.A才能执行此操作。

修改

请参阅this来自@David Segonds的回答,了解这些关键字如何运作

            | Class | Package | Subclass | World
————————————+———————+—————————+——————————+———————
protected   |  y    |    y    |    y     |   n

您必须是子类或在同一个包中才能访问这些属性。

来自official documentation

  

protected修饰符指定只能在自己的包中访问该成员(与package-private一样),此外,还可以在另一个包中通过其类的子类访问。