我在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
;
据我所知,超类引用可以访问受保护的成员,但是为什么会发生错误。
答案 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
}
}
如果A
和B
在同一个套餐中,则不会出现任何错误。
答案 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
您必须是子类或在同一个包中才能访问这些属性。
protected
修饰符指定只能在自己的包中访问该成员(与package-private一样),此外,还可以在另一个包中通过其类的子类访问。