文档章节

继承中子类的构造器调用父类的构造器

 恒者
发布于 2013/12/23 18:03
字数 960
阅读 2455
收藏 5

构造器的作用:初始化对象的成员变量。

构造器不能被子类继承,普通方法和属性可以被子类继承。

默认情况下,子类的构造器中的第一行隐式地调用父类默认的无参构造器,以初始化父类的成员变量。

因为子类从父类继承过来的方法,可能要用到父类的成员变量,所以需要在子类的构造器中调用父类的构造器以初始化父类的成员变量。

父类People(包含无参构造器(默认构造器)和有参构造器):

class People{
    private String name;
    private int age;
    public People(){
        System.out.println("初始化People的实例变量--无参构造器");
    }
    public People(String name, int age){
        System.out.println("初始化People的实例变量--有参构造器");
        this.name = name;
        this.age = age;
    }
}

子类Student(也有2个构造器):

public class Student extends People{
    private int sno;
    public Student(){
        System.out.println("初始化Student的实例变量--无参构造器");
    }
    public Student(int sno){
        System.out.println("初始化Student的实例变量--有参构造器");
        this.sno = sno;
    }
    public static void main(String[] args){
        Student p1 = new Student();
        Student p2 = new Student(1);
    }
}

执行的结果:

初始化People的实例变量--无参构造器
初始化Student的实例变量--无参构造器
初始化People的实例变量--无参构造器
初始化Student的实例变量--有参构造器

从执行的结果可知:

在子类中不管是有参还是无参构造器,默认情况下均调用父类的无参构造器(即默认构造器)。即以下代码是等价的:

public Student(){

    System.out.println("初始化Student的实例变量--无参构造器");

}

public Student(int sno){

    System.out.println("初始化Student的实例变量--有参构造器");

    this.sno = sno;

}

等价于:

public Student(){

    super();//super语句只能位于构造器的第一条语句

    System.out.println("初始化Student的实例变量--无参构造器");

}

public Student(int sno){

    super();

    System.out.println("初始化Student的实例变量--有参构造器");

    this.sno = sno;

}

super()的作用是:调用父类的默认构造器。

在构造函数中,super语句必须放在第一句。

任何类的构造函数中,若是构造函数的第一行代码没有显式的调用super(...);那么Java默认都会调用super();作为父类的初始化函数。所以这里的super();加不加都无所谓。

如果此时将父类的无参构造器注释掉,而子类的构造器隐式或显式调用了父类的默认构造器,程序编译时将会报错,因为只要在父类中自定义了构造器,系统将不会在其中添加默认的构造器。

在子类中,可以通过super(参数列表)显示调用父类中的有参构造器,如下:

public class Student extends People{
    private int sno;
    public Student(){
        System.out.println("初始化Student的实例变量--无参构造器");
    }
    public Student(int sno){
        System.out.println("初始化Student的实例变量--有参构造器");
        this.sno = sno;
    }
    
    public Student(String name, int age, int sno){
        super(name, age);
        this.sno = sno;
    }
    public static void main(String[] args){
        Student s1 = new Student();
        Student s2 = new Student(1);
        Student s3 = new Student("huhu", 20, 2);
    }
}
class People{
    private String name;
    private int age;
    public People(){
        System.out.println("初始化People的实例变量--无参构造器");
    }
    public People(String name, int age){
        System.out.println("初始化People的实例变量--有参构造器");
        this.name = name;
        this.age = age;
    }
}


当Java new出一个子类对象时(是一个包含父类的子对象的子类对象,父类的子对象与单独new一个父类对象一样,只不过这个子对象位于子类对象内部),在执行子类构造器的步骤中,Java默认首先调用父类不带参数的构造器(若子类中没有使用super()调用父类的构造器),然后回来执行子类构造器。

 

 

 

 

 

© 著作权归作者所有

粉丝 10
博文 25
码字总数 38957
作品 0
武汉
私信 提问
加载中

评论(2)

恒者 博主
@chape 当Java new出一个子类对象时,只会产生一个子类对象,该子类对象包含了一个父类的子对象。修改过来了,谢谢指正!
chape
chape
博主确定产生2个对象?
Java继承篇总结

继承: 1)概念 把多个类中相同的成员给提取出来定义到一个独立的类中。然后让这多个类和该独立的类产生一个关系,这多个类就具备了这些内容。这个关系叫继承。 1.1)定义类时,通过“继承”...

任志远Ray
2017/03/30
0
0
《疯狂java讲义2》读书笔记——面向对象的三大特性之一:继承(已更新完)

继承 java的继承具有单继承的特点,每个子类只有一个直接父类。 继承的特点 java的继承通过extends关键字来实现,实现继承的类被称为子类,被继承的类被称为父类,有时也称为基类,超类。 因...

我的夏幸运
2016/11/04
8
0
【iOS】Swift类的继承、构造方法、析构器等复习

构造方法内容会多一些,涉及Swift中构造的一些规则与概念。这次写了7个Person来复习,外加名人XiaoMing。 Mark:Playground真是个好东西,特别练习demo写Swift时,实时显示真是大赞! 一、继...

xn4545945
2014/09/23
0
0
java继承/多态/接口基础知识

一、基础知识 1.this与super关键字的使用 a.this关键字 区分成员变量和局部变量 方法中出现局部变量和成员变量重名,可以在成员变量名前面加加以区分; this代表的是实例(对象),哪个实例(对...

lkee6760
2016/12/30
0
0
《疯狂java讲义2》读书笔记——继承与组合

继承与组合 继承是实现类重用的重要手段,但继承带来一个最大的坏处:破坏封装。组合也是实现类重用的重要方式,而采用组合方式来实现类重用则能提供更好的封装性。 使用继承的注意点 子类扩...

我的夏幸运
2016/11/11
11
0

没有更多内容

加载失败,请刷新页面

加载更多

JS基础-该如何理解原型、原型链?

JS的原型、原型链一直是比较难理解的内容,不少初学者甚至有一定经验的老鸟都不一定能完全说清楚,更多的"很可能"是一知半解,而这部分内容又是JS的核心内容,想要技术进阶的话肯定不能对这个...

OBKoro1
28分钟前
4
0
高防CDN的出现是为了解决网站的哪些问题?

高防CDN是为了更好的服务网络而出现的,是通过高防DNS来实现的。高防CDN是通过智能化的系统判断来路,再反馈给用户,可以减轻用户使用过程的复杂程度。通过智能DNS解析,能让网站访问者连接到...

云漫网络Ruan
今天
13
0
聊聊Tomcat中的连接器(Connector)

上期回顾 上一篇文章《Tomcat在SpringBoot中是如何启动的》从main方法启动说起,窥探了SpringBoot是如何启动Tomcat的,在分析Tomcat中我们重点提到了,Tomcat主要包括2个组件,连接器(Conne...

木木匠
今天
9
0
OSChina 周一乱弹 —— 熟悉的味道,难道这就是恋爱的感觉

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @xiaoshiyue :好久没分享歌了分享张碧晨的单曲《今后我与自己流浪》 《今后我与自己流浪》- 张碧晨 手机党少年们想听歌,请使劲儿戳(这里)...

小小编辑
今天
2.4K
22
SpringBoot中 集成 redisTemplate 对 Redis 的操作(二)

SpringBoot中 集成 redisTemplate 对 Redis 的操作(二) List 类型的操作 1、 向列表左侧添加数据 Long leftPush = redisTemplate.opsForList().leftPush("name", name); 2、 向列表右......

TcWong
今天
44
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部