答:
这是我仿照你代码写的示例:
/**
* aa 实体类
*/
public class aa {
protected Integer c = 0;
}
/**
* bb实体类 继承 aa实体类
* NoArgsConstructor 无参构造注解
*/
@NoArgsConstructor
public class bb extends aa {
/**
* 在bb实体类运行
*/
public static void main(String[] args) {
bb bb = new bb();
int fw = bb.fw();
System.out.println("fw: " + fw);
System.out.println("bb.c: " + bb.c);
}
public int fw() {
aa ac = new aa();
System.out.println("c: " + c);
System.out.println("ac.c: " + ac.c);
return c;
}
}
/**
* 测试方法运行
*/
@Test
@SneakyThrows
public void testTemp() {
bb bb = new bb();
int fw = bb.fw();
System.out.println("fw: "+fw);
//System.out.println("bb.c: "+bb.c);
}
在bb类的运行结果:

在测试方法的运行结果:

只有在测试方法里面调用 bb.c 才无法调用

java protected解释
在Java中,protected是一个访问修饰符,用于控制类成员(变量和方法)的可见性。具体来说,protected的访问规则如下:
- 同一包内的访问:如果一个类的成员被声明为
protected,那么该成员可以被同一包中的其他类访问。 - 子类访问:无论子类是否在同一包中,子类都可以访问其父类中的
protected成员。这意味着,即使子类在不同的包中,仍然可以访问父类的protected成员。 - 与
private和public的对比:private修饰符使得成员只能在其所在的类中访问。public修饰符则允许任何其他类访问该成员。
使用protected的主要目的是为了在保持一定封装性的同时,允许子类和同一包中的其他类共享某些信息。这种机制在继承和多态的场景中非常有用。
你代码问题的说明:
其实你可以这样理解, 因为在 aa实体类 里面 c的修饰符是protected,
也就是c 的作用域就只在aa实体类 这个范围里面
bb继承了aa 所以 在bb实体类 里面调用是在这个作用域里的, 然后就是fw和main 的输出都没问题
在测试方法那里, 创建一个bb对象,然后调用fw的方法,实际上也是在bb实体类里面调用aa实体类的c属性,所以也没问题
但是直接在测试方法 bb.c 调用,是直接超出了作用域,所以直接就爆红了