父类:
public class Base { private String str = "this is Base str"; public String getStr() {
return str;
} public void setStr(String str) {
this.str = str;
}
}子类是空的:
public class Sub extends Base {}public class test { public static void main(String[] args) { Sub sub = new Sub();
sub.setStr("this is Sub str!");
System.out.println(sub.getStr());
}}运行结果是 this is Sub str!
在Sub 类中引用this.str是非法的,但是this.setStr()和this.getStr()却是合法的,并且main方法中sub对象调用这两个方法也都没问题,看上去完全是把str当成自己的东西来用的.但是书上说private 类型的属性子类是不能继承的,那么:
sub.setStr把值写到什么地方了?
Sub对象的内存结构到底是什么样子的?
我有些概念不清,谁能给解释一下啊!谢谢

解决方案 »

  1.   

    因为Sub是Base的子类
    所以在创建Sub时也创建了一个Base
      

  2.   

    你在子类中没有直接调用你的String str啊 怎么能说完全巴str当作自己的东西呢
    你的子类不过是调用了父类的两个方法来对str操作
    所以是没有问题的
    如果你在子类直接操作str肯定是不允许的 证明了private是不能被继承的
    但是你的两个方法都是public 的 所以子类可以使用
    你提到说sub.setStr把值写到什么地方了
    你可以简单的理解为把值写进父类的private String str中去了
    Sub sub = new Sub();
    System.out.println(sub.getStr());//set之前
    sub.setStr("this is Sub str!");
    System.out.println(sub.getStr());//set之后
      

  3.   

    书上说private 类型的属性子类是不能继承的???不是吧
      

  4.   

    在创建Sub对象时也创建了一个Base类的对象,那么同时也创建了一个Object类对象是吗?
    这样的话创建一个Sub对象,实际上同时分配了三块内存空间.
    调用sub.setStr的时候其实调用的是Base类的对象里的setStr方法是吗?
      

  5.   

    private 类型的属性子类是不能继承的???是这样的
      

  6.   

    “private 类型的属性子类是不能继承的”,你对这句话的理解有问题,他所说的不能继承是指你在子类中不能使用,既不可见。但它是存在的。
    在上面的例子中setStr和getStr两个方法调用的就是这个看不见的private 类型的变量。private 类型的东西只是在继承的类中不可见,不能直接使用。但是继承的类调用你已经公开的方法,你写的方法是属于父类的,所以它可以随意操作private 类型的东西。就像是你有个记事本(private String str),记着你每天听到的任何事情,但是这个本子是不允许别人看的。当别人让你帮他记下什么事情(setStr("this is Sub str!"))时,你可以记在上面。当他想查它记了什么时你也可以查完了告诉他(getStr())。
      

  7.   

    调用sub.setStr的时候其实调用的是Base类的对象里的setStr方法是吗?
    我理解是这样的
    因为你的子类没有setStr方法
    所以他会到父类中查询 
    然后调用父类的setStr方法
    如果你子类重构了这个方法 他就执行子类的重构过后的方法
      

  8.   

    对的,不能说是"完全是把str当成自己的东西来用的",但setStr 和getStr两个方法应该"完全是自己的东西"吧?
      

  9.   

    恩 六楼说了 其实继承了private 但是无法使用
    那么public 继承了 也可以使用
    所以 即便你没有重构两个方法 子类中也可以使用这两个方法的
    照你的话说  完全是自己的 因为继承了 并且可以使用
      

  10.   

    to  publicvoidstaticmain() : 我觉得我前后两种说法是相互矛盾的,你好像也跟着我矛盾了。
    如果"sub.setStr的时候其实调用的是Base类的对象里的setStr方法"那么,setStr 和getStr两个方法应该就应该不是sub"自己的东西"。借鉴你前面的说法
    在构建sub对象的时候,同时构建了sub和base两个对象。在sub对象里面有两个成员:setStr() 和getStr(),而base对象里有三个成员:String str、setStr() 和getStr()。
    sub.setStr("this is Sub str!");这句执行的时候是用sub对象的成员方法给base对象的成员属性赋值。不知道我这种理解正不正确。cnmahj() 说的:private 类型的东西只是在继承的类中不可见,不能直接使用。但是继承的类调用你已经公开的方法,你写的方法是属于父类的,所以它可以随意操作private 类型的东西。这段话没理解,不好意思。
      

  11.   

    class ParentPrivate {
    private String str = "";
    public void setStr(String str){
    this.str = str;
    System.out.println("save str "+this.str);
    }
    public String getStr(){
    return this.str;
    }
    }
    public class TestExtendPrivate extends ParentPrivate {
    private String str = "xxxx";
    /**
    public void setStr(String strchild){
    this.str += strchild;
    System.out.println("child"+this.str);
    }
    */
    /**
    public String getStr(){
    return this.str;
    }
    **/
    public static void main(String args[]){
    ParentPrivate tep = new TestExtendPrivate();
    tep.setStr("parent save");
    System.out.println(""+tep.getStr());
    }
     
    }
      

  12.   

    PS:把/**
    public void setStr(String strchild){
    this.str += strchild;
    System.out.println("child"+this.str);
    }
    */
    放开运行试试
    再放开下面的试试。
      

  13.   

    private 类型的属性子类是不能继承的,可以被继承,只是不能被继承的类直接访问把、
    还请高手指导。
      

  14.   

    meconsea(罂粟(mecon)) 给的代码非常好,明白了。原来是儿子把爹背在了背上,自己没有钱包的时候用的都是爹的,挣的钱也是给爹存着。自己有了钱包才是往自己包里存。
    不过儿子只有set没有get的时候比较有意思,“进”的时候给自己,“出”的时候拿的却是爹的。呵呵!谢谢了!