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

Java 为什么我无法访问受保护的字段?,java,Java,我正在学习java中的访问级别,我创建了3个类: 在我的包中 我有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.h

我正在学习java中的访问级别,我创建了3个类: 在我的包中 我有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.heritation.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);
}
}
我的印象是,你可以访问不同包中不同类的成员,只要你将其子类化!那么为什么会出现可见性错误呢

试试看:

public class B extends A
{

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

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

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


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

1继承的。
受保护的
是一个访问修饰符,当您希望在包外部进行访问时使用。

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

3。我们可以访问
超级类的继承成员,而不是超级类的直接成员。

例如:

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.还有一点很重要,即继承的
子类中的
成员将被子类中的另一个类作为私有成员看到。。因此,考虑到这个包中的另一个类甚至不能看到这个受保护的MeMeBER…< /强> 

,您可以使用B来访问这个字段。A由于B扩展了A,但在这种情况下,您试图通过A的实例访问该字段,这受受保护的访问限制。

< P>您所要做的是:

A a = new A();
int value = a.a;
请注意,
a.a
是一个限定名,在这种情况下,只有当
左侧的表达式类型为
B
或其子类时,才可以在类的主体中调用它


哦,我是c。这是因为我试图通过A从main访问它,只有B类可以访问该字段。不完全正确-在第一句中将“object”更改为“class”。访问应用于类级别,而不是对象级别-同一类的对象甚至可以访问彼此的私有成员。(这个技巧可以在“equals()”方法中起到很好的作用。)@Nate,我对这里的时间线有点困惑:我看到了你的评论,编辑了我的答案以考虑到这一点,写了一条回复评论,看到你的评论消失,删除了我的回复评论。这是我现在看到的同一条评论,还是一条新评论?因为我的第一句话中不再有“object”,所以我假设它现在是正确的。无论如何,感谢您指出这一点。@LouisWasserman,OP试图从
A
访问代码,但只能从
B
访问受保护的成员。可以说类
B
A
继承受保护的成员,所以现在每个
B
都有这些成员。它不会继承对
A
自身受保护成员的访问权。这个表述更清楚吗?我不认为我对它完全满意,不。每个
B
都有这些成员,无论他们的访问权是
受保护的
还是
私有的
,这只是一个问题,
B
是否可以看到这些成员……OP的代码似乎在演示,
B
中的非静态方法可以访问
a.a
(对于
a
的任何实例)。静态方法不能。“在类级别应用访问”忽略了一点,即某些方法(静态方法)显然无法访问这些字段,但某些方法(实例方法)无法访问这些字段。@LouisWasserman,“for any instance of
A
”部分错了。你在OP的代码里看到了什么?
B
的非静态方法无法访问
A.A
,但它们都可以访问
B.A