子类实例化时候调用父类带参构造方法出错

子类实例化时候调用父类带参构造方法出错

这是父类信息

public class Animal {

// 属性:kind(种类)

private  String kind;

public Animal() {

}

//创建带参(king为参数)构造函数

public Animal(String kind) {

this.kind = kind;

}

这是子类

public class Cat extends Animal {

public Cat() {

super(kind);//系统显示出错

}

我希望实例化子类的时候,加载的是父类带参构造方法,所以我在子类无参构造方法中,第一行加了super(kind)特意指明我要调用父类的带参,构造方法,但是系统出错,一直不明白错在哪?如果是调用父类无参的构造方法,super();就可以

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

4回答
__LiYun__ 2018-07-21 13:24:44

kind,你是要用父类的private String kind的话,那直接改为public String kind;

如果是调用父类的有参,那程序会先执行父类构造方法(父static->子static->父无static->子无static),而此时子类的的kind没有定义值并进入父类执行,类型不定义肯定不行,所以编译错误.

以下两点为解决方法:

①在子类定义变量kind类型,并且添加为static,这样走在父类有参构造前,如

static String kind;

public Cat() {

super(kind);

}即可顺利编译

②子类使用有参方法调用父类有参方法,如下:

public Cat(String kind) {

super(kind);

}

建议第二种,课程中的

希望能解答你这个问题.


今天没有敲代码 2018-07-12 10:53:16

你的问题是在无参构造里调用了父类的有参构造,肯定会出错的。

Cat的正确构造函数如下:

public Cat(String kind) {
   super(kind);
}

public Cat() {
}

慕数据3565510 2018-07-08 19:31:53

创建一个Cat a=new Cat(),然后a就会运行到public Cat()无参构造,然后运行到super(kind),跳到

public Animal(String kind) {

this.kind = kind;

}

全程没有对变量kind赋值的地方,在public Cat()无参构造中添加个参数可能就对了,至于这么写为啥不对,我也不知道,有没有大神解答下,持续关注中

  • 在类的初始化中,需要先执行父类的构造器,再执行子类构造器,当在父类构造器加载时检查到kind(因为是在子类中)其实并未有kind的加载,所以jvm检测到就报错。
    2018-07-09 10:19:36
  • 了解,谢谢解答
    2018-07-09 14:33:26
irista23 2018-04-23 15:38:14

你可以试一下在子类Cat中,把传入kind定义成static。因为如果是非static,在父类构造器加载时(相当于参数赋值时)检查到kind(因为是在子类中)其实并未有kind的加载入,所以jvm检测到就报错。

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师