父类:
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对象的内存结构到底是什么样子的?
我有些概念不清,谁能给解释一下啊!谢谢
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对象的内存结构到底是什么样子的?
我有些概念不清,谁能给解释一下啊!谢谢
所以在创建Sub时也创建了一个Base
你的子类不过是调用了父类的两个方法来对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之后
这样的话创建一个Sub对象,实际上同时分配了三块内存空间.
调用sub.setStr的时候其实调用的是Base类的对象里的setStr方法是吗?
在上面的例子中setStr和getStr两个方法调用的就是这个看不见的private 类型的变量。private 类型的东西只是在继承的类中不可见,不能直接使用。但是继承的类调用你已经公开的方法,你写的方法是属于父类的,所以它可以随意操作private 类型的东西。就像是你有个记事本(private String str),记着你每天听到的任何事情,但是这个本子是不允许别人看的。当别人让你帮他记下什么事情(setStr("this is Sub str!"))时,你可以记在上面。当他想查它记了什么时你也可以查完了告诉他(getStr())。
我理解是这样的
因为你的子类没有setStr方法
所以他会到父类中查询
然后调用父类的setStr方法
如果你子类重构了这个方法 他就执行子类的重构过后的方法
那么public 继承了 也可以使用
所以 即便你没有重构两个方法 子类中也可以使用这两个方法的
照你的话说 完全是自己的 因为继承了 并且可以使用
如果"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 类型的东西。这段话没理解,不好意思。
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());
}
}
public void setStr(String strchild){
this.str += strchild;
System.out.println("child"+this.str);
}
*/
放开运行试试
再放开下面的试试。
还请高手指导。
不过儿子只有set没有get的时候比较有意思,“进”的时候给自己,“出”的时候拿的却是爹的。呵呵!谢谢了!