作者orze04 (orz)
看板java
标题[问题] 关於物件的"="
时间Tue Mar 26 12:31:51 2013
public class QQ {
public static void main(String[] args){
child c1 =
new child();
parent p1 =
new parent();
System.
out.println(p1.toString()+" "+c1.toString());
System.
out.println(
"p1.i: "+p1.i);
p1.show();
System.
out.println(
"c1.i: "+c1.i);
c1.show();
System.out.println(
"");
p1=c1;
System.
out.println(p1.toString()+" "+c1.toString());
System.
out.println(
"p1.i: "+p1.i);
p1.show();
System.
out.println(
"c1.i: "+c1.i);
c1.show();
System.out.println(
"");
}
}
class parent{
int i;
parent(){}
void show(){
System.out.println("show p1.i: "+i);
}
}
class child
extends parent{
int i=1;
child(){}
void show(){
System.out.println("show c1.i: "+i);
}
}
result:
parent@14a55f2 child@15093f1
p1.i: 0
show p1.i: 0
c1.i: 1
show c1.i: 1
child@15093f1 child@15093f1
p1.i: 0
<<~~!?
show c1.i: 1
c1.i: 1
show c1.i: 1
在执行
p1=c1後
透过hashCode可以看到p1和c1已经变成同样内容
为何要显示p.i时还是指向parent的class?
还是说
p1=c1只有methodc会被盖掉,本身成员变数不会?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.136.150.29
1F:推 superlubu:因为 parent.i 之後你又在 child delcare 了自己的 i 03/26 12:39
2F:→ orze04:我的意思是为甚麽p1.i还是0 ? 03/26 12:56
3F:推 popcorny:因为变数同名不会override,而是shadow..Child会有两份i 03/26 13:18
5F:→ orze04:理解 不过这样反而有另外一问题 toString到底是怎麽计算的? 03/26 13:28
6F:→ popcorny:toString当然就是因为是同个物件,印出来的资讯当然一样 03/26 13:56
7F:→ orze04:那既然是同个物件 为何p的i不是1? 03/26 16:51
8F:推 mars90226:p是被当成Parant使用,所以i是0,如果转型成Child就是1 03/26 17:23
9F:→ orze04:p1=c1後 p1就已经是child了 看hashcode也能证明他是child 03/26 17:54
10F:推 mars90226:我测试转型了一下没错啊... 03/26 19:54
11F:推 sonygood:p1(父)=c1(子)为自动转型,位置被c1取代了,但是型态为父 03/26 23:13
12F:推 pzyc79:你观念错了p1=c1後 你还是要把p1当成Parnat用 因为你是这样 03/27 16:32
13F:→ pzyc79:宣告的. 写多型不会考虑到他实体物件... 因为你不可能知道 03/27 16:35