作者bleed1979 (十三)
看板java
标题Re: [问题] 关於物件的"="是什麽概念?
时间Tue Mar 26 18:14:55 2013
这题是继承和有没使用到多型的问题。
有请打开Debugger,以Eclipse为例
在child c1 =new child();的下一行下断点。
然後打开c1,你会发现有两个i,一个是来自parent,一个是child本身。
什麽?你不相信我?
为证明我说的,我把程式稍微加料一下。
在parent p1 =new parent();的下一行加上c1.showSuper();
然後在class child里面加上
void showSuper() {
System.out.println("show c1.super.i: "+super.i);
}
这样就应该了解了。
另外,
如果你有使用C/C++也可以把你原本的code改成C/C++的版本。
像是Visual Studio 2012 Desktop Expression是免费的,
打开Debugger来跑,你会看到child里面还会有一个parent的分支可以打开。
这个Debugger算是做的比较清楚的。
最後,
虽然Java没办法操作指标,但物件指向相当於指标指向的概念。
那toString()是把指标的值印出来。
而C/C++有个%p可以把指标的值印出来
所以你在C/C++下
1 cout << "address of p = " << &p << endl;
2 cout << "address of c = " << &c << endl;
3 printf("value of p = %p\n", p);
4 printf("value of c = %p\n", c);
列1, 2永远不会变的,就是指标本身在记忆体里面的位址。
列3, 4在p转向c之後,两个值会一样。就是toString()所呈现的。
※ 引述《orze04 (orz)》之铭言:
: 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: 114.43.112.210
1F:推 orze04:我的意思是为何"p1.i"还会指向原本p1.i的记忆体位置? 03/26 19:17
2F:→ bleed1979:c1包含有parent的i,当p1指向c1时取i是取c1的parent的i 03/26 19:20
3F:推 orze04:噢噢 这样我就懂了 03/26 19:39
4F:→ mars90226:简单来说,看型别决定用哪个i 03/26 19:55
5F:推 dahanhsi:那为什麽用show()的时候会拿到1呢? 03/26 20:09
6F:→ bleed1979:一开始有讲是多型的问题。。。 03/26 20:17
7F:→ ssccg:这不止是多型问题,而是java预设在child class有同名的时候 03/27 02:03
8F:→ ssccg:method就是override而不是shadow 03/27 02:06
9F:→ ssccg:但像C++、C#是有virtual的method才是override,否则是shadow 03/27 02:07
10F:→ ssccg:而成员变数在各语言都是shadow,因为直接存取变数已经连封装 03/27 02:12
11F:→ ssccg:都没了,如果要多型要对getter/setter做 03/27 02:14
12F:→ bleed1979:只有parent有getI()但child仅继承getI()的情况 03/27 02:24
13F:→ bleed1979:没method override就仍会是parent的。 03/27 02:33
14F:→ bleed1979:应该不是"不止",而是"就是"多型效果有没有出来的问题。 03/27 02:44