java中父类在子类中创建父类对象是不是也会掉用对应子类的构造函数?

classCircle{doubler;//半径publicstaticdoublepi=3.14;//固定不变的publicCircle(doubler){this.r... class Circle{

double r; //半径

public static double pi = 3.14; //固定不变的

public Circle(double r){
this.r = r;
}

//计算面积
public final void getArea(){
System.out.println("圆形的面积是:"+r*r*pi);
}
}

class Demo2 extends Circle
{

public Demo2(double r){

super(r);
}

public static void main(String[] args)
{

Circle c = new Circle(4.0);
}

}
//注释掉子类的构造方法后编译失败这是为什么
展开
 我来答
貌似風輕
推荐于2016-09-23 · TA获得超过7280个赞
知道大有可为答主
回答量:1672
采纳率:94%
帮助的人:700万
展开全部

在子类中创建父类对象的实例不会调用子类的构造函数

你这里注释掉子类构造方法报错不是因为

Circle c = new Circle(4.0);

你可以试下吧这行代码也注释掉,你会发现不new 父类对象一样会报错。

 

现在来说说编译报错的原因。

首先说两点:

  1. 子类构造方法会调用父类构造方法

  2. 如果不写构造方法,java是默认了创建一个无参构造方法。而一旦自定义了一个构造方法,那么不论这个构造方法的参数情况是怎样的,默认的无参构造方法都不会再创建。

这里父类自定义类一个public Demo2(double r)的构造方法,所以没有无参构造方法了只有这一个构造方法。

子类你也自定义类一个构造方法,然后去调用了父类构造方法,这样没有问题。

如果把子类的构造方法注释掉,现在子类没有自定义构造方法了,创建默认构造方法。

public Demo2() {
  super();   // new Circle();
 }

默认无参构造方法去调用父类的无参构造方法,但是父类没有无参构造方法,所以报错。

 

你在父类中加一个无参构造方法,就会发现这个错误消失了。

public Circle() {
 }
更多追问追答
追问
注释掉Circle c = new Circle(4.0);不会报错哦,
我在想是不是在继承关系中,父类在子类中创建对象时,是不是jvm调用构造函数受到了限制。又正好我发现加了public Demo2(double r){
super(r);又编译成功了,又或者去掉 extends Circle也能编译成功,所以我才会想到是不是调用了子类构造方法去调用父类构造方法。。
追答

注释掉Circle c = new Circle(4.0);依然是会报错的

报错为:Implicit super constructor Circle() is undefined for default constructor. Must define an explicit constructor

就是我前面说的原因,子类Demo2的默认无参构造方法去调用父类Circle的无参构造方法,但父类又没有无参构造方法,所以报错了。

“super constructor Circle() is undefined”

百度网友12ee0fd
2015-09-08 · TA获得超过4.7万个赞
知道大有可为答主
回答量:1.1万
采纳率:66%
帮助的人:1970万
展开全部
因为父类没有无参数构造方法。所以注释掉子类构造方法就会编译失败。

子类不提供显式的构造方法,编译器会生出一个默认的无参数构造方法,这个方法会调用父类的无参数构造方法,没有就会报错
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友85cd0964c
2015-09-08 · TA获得超过385个赞
知道小有建树答主
回答量:204
采纳率:0%
帮助的人:248万
展开全部
java默认的构造方法是无参的,也就是说你注释掉那个构造方法之后,它自己会保留一个默认的构造方法public Demo2(){super();}。而父类由于你没有写无参的构造方法,所以super()这个方法是不存在的,所以会编译失败。
为了防止这种情况发生,一般我们的编程习惯是,如果需要有参的构造方法,那么我们同时也需要定义一个无参的构造方法--这句话同时适用于你的子类和父类。
另外,一个最简单的方法来验证我说的话就是,你在注释掉子类的构造方法的时候同时也注释掉父类的构造方法,然后你在main方法里把4.0去掉,那么编译时可以通过的。
追问
不知道你发现我是在子类中创建的父类的对象没?我知道在创建子类对象时是会在注释掉子类的构造方法的时候同时也注释掉父类的构造方法,然后在main方法里把4.0去掉,那么编译时可以通过的。所以我才会问,父类是不是在创建对象的时候,jvm是不是也调用了子类的对应的构造函数去调用父类的构造函数初始化对象。
追答
创建父类对象的时候,跟子类一点关系也没有,JVM只调用父类的构造方法;创建子类对象的时候,JVM会先调用父类的构造方法,然后继续执行子类构造方法额外的部分。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式