我正在学习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);
}
}
我受到了受保护的印象,只要您将其子类化,就可以从不同包中的其他类访问成员!为什么可见性错误呢?
答案 0 :(得分:9)
每个方法都可以访问自己的类及其所有父类的受保护字段。这不包括访问另一个类的受保护字段,即使它们具有相应的基类。
因此,类B
中的方法可以访问类B
的对象中的受保护字段,即使它们是在A
中声明的,但不是从类A
的其他对象中声明的}。
可以说班级B
从A
继承了受保护的成员,所以现在每个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> <强>例如强> 4。还有一点,在子类中继承了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
}
}
"a"
成员,同一个包中的另一个类会看到它作为私有成员的子类的那个..所以考虑到这个包中的另一个类甚至看不到这个受保护的成员......
答案 3 :(得分:0)
您可以使用this.a从B访问此字段,因为B扩展了A,但在这种情况下,您尝试通过A的实例访问此字段,这受到受保护访问的限制。
答案 4 :(得分:0)
您要做的是:
A a = new A();
int value = a.a;
请注意,a.a
是一个限定名称,在这种情况下,只有B
左侧的表达式类型为.
,才能在类B
的正文中调用它。 {{1}}或它的子类。