java程序疑问:关于引用父类和子类对象的创建。下面实例为什么会"调用MyPoint类的无参数构造方法”?

为什么运行最后一个程序中的MyCircleobj=newMyCircle(10,10,5)会"调用MyPoint类的无参数构造方法“??============以下是文件... 为什么运行最后一个程序中的MyCircle obj=new MyCircle(10,10,5)会"调用MyPoint类的无参数构造方法“??
============以下是文件MyPiont.java的内容===============
package mylib.myclasses.mygraph;
public class MyPoint {
/**构造方法,点坐标值设置为(0,0)*/
public MyPoint( ) {
System.out.println("调用MyPoint类的无参数构造方法");
}

/**构造方法,创建一个坐标值为(x,y)的点
public MyPoint(int x,int y) {
this.x=x;
this.y=y;
}

public String toString() {
return "("+x+","+y+")";
}
}
==========以下是文件MyCircle.java的内容==============
package mylib.myclasses.mygraph;

public class MyCircle extends MyPoint {
protected int radius;//声明圆的半径
public MyCircle( ) {
System.out.println("调用MyCircle类的无参数构造方法");
}

public MyCircle(int x,int y, int radius) {
this.x=x;
this.y=y;
this.radius=radius;
}

public String toString() { //覆盖父类的方法
return "圆心:"+super.toString()+"; 半径:"+radius;}
}
}
//TestMyCircle2.java
import mylib.myclasses.mygraph.MyCircle;
==========以下是文件TestMyCircle2.java的内容==============
public class TestMyCircle2 {
public static void main(String args[]) {

MyCircle
obj=new MyCircle(10,10,5);

System.out.println(obj.toString());
}
}运行结果如附图
我重新把程序简化了一下,便于大家阅读。
//TestMyCircle3.java
public class TestMyCircle3 {
public static void main(String args[]) {
MyCircle obj=new MyCircle(10,10,5);
System.out.println(obj.toString());
}
}
class MyPoint {
int x,y;
/**构造方法,点坐标值设置为(0,0)*/
public MyPoint( ) {
System.out.println("调用MyPoint类的无参数构造方法");
}
public MyPoint(int x,int y) {
this.x=x;
this.y=y;
}
public String toString() {
return "("+x+","+y+")";
}
}
class MyCircle extends MyPoint {
protected int radius;//声明圆的半径
public MyCircle( ) {
System.out.println("调用MyCircle类的无参数构造方法");
}
public MyCircle(int x,int y, int radius) {
super(x,y);
/*this.x=x;
this.y=y;*/
this.radius=radius;
}
}
相关程序运行结果如下:
展开
 我来答
百度网友8c279b4
2012-09-16 · TA获得超过276个赞
知道小有建树答主
回答量:80
采纳率:0%
帮助的人:65.9万
展开全部
因为MyCircle类继承了MyPoint类,java中构造子类的过程是先构造出该子类的所有父类后再构造子类。你使用MyCircle(int ,int ,int)构造方法构造MyCircle类对象,因为这个构造方法中没有显示调用父类的构造方法,所以为了构造父类对象就会调用父类不带参数的构造方法也就是MyPoint()。如果你在MyCircle(int ,int ,int)构造方法中显示调用父类的super(int ,int)构造方法,那么它就会调用MyPoint类的MyPoint(int,int)构造方法来构造这个父类对象。你可以从一个现象中来理解这个机制:为什么子类可以调用父类属性和方法?子类能够调用就说明子类已经有了这个属性和方法才能够调用到,所以子类中必然含有父类的对象,你可以粗浅的看做子类封装了一个父类对象。
wangchaojunooo
2012-09-16 · TA获得超过548个赞
知道小有建树答主
回答量:609
采纳率:0%
帮助的人:501万
展开全部
构造子类的时候,是会首先构造父类,然后加入子类中的定义的部分
你父类只有一个构造方法,当然会被调用了
追问
父类MyPoint有两个构造方法啊:

/**构造方法,点坐标值设置为(0,0)*/
public MyPoint( ) {System.out.println("调用MyPoint类的无参数构造方法"); }

/**构造方法,创建一个坐标值为(x,y)的点
public MyPoint(int x,int y) { this.x=x; this.y=y;}
追答
那你就改一下啊,这里有问题

public MyCircle(int x,int y, int radius) {
this.x=x;
this.y=y;
this.radius=radius;
}
应该是

public MyCircle(int x,int y, int radius) {
this.x=x;
this.y=y;
this.radius=radius;
super(x, y);

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式