java中为什么子类仍然可以通过继承公共方法访问父类的私有变量?

skmtpsh 2010-03-10 05:30:53
代码如下:
public class Interfaces {
public static void main(String[] args) {
Dog d = new Dog(3);
d.enjoy();
Valueable v = (Valueable)d;
System.out.println(d.valueable());
d.setname("aaaa");
System.out.println(d.getname());
System.out.println(d.getf()+"\n");

}
}

interface Valueable {
public int valueable();
}
interface Protectedable {
public void protectedable();
}

abstract class Animal{
private String name;

abstract void enjoy();
public void setname(String name) {
this.name = name;
}
public String getname(){
return this.name;
}
}

class Dog extends Animal implements Valueable,Protectedable {
private int age;

Dog(int age){
this.age = age;
//this.name = name;
}

public void enjoy() {
System.out.println("狗叫");
}
public int valueable() {
return 100;
}
public void protectedable() {
System.out.println("值钱的东西");
}
public String getf() {
return super.getname();
}
}

那子类 d对象里面有没有 name 属性? 不然访问的name 是从哪里来的?
搞不明白了...
...全文
896 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
夜子 2012-05-04
  • 打赏
  • 举报
回复
基础 继承 是继承父类 所有的方法方法属性 除去private 修饰的
shusheng1997 2012-05-04
  • 打赏
  • 举报
回复
javaBean理解清楚这个就不难了.
lliiqiang 2012-05-04
  • 打赏
  • 举报
回复
子类能访问父类公共方法,但是不能访问父类私有属性
真实的蚂蚁 2012-05-03
  • 打赏
  • 举报
回复
我也是11楼这样认为的、

多态么?
aksdn 2012-05-03
  • 打赏
  • 举报
回复 1
父类的任何私有成员变量其实是被子类继承的,这些继承来的成员对子类虽然不可见,但是可以通过
父类的方法去操作他们。我的博客上有篇文章,希望可以帮到你
米谷 2012-05-03
  • 打赏
  • 举报
回复
基础啊。基础很重要。
zhouyong80 2010-03-12
  • 打赏
  • 举报
回复
java的子类有一个隐含的父类的对象的引用。在调用d.setName()方法时,d自动向上转型成了Animal,所以这里调用的是Animal的setName方法,Animal的方法当然能访问它自己的私有属性啊。另一方面Animal类将属性name封装了起来,子类并不能看见这个属性,但Animal类通过一个公有方法使子类可以操作这个属性。不知道我理解的对不对。
tg008007x3 2010-03-12
  • 打赏
  • 举报
回复
基础问题都弄不懂,悲哀!
小孟阿良 2010-03-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 c5153000 的回复:]
是不是可以这样 理解呢 你对父类的这个方法只有查看的权限 没有修改的权限呢?!
[/Quote]
不一定的,父类如果有setName方法,就可以修改了
猫儿爷爷 2010-03-11
  • 打赏
  • 举报
回复
是不是可以这样 理解呢 你对父类的这个方法只有查看的权限 没有修改的权限呢?!
potahai 2010-03-11
  • 打赏
  • 举报
回复
围 观!!!!!!!!!!!!!!!!!!!
liguang168 2010-03-11
  • 打赏
  • 举报
回复
这个问题不要回答了吧,慢慢理解就行了。
Dazzlingwinter 2010-03-11
  • 打赏
  • 举报
回复
既然提供了public的方法去访问私有变量,说明可以间接地访问私有变量,但是直接访问是不行的
Defonds 2010-03-10
  • 打赏
  • 举报
回复
引用 3 楼 skmtpsh 的回复:
但一般的那个 是 先New出来的对象,之后用对象的getname,取得name的值 那个name值是对象的属性啊  现在子类继承之后 Name没有怎么 调用的啊
那个 name 不是它的。如果是它的,它就可以调用了。

class Dog extends Animal implements Valueable,Protectedable {
private int age;

Dog(int age){
this.age = age;
this.name = "aaaa";
}

public void enjoy() {
System.out.println("狗叫");
}
public int valueable() {
return 100;
}
public void protectedable() {
System.out.println("值钱的东西");
}
public String getf() {
return super.getname();
}
}
代码中的红色部分编译不让通过,就是说子类没有 name 属性,它无权调用。
sciolist 2010-03-10
  • 打赏
  • 举报
回复
这不就是封装的目的么?
skmtpsh 2010-03-10
  • 打赏
  • 举报
回复
但一般的那个 是 先New出来的对象,之后用对象的getname,取得name的值 那个name值是对象的属性啊 现在子类继承之后 Name没有怎么 调用的啊
pywepe 2010-03-10
  • 打赏
  • 举报
回复
子类是访问了父类的方法,记住是方法而不是属性

父类的方法操作了私有属性,这跟子类没有任何关系
梦_枫 2010-03-10
  • 打赏
  • 举报
回复
java中子类本来就可以通过继承公共方法访问父类的私有变量啊,

就算不是父子关系,一个类也可以通过另一个类的公共方法访问它的私有变量了。。。。
像我们经常用的实体Bean都是这么实现的啊,,,,,


62,612

社区成员

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

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