首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

构造函数调用子类方法,写过吗?

为什么Base的构造函数与虚构函数即使调用虚函数,也是调自己的函数呢?这跟构造函数与虚构函数的调用顺序有关。子类对象构造的时候,先调父类构造函数初始化父类,再调子类构造函数初始化子类。...子类对象虚构的时候,恰恰相反,先调子类对象的虚构函数,再调父类的虚构函数。输出的结果也证明了这点。 所以如果父类的构造函数与虚构函数是调用子类的函数,那就非常危险了。...因为父类的构造函数执行时,子类构造函数还没有执行,说明子类还没有初始化,而这时就调用子类方法,很容易出错,甚至崩溃。...父类的虚构函数执行的时候,子类的虚构函数已经执行完毕,说明子类的资源已经被释放,而这时继续执行子类方法,也很容易崩溃。于是,C++规范为此作了此约束。...如果真的很想在构造函数内调用子类方法进行初始化,还是显示提供一个初始化函数,让子类对象实例化完后,显示调用初始化函数。

1.4K20

创建子类对象时,父类构造函数中调用被子类重写的方法为什么调用的是子类方法

main(String[] args) { A a = new A(); B b = new B(); } } 问题:为什么创建A对象的时候父类会调用子类方法...但是:创建B对象父类会调用父类的方法? 答案: 当子类被加载到内存方法区后,会继续加载父类到内存中。...如果,子类重写了父类的方法子类方法引用会指向子类方法,否则子类方法引用会指向父类的方法引用。 如果子类重载了父类方法,则子类重载方法引用还指向子类方法。...如果子类方法没有重写也没有重载父类方法,则方法引用会指向父类方法。 当子类对象创建时,会先行调用父类的构造方法构造方法也是方法),虚拟机会在子类方法区寻找该方法并运行。...其结果是当编译的时候,父类构造方法调用的方法的参数已经强制转换为符合父类方法的参数了。 上边代码在编译前已经转换为下面这个样子的了。

6K10
您找到你想要的搜索结果了吗?
是的
没有找到

父类中如果没有无参构造方法(也即父类中只给了带参构造方法),子类构造方法怎么办?

父类中如果没有无参构造方法(也即父类中只给了带参构造方法),子类构造方法怎么办? /* 父类中如果没有无参构造方法(也即父类中只给了带参构造方法),子类构造方法怎么办?   ...法1:子类构造方法通过 super(...); 去显示调用父类的带参构造方法。   ...法2:子类构造方法通过 this();/this(...); 调用本类的其他的构造方法,但是子类的其他的构造方法中一定会有一个去访问了父类的带参构造方法。   法3:让父类提供无参构造。...;/super(...); 这三个语句访问子类或父类的构造方法的时候,必须放在第一句语句上。         否则,就可能会对父类数据进行多次初始化。 */ 示例代码如下图所示: ?

1.5K10

【说站】php构造方法__construct()是什么

php构造方法__construct()是什么 概念 1、构造方法__construct()是一种结构特有的特殊方法。...2、该方法由系统规定,开发人员在定义时只需写一次,有构造方法的类在实例化对象后,对象自动调用。...语法: function __construct(arg1,arg2,...) {     ...... } 使用注意 若父类和子类都有 __construct,则只调用子类的__construct,...不会自动调用父类的__construct 子类的__construct方法如果要调用父类的__construct方法,必须在子类构造函数中调用父类的构造函数 实例 class People{       ...;           }   }   $man =new People("张三"); 以上就是php构造方法__construct()的介绍,希望对大家有所帮助。

35920

java 构造构造方法_Java构造器(构造方法constructor)

我们先来看一下什么是构造器: 1、构造器也叫构造方法构造函数,分为有参构造器和无参构造器; 2、构造器也是一种方法,只不过是一种特殊的方法,它会在对象创建的时候被调用; 3、构造器最大的作用就是在创建对象的时候进行对象的初始化...5、构造器不能被子类继承,Java中子类会自动调用父类的构造器(同样,不了解的可以先记下概念或者跳过) 前面既然说了构造器是一种特殊的方法,我们就来看一下构造方法和普通方法的区别: 1、命名:构造器的方法名必须和类名相同...2、修饰符:构造器不能被static、final、synchronized、abstract和native修饰 3、返回值:构造器没有返回值(但是不需要写void),一般方法要有返回值或者无返回值(void...String name; public int age; public String sex; /** * 无参的构造方法: * 如果不写编译器会自动加上;只要定义了构造器,不管是有参还是无参,编译器都不会再帮你定义...定义无参构造方法 public Student02() { } //定义一个两个参数的构造方法(重载)不能和刚才的一样 注意:名字依然要和类名保持一致 public Student02(String

1K10

Java中子类和父类的构造函数?

参考链接: Java中的继承和构造函数 这篇文章总结了关于Java构造的常见​​问题。  1)为什么创建一个子类对象要也需要调用父类的构造函数? ...子类构造函数,无论有参构造还是无参构造,将会调用父类中的默认的无参构造函数。...由于编译器试图插入super()这条语句到子类的两个构造函数中,但Super的默认构造函数没有被定义,所以编译器会报该错误消息。 ...3)子类中的显式调用父类构造函数  下面的代码是正常的:    子类(Sub)构造函数显式地调用父类(Super)中的带参构造参数。如果父类中定义了相对应的构造函数,那将会被正常良好的调用。  ...4)规则 简而言之,规则是:子类构造函数必须调用父类中的构造函数,无论隐式调用还是显式调用,无论哪种方式,被调用的构造函数必须得先被定义。

2K20

构造方法

1 问题 设计一个构造方法,参数名分别是 String name float hp float armor int moveSpeed 并且在这个构造方法中,调用这个构造方法 。...2 方法 2.1 带一个参数的构造方法 2.2带两个参数的构造方法 2.3 带四个参数的构造方法 2.4 调用构造方法 public class Hero { String name;...hp; float armor; int moveSpeed; public Hero(String name){ System.out.println("一个参数的构造方法...,提出使用this进行初始化的构造方法,通过实验,证明该方法是有效的。...构造方法之间的调用,可以通过this关键字来完成,需要注意的是调用构造方法的语句必须定义在构造方法的第一行,并且只能有一个this,除此之外,如果调用了未被定义的构造方法,会报错。

40910

【Kotlin】Kotlin 类的继承 一 ( 类继承基本方式 | final 关键字 | 子类构造函数 | 子类构造函数 )

使用 final 禁止类继承 / 方法重写 III . 父类没有主构造函数 IV . 父类有主构造函数 V . 父类构造函数与子类构造函数总结 I . 类继承基本方式 ---- 0 ....class 子类 : 父类 { //子类函数体 override fun 被重写的父类方法名 ( 被重写的父类方法参数 ){ //要执行的函数内容 } } 1 ....类继承限制 : 子类使用 : 父类 ( 父类构造函数参数列表 ) ① 类继承限制 : 只有被 open 修饰的类 , 才能有子类继承该类 , 普通的类不允许被继承 ; ② 类方法被重写限制 : 只有被...open 修饰的方法 , 才能被子类重写 , 被重写的子类函数 , 必须使用 override 修饰 ; ③ open 修饰类限制 : open 关键字不能修饰 final 类 , 给 final 类添加...("Father")} } //定义子类 , 子类重写父类方法必须添加 override 修饰函数 class Son : Father() { override fun action() {

1.1K10

php学习之类与对象的构造方法使用技巧

在一个类中,构造方法有且只有一个,定义多个会报错 在php4中可以使用类名作为构造方法,在php5也支持 ?...默认构成方法: 在类中,如果没有定义构造方法,那么系统会默认有一个构造方法 ?...注意: 一旦自定义了一个构造方法,默认的构造方法就会被覆盖,这时创建对象的时候就会使用自定义的构造方法 一个类只能有一个构造方法 this只能在类的方法中使用,而不能在类的外部使用 构造方法小结: 构造方法的名和类名相同也可以使用关键词...__construct 构造方法没有返回值 作用是对新对象进行初始化 一个类有且只有一个构造方法 如果没有给类自定义构造方法,该类使用系统默认的构造方法 如果给类定义了构造方法,该类的默认构造方法被覆盖...构造方法默认使用的修饰符是public 析构方法: 在php5中引入了析构函数,类似于面向对象语言,析构函数会在某个对象的所有引用都被删除或当对象被显式销毁时执行 分析: 在php中引入的一个技术 某个对象的所有引用都被删除

56820

【Flutter】Dart 面向对象 ( 命名构造方法 | 工厂构造方法 | 命名工厂构造方法 )

student):super(student.name, student.age); 父类构造函数 : 如果父类没有默认构造函数, 子类必须调用父类的构造函数 ; 方法体 : 命名构造方法与普通构造函数一样..., 子类必须调用父类的构造函数 Student.cover(Student student):super(student.name, student.age); // 命名构造方法也可以有方法体..._grade; String school; String city; String address; // 父类构造函数调用 : 如果父类有非空参数的构造函数, 子类必须实现相同参数的构造函数...// 除了父类构造方法之外 , 还可以在子类构造方法体之前初始化示例变量 // 不同的初始化实例变量之间使用逗号隔开 // // 父类构造方法...// 定义格式 : 类名.方法名() // 父类构造函数 : 如果父类没有默认构造函数, 子类必须调用父类的构造函数 Student.cover(Student student):super

73800

scala:主构造方法和辅助构造方法

构造器(构造方法) 作用: 构造对象 初始化属性(给对象的属性赋值) Java中构造方法名和类名保持一致 构造方法没有返回值类型 构造方法可以重载 Scala中构造器 主构造方法 在声明类的同时,...就定义了主构造方法,换言之,类就是主构造方法 在一个类中,主构造方法只能有一个 辅助构造方法 方法名必须叫this 在辅助构造方法开始(第一行)必须直接或者间接的调用主构造方法 辅助构造方法可以重载 scala...") var name:String = _ var age:Int = _ //声明辅助构造方法 def this(name:String){ //直接调用主构造方法...Int){ //间接调用主构造方法 this(name) println("2----Student08的辅助构造方法被调用了") this.age = age }.../*//以下写法不是构造方法 def Student08()={ println("Student08的构造方法被调用了") }*/ } scala有参数的主构造方法 在声明主构造方法参数的时候

61010

什么叫构造方法?_构造方法和普通方法之间的区别

构造方法是一种特殊的方法,它是一个与类同名且没有返回值类型的方法。对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化。当类实例化一个对象时会自动调用构造方法。...7.构造方法分为两种:无参构造方法 有参构造方法 构造方法可以被重载。...9.子类继承父类中,   ***子类的实例化过程   ***构造方法不能被子类继承   ***子类创建对象时,会先去创建父类的对象。   ...***子类构造方法中,第一行默认是super()   ***为什么子类中第一行会默认有super()   因为他继承父类的成员使用,使用前这些成员必须初始化,   而他们是父类的成员,所以,必须通过父类进行初始化...如果写了一个有参的构造方法,就一定要写无参构造方法。   如果想使用无参的构造方法,就必须手动给出无参构造方法。   建议:一般情况下,我们自定义的类都要手动给出无参构造方法

59110

PHP面向对象程序设计之构造方法和析构方法详解

本文实例讲述了PHP面向对象程序设计之构造方法和析构方法。分享给大家供大家参考,具体如下: 构造方法和析构方法是对象中的两个特殊方法,它们都与对象的生命周期有关。...所以通常使用构造方法来执行一些有用的初始化任务,比如对成员属性在创建对象时赋初值等。 在PHP5以前的版本中,构造方法方法名称必须与类名相同,这种方式在PHP 5中任然可以使用。...为了向下兼容,在创建对象时,如果一个类中没有名为__construct()的构造方法PHP将搜索与类名相同名的构造方法执行。...原因是构造方法名称是固定的,在PHP中不能声明同名的两个函数,所以也就没有构造方法重载。但可以在声明构造方法时使用默认参数,实现其他面向对象的编程语言中构造方法重载的功能。...classname::__construct(); // 调用其他类的构造函数,classname是类名 //其他操作 } 继承和构造函数 PHP中的子类构造函数不会主动调用父类的构造函数,

73330
领券