子类构造函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了子类构造函数相关的知识,希望对你有一定的参考价值。

父类的构造函数
String name;

Witch(String name)

this.name=name;



....
子类的构造函数
String name;
LittleWitch(String name)//这一行报错 找不到符号

this.name=name;



改成super(name);就对了

我的问题是,为什么一定要这样写呢

报错还有几句:
符号: 构造函数 Witch()
位置: 类 Witch
LittleWitch(String name)

这又是什么意思呢?

子类的构造器,必须调用父类的构造器。如果你没有使用super()来调用父类的构造器,那么编译器会帮你加上一句调用父类无参的构造器,但是你的父类没有无参构造器,所以出错了。
修改这个错误的方法是:
1、给父类添加无参构造器。
2、在子类的构造器中第1句位置显示调用父类构造器,如:super("abc");

==========

如果你还有其它错误,请把代码帖上来。
参考技术A 构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。

子类的构造器,必须调用父类的构造器。如果你没有使用super()来调用父类的构造器,那么编译器会帮你加上一句调用父类无参的构造器,但是你的父类没有无参构造器,所以出错了。
修改这个错误的方法是:
1、给父类添加无参构造器。
2、在子类的构造器中第1句位置显示调用父类构造器,如:super("abc");

如果子类未定义构造函数,是不是会调用父构造函数?

【中文标题】如果子类未定义构造函数,是不是会调用父构造函数?【英文标题】:Are parent constructors called if a child class does NOT define a constructor?如果子类未定义构造函数,是否会调用父构造函数? 【发布时间】:2012-10-18 08:27:58 【问题描述】:

在PHP Constructors and Destructors documentation 中声明

注意:如果子类不隐式调用父构造函数 定义了一个构造函数。为了运行父构造函数,调用 子构造函数中的 parent::__construct() 是必需的。

但是如果子类不调用构造函数,还会调用父构造函数吗?还是我们应该创建一个调用父构造函数的构造函数?

IE:

class BaseClass 
   function __construct() 
       print "In BaseClass constructor\n";
   


class SubClass extends BaseClass 
   function __construct() 
       parent::__construct();
   

【问题讨论】:

【参考方案1】:

也许这有点明显,但做了一些环顾四周,令人惊讶的是,这个问题的直接答案并不容易找到,所以这里是:

如果子类定义了一个构造函数,那么父构造函数就会被调用。

在下面的示例中,$obj 仍然会从 BaseClass 调用构造函数,因为 SubClass 从未调用过构造函数。

class BaseClass 
    function __construct() 
       print "In BaseClass constructor\n";
    


class SubClass extends BaseClass 
    //I do not have a constructor :(


$obj = new SubClass();

【讨论】:

也许the manual 最近更新了,但它确实声明,“如果子类没有定义构造函数,那么它可能像普通类方法一样从父类继承(如果它未声明为私有)。” 你甚至可以将构造函数声明为私有的吗?这似乎违背了最初开设课程的目的。 @eggmatters:检查私有构造函数的答案:***.com/a/2816139/1488445【参考方案2】:

考虑到构造函数是一种可以像任何其他方法一样被覆盖的方法。如果父类有构造函数,它的所有子类都将继承该构造函数。如果子代重写构造函数,则在创建新对象时将使用 this,并且不会隐式调用父代的构造函数。如果子级没有覆盖构造函数,则将使用父级的构造函数。这个概念适用于多重继承。

【讨论】:

以上是关于子类构造函数的主要内容,如果未能解决你的问题,请参考以下文章

请教一下C#中父类静态构造函数在子类中为啥不会和子类的静态构造函数一起执行

C#中子类构造函数中如何调用父类构造函数

子类都会首先调用父类的构造函数吗?

关于C++子类构造函数的重载问题

如果子类未定义构造函数,是不是会调用父构造函数?

c# 子类如何调用父类的构造函数