子类对象能访问父类对象中的protected域吗?

IdHelloWorld 2015-03-17 09:47:07
《java核心技术》第9版卷一168页有这句话:
Manager类中的方法只能访问Manager对象中的hireDay域,而不能访问其他Employee对象中的这个域。
(注:Manager是Employee的子类,hireDay域是Employee的protected域)

然后,我试了一下,发现不是这样。
class P{
protected int a;
public P(){}
public P(int a){
this.a = a;
}
}

class C extends P{
public int b;
public C(){}
public C(int a,int b){
super(a);
this.b = b;
}
public void fun(){
a++;
P p = new P(10);
System.out.println("C.a= " + a);
System.out.println("P.a= " + p.a);
}
}

public class Demo {
public static void main(String[] args) {
C c = new C(100,200);
c.fun();
}
}

是不是这本书出错了?
...全文
840 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
galiniur0u 2017-05-19
  • 打赏
  • 举报
回复
针对于这里的不能访问是指父子类不在同一个包内时,子类是不能访问父类以及其它子类中继承来的protected变量。楼主可以将P类移动到另一个包中,并实现继承。此时不能通过实例化父类访问父类的Protected变量。
PJLN 2017-05-16
  • 打赏
  • 举报
回复
可以访问的!protected就是为子类准备的,为什么不能访问?
qq_38687599 2017-05-16
  • 打赏
  • 举报
回复
三楼说的不对,不同包的子类时可以访问的,默认修饰符下,不同包子类无法访问
guangzhanzb 2017-05-15
  • 打赏
  • 举报
回复
引用 4 楼 guangzhanzb 的回复:
你这么写确实是不可以的。 书中有个词你要注意下“对象”,这个对象只是是与你子类有继承关系的对象,而不是有引用关系的对象。 如果像你那么写
P p = new P(10);
的p与当前C类的关系是从属,即常说的has-a,p与C类的对象并没有继承关系,自然也就没有访问权限了。 正确的写法是什么,你应该使用this或者super,即你打印那个代码改成
System.out.println(this.a);//或者super.a
。 最后补充一点,如果你把P中的a属性声明为static的,那么你报错那里同样是可以通过P.a访问到的,因为他们的类也是有继承关系的,类变量自然有访问权限。
p对象与当前C类的对象的关系是从属,即常说的has-a……前面说的不严谨,补充下。
guangzhanzb 2017-05-15
  • 打赏
  • 举报
回复
你这么写确实是不可以的。 书中有个词你要注意下“对象”,这个对象只是是与你子类有继承关系的对象,而不是有引用关系的对象。 如果像你那么写
P p = new P(10);
的p与当前C类的关系是从属,即常说的has-a,p与C类的对象并没有继承关系,自然也就没有访问权限了。 正确的写法是什么,你应该使用this或者super,即你打印那个代码改成
System.out.println(this.a);//或者super.a
。 最后补充一点,如果你把P中的a属性声明为static的,那么你报错那里同样是可以通过P.a访问到的,因为他们的类也是有继承关系的,类变量自然有访问权限。
attilax 2015-03-19
  • 打赏
  • 举报
回复
这个是可以访问的,,你的书打印错误了...
飏飏一蝶 2015-03-19
  • 打赏
  • 举报
回复
子类和父类在不同包下这种情况是不可以的
三仙半 2015-03-17
  • 打赏
  • 举报
回复
你都试验过了可以,那就是可以,呵呵,书是要看的,也别太迷信

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧