问个JAVA的菜鸟问题

kpkui_76 2006-05-31 07:23:47
import java.io.PrintWriter;
public class PointTest
{
public static void main(String args[])
{
PrintWriter out = new PrintWriter(System.out ,true);
MyPoint mp =new MyPoint(4,3);
Point2D p = new Point2D(11);
Point2D q=mp;
mp.x=5;mp.y =12;
out.println("\n\t DataMember Access Test:\n");
out.println("mp = (" + mp.x + ", "+mp.y+")");
out.println("p = (" + p.x + ", "+p.y+")");
out.println("q = (" + q.x + ", "+q.y+")");
out.println("\n\t CastingTest:\n");
out.println("(Point2D)mp = (" + ((Point2D)mp).x + "," +((Point2D)mp).y + ")");
out.println("(MyPoint)q = (" + ((MyPoint)q).x + "," +((MyPoint)q).y + ")");

}

}

public class Point2D
{
int x,y;
Point2D(){
this(0,0);
}
Point2D(int x)
{
this(x,0);
}
Point2D(int x,int y )
{
this.x=x;
this.y=y;
}
double length()
{
return Math.sqrt(x*x+y*y);
}
}

public class MyPoint extends Point2D
{
int x,y;
MyPoint(int x,int y)
{
super(x,y);
this.x=x;
this.y=y;
}
double length()
{
return Math.sqrt(x*x+y*y);
}
double distance()
{
return Math.abs(length()-super.length());
}

}


运行结果是 :

DataMember Access Test:

mp = (5, 12)
p = (11, 0)
q = (4, 3)

CastingTest:

(Point2D)mp = (4,3)
(MyPoint)q = (5,12) ??我这里不是很清楚,请问为什么是 (4,3)和 (5,12)
...全文
323 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
tlowl 2006-06-01
  • 打赏
  • 举报
回复
这个例子中的知识点应该是JAVA基础中最难理解的一个了,叫做动态邦定,是多态的一种

首先,Point2D q=mp; 其实相当于 Point2D q=new MyPoint(4,3);
动态邦定有一个特点就是生成的是子类的对象,但是使用的其实都是父类的属性和方法,而q若要想使用指向的对象MyPoint类中的属性和方法,就得强制转型,就像(MyPoint)q,这种方法也叫向下转型,但是向下转型必须以Point2D q=new MyPoint(4,3);这种方式声明对象,像MyPoint mp =new MyPoint(4,3);这样声明对象就不能使用向下转型;与此相反,向上转型就没有这样的限制,就像MyPoint mp =new MyPoint(4,3);声明的对象可以直接使用向上转型(Point2D)mp

换句通俗的话讲,子类一定是一个父类(extends关键字),而父类则不知道那些类是自己的子类
wanpengd 2006-06-01
  • 打赏
  • 举报
回复
建议你用eclipse的调试工具,然后设置断点,一步步的看内存中的对应的值。你就一目了然了
wcj1981 2006-06-01
  • 打赏
  • 举报
回复
动态邦定有一个特点就是生成的是子类的对象,但是使用的其实都是父类的属性和方法
?????????????????????

这句不知道是不是很确切?当然已经理解的人知道你说的是什么意思。

但是,严格说,它并一定是使用父类中的方法,当子类没有覆盖相应方法的时候,使用的是父类的方法,但是如果覆盖的话,使用的就是子类中的方法。

当然,动态绑定确实有很多的优势。如果想掌握其中的应用,也不是那么简单。
tlowl 2006-06-01
  • 打赏
  • 举报
回复
打错字了,是一个的关系
tlowl 2006-06-01
  • 打赏
  • 举报
回复
楼上的应该好好的看一看关于面向对象中继承、关联、聚集、组合等关系方面的知识,继承关系就是“is-a”的关系,也就是使一个的关系,举个例子,有一个父类Person,两个子类Student和Teacher,你可以说学生是一个人,老师是一个人,但是你不能说人是一个学生,不知道这样讲是否能理解
For_suzhen 2006-06-01
  • 打赏
  • 举报
回复
不好意思,说错了,是楼主的x,y
For_suzhen 2006-06-01
  • 打赏
  • 举报
回复
子类一定是一个父类(extends关键字),而父类则不知道那些类是自己的子类
????????????????????
为什么子类一定是一个父类,楼上地把话说清楚好不好,总之把父类强转成子类肯定不行。
还有,你的x,y能不能不这样赋值啊,题外话,别生气啊
kpkui_76 2006-05-31
  • 打赏
  • 举报
回复
这个是 JAVA 2从入门到精通 书中的例子啊
商科程序员 2006-05-31
  • 打赏
  • 举报
回复
像题目中的这种问题比编译报错可要危险得多.
对非开发程序员来说, 只知道子类可以转成父类. 但并不知道转成父类会很危险.
我想像楼主程序这样的代码是不是不提倡写? 也就是不提倡父类与子类有同样名称的变量和方法?
kpkui_76 2006-05-31
  • 打赏
  • 举报
回复
return Math.abs(this.length()-super.length());
商科程序员 2006-05-31
  • 打赏
  • 举报
回复
帮顶 and 关注,请高手解答.

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧