我只有这么多了?不会让我头一次到Java里问兄弟们就不给面子哈?

NewOracler 2002-03-20 10:26:41
class Point{
int x;
int y;
Point(int x,int y){
this.x=x;
this.y=y;
}
Point(int x){
this(x,0);
}
Point(){
this(0,0);
}
double length(){
return Math.sqrt(x*x+y*y);
}
}
//以上是类Point的申明
class MyPoint extends Point{
//——————————Edit One--------------//
//int x;
//int y;
//——————————Edit One--------------//
int x=100;
int y=100;
MyPoint(int x,int y){
//----------------Edit Two-------------//
//this.x=super.x=x;
//this.y=super.y=y;
//_________________Edit Two-----------//
//学习于2002-3-20日
this.x=x;
this.y=y;
}
double length(){
return Math.sqrt(x*x+y*y);
}
double distance(){
return Math.abs(length()-super.length());
}
}
//以上是类MyPoint的申明
class PointTest{
public static void main(String[] args){
MyPoint mp = new MyPoint(4,3);
Point p = new Point(1,1);
Point q = mp;
mp.x=5;
mp.y=12;
System.out.println("\n\tData Access Test:\n");
System.out.println("mp=("+mp.x+","+mp.y+")");
System.out.println("p=("+p.x+","+p.y+")");
System.out.println("q=("+q.x+","+q.y+")");
System.out.println("\n\tCasting Test:\n");
System.out.println("(Point) mp=("+((Point)mp).x+","+((Point)mp).y+")");
System.out.println("(MyPoint)q="+((MyPoint)q).x+","+((MyPoint)q).y+")");
System.out.println("\n\tMethod Member Access Test:\n");
System.out.println("mp.length()="+mp.length());
System.out.println("p.length()="+p.length());
System.out.println("q.length()="+q.length());
System.out.println("mp.distance()="+mp.distance());
}
}
首先我给出的是我的代码:希望大家能认真阅读,我的问题是:
1:为什么在System.out.println("q=("+q.x+","+q.y+")");中输出是:4,3
2:我现在修改:参见Edit One 和Edit Two这里!结果输出是:System.out.println("q=("+q.x+","+q.y+")");是:0,0
谢谢大家了!
我只有这么多分了!
...全文
30 点赞 收藏 10
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
fox_blue 2002-03-27
在Casting Test中问题也是由于继承中的成员类型引起的
回复
fox_blue 2002-03-27
MyPoint mp = new MyPoint(4,3);
隐含调用了Point.point();而这个方法 调用了Point.point(0,0)
即: MyPoint mp = new MyPoint(4,3);依次调用的次序为:
Point.Point()---〉Point.Point(0,0)---〉MyPoint.MyPoint(4,3);
而在类Point中 int x;int y;皆为protected类型,因此虽然
Point q = mp; 可是q.x,q.y 仍旧引用的是 超类中的成员 (0,0)
回复
hujianok 2002-03-26
同意junylee(沙子) 的看法。

bluebird97073(烂鸟) 把this.x=super.x=x; 解释为下面这样是站不住脚的:
this.x=super.x; (super.x=0。所以this.x=0)
super.x=x;
应解释为
super.x=x;
this.x=super.x;

回复
JunyLee 2002-03-26
NewOracler(一半是青蛙,一半是MM) :
你想一想,假设把Point中的x,y定义为a,b。那么q=mp, q.a会引用mp的x吗?同样道理,q是Point的实例,q所控制的内存空间是Point的x,y,而非MyPoint的x,y
回复
NewOracler 2002-03-21
JunyLee(沙子) :
为什么不回引用MyPoint的x,y 呢?
我的问题就是这个,就是想知道为什么?
谢谢!
高手出来哈!
回复
bluebird97073 2002-03-20
1.mp.x=4.mp.y=3
而你Point q = mp;
q和mp指向同一对象~~所以q.x=4,q.y=3



2.
改动后
注意:this.x=super.x=x;
其实就是
this.x=super.x; (super.x=0。所以this.x=0)
super.x=x;

回复
promark 2002-03-20
to NewOracler
我的输出为:
Data Access Test:

mp=(5,12)
p=(1,1)
q=(0,0)

Casting Test:

(Point) mp=(0,0)
(MyPoint)q=5,12)

Method Member Access Test:

mp.length()=13.0
p.length()=1.4142135623730951
q.length()=13.0
mp.distance()=13.0

同时建议,在子类中不要再定义x,y了,这样会和父类引起混淆
在你的程序中,子类不但有自己的x,y,还有父类的x,y,所以只要进行了转化
(把子类对象转为父类对象)再使用x,y,就是父类的x,y,当然为0了
回复
NewOracler 2002-03-20
哎!
难道就不愿意看吗?还是看的没明白啊?
怎么回事啊??
高手呢?出来啦!
回复
JunyLee 2002-03-20
我的看法是,在父类中定义了x,y,在子类继续定义x,y,那么在实例MyPoint对象时,分配了四个变量空间给MyPoint,两个是Point的x,y(因为继承),另外两个是MyPoint的x,y。q=mp,则q不会引用MyPoint的x,y,而是前面的x,y。

我的这个看法正确吗?
回复
NewOracler 2002-03-20
To:promark()
首先谢谢你的回答!
我的意思是这样的,在要注意在我的程序中标了EditOne和EditTwo的!你把它的注释给去了,把她下面的添加上输出就3,4了!我的意思就是问你这个!谢谢!(你可以试试以下代码:)
class Point{
int x;
int y;
Point(int x,int y){
this.x=x;
this.y=y;
}
Point(int x){
this(x,0);
}
Point(){
this(0,0);
}
double length(){
return Math.sqrt(x*x+y*y);
}
}
//以上是类Point的申明
class MyPoint extends Point{
int x;
int y;
MyPoint(int x,int y){
//学习于2002-3-20日
this.x=super.x=x;
this.y=super.y=y;
//学习于2002-3-20日
//this.x=x;
//this.y=y;
}
double length(){
return Math.sqrt(x*x+y*y);
}
double distance(){
return Math.abs(length()-super.length());
}
}
//以上是类MyPoint的申明
class PointTest{
public static void main(String[] args){
MyPoint mp = new MyPoint(4,3);
Point p = new Point(1,1);
Point q = mp;
mp.x=5;
mp.y=12;
System.out.println("\n\tData Access Test:\n");
System.out.println("mp=("+mp.x+","+mp.y+")");
System.out.println("p=("+p.x+","+p.y+")");
System.out.println("q=("+q.x+","+q.y+")");
System.out.println("\n\tCasting Test:\n");
System.out.println("(Point) mp=("+((Point)mp).x+","+((Point)mp).y+")");
System.out.println("(MyPoint)q="+((MyPoint)q).x+","+((MyPoint)q).y+")");
System.out.println("\n\tMethod Member Access Test:\n");
System.out.println("mp.length()="+mp.length());
System.out.println("p.length()="+p.length());
System.out.println("q.length()="+q.length());
System.out.println("mp.distance()="+mp.distance());
}
}
此代码执行的结果就是我上面说的那种情况?为什么回输出3,4呢?谢谢了!
(我在研究java的面向对象的特性)
回复
发帖
非技术区
创建于2007-09-28

2.3w+

社区成员

Java 非技术区
申请成为版主
帖子事件
创建了帖子
2002-03-20 10:26
社区公告
暂无公告