继承中子类构造函数相关问题

Day08_SHJavaTraing_4-13-2017

1.为什么任何一个类(不包含Object)的构造函数中都需要一个super() 语句?

  因为除了Object类以外,所有类都会继承一个父类;继承父类,那么子类实例化时就需要给父类中的成员变量显示赋值,就需要用到父类中的构造函数。

2.如果父类中没有无参构造函数,子类如何实例化?

  super()表示调用父类无参构造函数;如果父类中没有无参构造函数,就会报错。

如何解决这个问题呢?

  方法①在父类中添加一个无参构造函数

方法②在子类的构造函数中显示的调用父类有参构造函数

  在子类构造函数中使用super调用父类构造函数需要注意,这个super语句必须写在构造函数的第一行。

3.子类构造函数中,this() 和 super() 能否同时存在?

不能。因为他们都要写在构造函数的第一行。所以如果一个构造函数中有this()语句,就没有super()语句,super()存在于this调用的那个构造函数里面。

4.如果一个类的构造函数全部私有了,还可以有子类吗?

不能。因为在子类的构造函数中一定要调用父类的构造函数,而一旦一个类的构造函数都私有了,就只能在本类中使用,其他类(也包括子类)都无法使用。

 

时间: 2024-12-07 19:51:29

继承中子类构造函数相关问题的相关文章

继承(子类构造执行的过程)

继承中子类构造的执行过程:        1.从Main函数跳转到子类有参构造,但是不进入方法体,无论有无base(),都会跳转到父类构造        2.跳转到父类有参构造,执行构造体        3.执行完后,跳回到子类有参构造并执行构造体        4.执行完后,跳回到Main函数,对象执行完毕 示例代码: /// <summary>    /// 父类    /// </summary>    public class Car    {        public

C++ 类的继承三(继承中的构造与析构)

//继承中的构造与析构 #include<iostream> using namespace std; /* 继承中的构造析构调用原则 1.子类对象在创建时会首先调用父类的构造函数 2.父类构造函数执行结束后,执行子类的构造函数 3.当父类的构造函数有参数时,需要在子类的初始化列表中显示调用 4.析构函数调用的先后顺序与构造函数相反 继承与其他类做成员变量混搭的情况下,构造和析构嗲用原则 1.先构造父类,在构造成员变量,最后构造自己 2.先析构自己,再析构成员变量,最后析构父类 */ clas

Swift难点-继承中的构造规则实例具体解释

关于继承中的构造规则是一个难点. 假设有问题,请留言问我. 我的Swift新手教程专栏 http://blog.csdn.net/column/details/swfitexperience.html 为什么要有构造器:为类中自身和继承来的存储属性赋初值. 一.两种构造器-指定构造器和便利构造器 指定构造器:类中必备的构造器.为全部的属性赋初值.(有些子类可能不须要显示声明,由于默认从基类继承了) 便利构造器:类中的辅助构造器,通过调用指定构造器为属性赋初值.(仅在必要的时候声明) 举例 cla

C++--继承中的构造与析构、父子间的冲突

一.继承中的构造与析构 Q:如何初始化父类成员?父类构造函数与子类构造函数由什么关系?A.子类对象的构造1.子类在可以定义构造函数2.子类构造函数--必须对继承而来的成员进程初始化(直接通过初始化列表或者赋值的方式进行初始化,调用父类构造函数进行初始化)B.父类构造函数在子类中的调用方式1.默认调用--适用于无参构造函数和使用默认参数的构造函数2.显示调用--通过初始化列表进行调用,适用于所有父类构造函数代码示例 #include <iostream> #include <string&

C++--第16课 - 继承中的构造与析构

第16课 - 继承中的构造与析构 1. 赋值兼容性原则 (1)      子类对象可以当作父类对象使用. (2)      子类对象可以直接赋值给父类对象. (3)      子类对象可以直接初始化父类对象. (4)      父类指针可以直接指向子类对象. (5)      父类引用可以直接引用子类对象. 子类就是特殊的父类 #include <cstdlib> #include <iostream> using namespace std; class Parent { pro

【C++第十课】---继承中的构造与析构

一.继承中的赋值兼容性原则 1.子类对象可以当作父类对象使用 2.子类对象可以直接赋值给父类对象 3.子类对象可以直接初始化父类对象 4.父类指针可以直接指向子类对象 5.父类引用可以直接引用子类对象 6.子类是就是特殊的父类. 举例说明: #include <iostream> using namespace std; class Parent { protected: const char* name; public: Parent() { name= "Parent ...&q

Swift难点-继承中的构造规则实例详解

一.两种构造器-指定构造器和便利构造器 指定构造器:类中必备的构造器,为所有的属性赋初值.(有些子类可能不需要显示声明,因为默认从基类继承了) 便利构造器:类中的辅助构造器,通过调用指定构造器为属性赋初值.(仅在必要的时候声明) 举例 [plain] view plaincopy class Food { var name: String init(name: String) { self.name = name } convenience init() { self.init(name: "[

一点一点学架构(二)——继承中的构造函数调用

前言 在Java基础中我们学"继承中的构造方法"时,强调了以下几点: 子类构造过程必须调用其基类的构造过程. 可以通过显示调用或系统默认的方式调用基类的构造过程. 显示调用:通过Super(参数)来调用,且必须放在子类构造方法的第一行. 系统默认调用:调用基类的无参构造函数. 回顾.NET,道理也是一样的. 本文,首先以一个Demo给大家解释一下该知识点,然后再结合项目说一下该知识点的具体应用. 示例 public class GrandFather { public GrandFat

继承中的构造与析构(三十九)

我们思考下这个问题:如何初始化父类成员?父类构造函数和子类构造函数有何关系呢?在子类中可以定义构造函数,子类构造函数必须对继承而来的成员进行初始化:a> 直接通过初始化列表或者赋值的方式进行初始化:b> 调用父类构造函数进行初始化. 下来我们来说说父类构造函数在子类中的调用方式,分为两种:a> 默认调用:适用于无参构造函数和使用默认参数的构造函数:b> 显示调用:通过初始化列表进行调用,适用于所有父类构造函数.那么隐式调用是在子类的构造函数中啥都不加,显示调用时在子类构造函数后加上