2 couragegeorge CourageGeorge 于 2015.07.13 19:21 提问

java子类构造方法的问题--必须要先调用父类的构造方法么?

好像有这样一说法在子类的构造方法中,如果没有调用父类的构造方法,就会默认加一个super()
如果父类没有这一构造方法,就会报错。我想问java在子类的构造方法时候是先检验是否能生成父类的对象还是先检测是否调用了该子类的其他构造方法,因为我这样试了试通过了编译。图片说明

7个回答

tongyi55555
tongyi55555   2015.07.13 20:59
已采纳

我的理解是18-19之间是没有调用的,因为下面的这句话就说明了19行的内容其实是等价于直接执行三个参数的构造方法,真正需要执行super的是在这三个参数的构造方法中。

this("George", 10, school);
devmiao
devmiao   Ds   Rxr 2015.07.13 23:11

是的,但是默认会调用无参数的构造函数。如果你没有定义无参数的构造函数但是定义了别的构造函数,就需要自己去调用super了。

Evankaka
Evankaka   Ds   Rxr 2015.07.13 22:13

你上面的程序是没问题,但是这里要注意。默认的无参构造函数没有生成了。如果生成
Student student=new Student();会报错。所有重载了有参的构造函数,一般最好也把无参的自己写上。当然,里面第一句就是super()

frank_20080215
frank_20080215   2015.07.13 23:35

子类的构造方法中,如果没有调用父类的构造方法,就会默认加一个super()。
那么调用父类的构造方法就是默认构造函数

SunliyMonkey
SunliyMonkey   2015.07.13 19:33

你这样编译没有问题呀。

默认情况下,如果类中没有构造函数,其自带一个没有参数的构造函数。(首先super(),一般情况下都没有错)

我觉得你可以这样理解:

继承父类, 就获得其成员变量,成员函数的使用。
因此需要对这些成员变量做一些初始化工作。
这个从逻辑上是应该如此的。
父类初始化完成后,再接着初始化本身的成员变量。

而编译器,为了防止你遗忘这个逻辑顺序。也许就添加了一个检查规则: 查看子类的构造函数中是否有父类的构造函数

CourageGeorge
CourageGeorge 我想问一下18与19行之间执行了super()了没 应该是是没有 因为父类的构造方法被重载。这是不是可以说明并不是必须先检测父类的构造方法 只要检测在生成子类之前父类已经被构造就ok
大约 3 年之前 回复
YYWW1110
YYWW1110   2017.06.13 22:18

class Student extends Person {
private String school;
Student (String name,String school){

    //this(name,school,"beijing");
        super();
}
Student(String n,String l,String school){
    super(n,l);
    this.school = school;
}
public String info(){
    return super.info()+"school:"+school;
}

}
同样的问题 ,不解

MichaelJLU
MichaelJLU   2018.03.20 15:33

这个编过没问题,java要求在构造函数中,只要有父类构造函数调用就可以。
Student(String school)构造函数中,首先调用的就是另一个构造函数Student (String name, int age, String school),在这个构造函数中,又调用了super(name,age),所以相当于调用了父类构造函数。
如果去掉super(name,age), 再编译就会报错了。
Test.java:21: error: constructor Person in class Person cannot be applied to given types;
Student (String name, int age, String school){
^
required: String,int
found: no arguments
reason: actual and formal argument lists differ in length
1 error

所以如果重载了父类的构造函数,也最好留一个参数为空的默认构造函数。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
错误记录--Java中子类继承父类必须调用父类的构造方法?
刚睡完午觉起来,有点迷糊,然后接着练习Java中元组(tuple)的时候突然就遇到这么个问题,关于继承的问题,奇怪在睡觉之前怎么就没发现这个问题呢,传说中的“面向睡一觉编程”吗。。。Orz先贴上代码: 首先是创建一个父类文件TwoTuple.javapackage test.fifth;public class TwoTuple<A, B> { public A first; pu
父类不含无参构造方法子类构造方法必须显式调用
在继承关系下实例化子类的时候会先实例化其父类,然后再实例化子类。 也就是说在new一个子类的时候,其实是需要先把父类new出来的,如果父类中还有父类,那么就会逐层进行,从最顶层的父类先实例化,最后才到当前的子类。
java中的加载顺序以及父类与子类的构造方法
public class fatt { public static void main(String[] args) { animal a=new cat(9); } } class animal{ static int qq=7; static { System.out.println("父类静态"); } { System.out.println("父类非静态"); }
子类和父类构造方法的执行先后问题
在java中如果一个类中没有显式的使用super()进行调用超类的构造方法,则在执行子类构造方法之前会首先待用父类的构造方法,如下:/** * Created by zhuxinquan on 15-11-24. */class Circle{ double radius = 10; public Circle(){ //this(0); Syst
一个java文件中子类与父类构造方法执行顺序
1.只存在一个public;2.若main函数不在于文件名相同的类下面,则run as 不会出现Java Application;3.默认会调用系统无参构造方法;4.this()与super()只能在一个方法中存在一个package com.web.test2;public class Creature { public Creature(){ System.out.printl
java中关于子类实例化时调用父类无参构造方法的问题
java中子类在实例化的时候调用父类的无参构造方法容易混淆的大致分以下几种情况: 1、子类和父类同时具有有参和无参的构造方法,子类有参构造方法中第一行写的有super.(xx),且子类实例化时用的是有参构造方法,那么此时不会先调用父类的无参构造方法,而是直接调用子类的有参构造方法; 2、子类和父类同时具有有参和无参的构造方法,子类有参构造方法中第一行写的没有super.(xx),且子类
为什么java的子类中必须调用父类的构造方法
子类继承父类的字段和方法。 你想那么子类中从父类继承的字段,要谁来初始化呢? 父类中有这些字段的初始化方式,所以最好的选择就是用父类的构造方法。 设计者,可能是这么考虑的。 再告诉你一个事,每当你new一个子类对象的时候,子类对象都隐式内置了一个父类对象。 java创建对象的三个步骤就是,申请内存,调用构造方法,返回对象引用。 所以说,为了那个内置的父类对象,也
Java构造器 继承问题(子类是否必须实现父类的有参构造函数)
首先,答案是否定的,但是 如果你在父类中写了一个有参构造函数,但是没有声明无参构造函数,就有问题。 (这里补充一下,我们都知道,当我们不写有参构造函数的时候,系统会自动生成一个无参构造函数,而且每个类的创建都依赖构造函数,子类的构造函数依赖父类的构造函数,这牵扯到一个隐式传递super和this的问题 不多赘述) ,因为你在父类中只有有参构造函数,没有无参构造函数,但是子类如果不写构造函数,系
【java 构造函数】为什么子类一定要访问父类中的构造函数
原因: 子类的所有构造函数中的第一行,其实都有一条隐身的语句super(); 解释: super()表示父类的构造函数并会调用于参数相对应的父类中的构造函数。子类中,它在调用父类中空参数的构造函数。因为子类继承父类,会继承到父类中的数据,所以必须要看父类是如何对自己的数据进行初始化的。所以子类在进行对象初始化时,先调用父类的构造函数,这就是子类的实例化过程。 特注: 1、
子类继承父类时,创建对象,构造方法的调用问题
在学习继承的时候,遇到一些小问题,这里总结一下,有错误望指正: 先来看一段代码: //标准父类 class Father{ //成员变量 private String name; private int age; //构造方法 //空参 public Father(){ } //有参 public Father(String nam