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

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

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

2.3K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

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

    类继承基本方式 II . 使用 final 禁止类继承 / 方法重写 III . 父类没有主构造函数 IV . 父类有主构造函数 V . 父类构造函数与子类构造函数总结 I ....类继承格式 : 使用 " : " 继承父类 ; 如果该父类有主构造函数 , 那么子类必须至少有一个主构造函数或次构造函数 , 子类的构造函数下面会根据不同情况详细解析 ; //注意这里的父类构造函数需要实际调用...子类有主构造函数 : 父类必须在主构造函数中初始化 , 子类的 constructor() 可以省略 ; " : " 后的 Father() 相当于调用了父类的主构造函数 , 将子类的主构造函数委托给父类的主构造函数执行...子类有主构造函数 : 子类需要在主构造函数中定义需要的变量 , 其中的参数 , 可以直接传递给后面委托调用的主构造函数 ; class Son constructor (name : String, age...子类没有主构造函数 : 如果没有主构造函数 , 那么子类必须有次构造函数 , 子类需要在次构造函数中定义需要的变量 , 其中的参数 , 可以直接传递给后面 super ( ) 委托调用的主构造函数 ;

    1.3K10

    子类A继承父类B, A a = new A(); 则父类B构造函数、父类B静态代码块、父类B非静态代码块、子类A构造函数、子类A静态代码块、子类A非静态代码块 执行的先后顺序是?

    (1)子类A继承父类B, A a = new A(); 则: 父类B静态代码块->子类A静态代码块->父类B非静态代码块->父类B构造函数->子类A非静态代码块->子类A构造函数 (2)若子类构造函数中显式的调用了父类的某构造函数...,则调用该构造函数 class C { C() { System.out.print("C"); } } class A { C c = new C();...,那么就要调用构造方法来初始化该子类对象,但是该类继承自A,所以要先调用父类的构造方法,这里通过super(“B”)显示的调用了父类的带参构造。...执行父类的带参构造前要先对父类中的对象进行初始化,对父类中的c成员进行初始化,调用了C类的无参构造,所以调用顺序为: 先调用C类的无参构造 再调用A类的带参构造 最后调用调用子类的构造 (3...顺序为:父类的静态变量, 父类的静态代码块 ,子类的静态变量,子类的静态代码块。

    2.2K30

    浅析C++中的CRTP

    CRTP的基本思想:基类模板以派生类作为模板参数,在基类接口中将this指针强转为派生类指针,调用派生类中的方法,从而实现了一种静态多态性。...派生类Derived1和Derived2都继承自CBase,并实现了implementation方法。通过CRTP,我们可以在基类中调用派生类的方法,而不需要使用虚函数的运行时开销。...注意需要自定义本身调用了shared_ptr的构造函数后,方可调用shared_from_this() 方法。...只有调用shared_ptr的构造函数且自定义类继承自std::enable_shared_from_this时才会给弱指针赋值。如果弱引用指针未被赋值,空指针强转会触发异常。...回归CRTP,自定义类需要将自身作为模板参数传递给 std::enable_shared_from_this,在派生类中才可以使用 std::enable_shared_from_this 提供的 shared_from_this

    6200

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

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

    6.2K10

    使用Python类的构造函数和析构函数

    1、问题背景当使用Python类时,可以使用构造函数和析构函数来初始化和清理类实例。构造函数在创建类实例时自动调用,而析构函数在删除类实例时自动调用。...在上面的代码示例中,Person类具有一个构造函数__init__和一个析构函数__del__。...构造函数__init__在Person类的实例被创建时被调用,它将类实例的name属性设置为传入的参数,并将类实例的人口计数population加1。...析构函数__del__在Person类的实例被删除时被调用,它将类实例的人口计数population减1。...问题是,如果我在程序中显式地删除Person类的实例,析构函数__del__是否会被自动调用,或者我是否需要在“main”程序/类中添加一些东西,如上面的代码示例所示?

    20210

    C++雾中风景14:CRTP, 模板的黑魔法

    std::enable_shared_from_this,并且自己是作为模板参数传递给父类的。...这里只是用到了模板派生,让父类能够在编译器感知到子类的模板存在,二者不是真正意义上的继承关系。 这里只分析下面两个问题: 为什么Bad类直接通过this构造shared_ptr会存在问题?...2.1: 静态多态 在Clickhouse之中,大量使用了CRTP来实现静态多态的形式来减少虚函数的调度开销。...将虚函数的调用转换为函数指针的调用,这个在实际聚合函数的实现过程之中能够大大提高计算的效率。...它的next与prev函数就是利用了颠倒继承与reinterpret_cast的强制类型转换,让父类获取了能够返回子类指针的能力,从而让子类再通过继承拥有了对应的能力。

    1.7K32

    【C++】继承 ⑥ ( 继承中的构造函数和析构函数 | 类型兼容性原则 | 父类指针 指向 子类对象 | 使用 子类对象 为 父类对象 进行初始化 )

    地方 , 都可以使用 " 公有继承 " 的 派生类 ( 子类 ) 对象 替代 , 该 派生类 ( 子类 ) 得到了 除 构造函数 和 析构函数 之外的 所有 成员变量 和 成员方法 ; 功能完整性 :..." 公有继承 " 的 派生类 ( 子类 ) 本质上 具有 基类 ( 父类 ) 的 完整功能 , 使用 基类 可以解决的问题 , 使用 公有继承派生类 都能解决 ; 特别注意 : " 保护继承 " 和..." 应用场景 : 直接使用 : 使用 子类对象 作为 父类对象 使用 ; 赋值 : 将 子类对象 赋值给 父类对象 ; 初始化 : 使用 子类对象 为 父类对象 初始化 ; 指针 : 父类指针 指向...子类对象 , 父类指针 值为 子类对象 在 堆内存 的地址 , 也就是 将 子类对象 地址 赋值给 父类类型指针 ; 引用 : 父类引用 引用 子类对象 , 将 子类对象 赋值给 父类类型的引用 ; 二...// 子类对象 可以调用 父类公有函数 child.funParent(); // 将指向子类对象的指针传给接收父类指针的函数 // 也是可以的 fun_pointer

    30920

    经典永不过时!重温设计模式

    组合优于继承 继承可能是类之间最明显、最简便的代码复用方式。如果你有两个代码相同的类, 就可以为它们创建一个通用的基类,然后将相似的代码移动到其中。但继承可能带来的问题: 子类不能减少超类的接口。...这一点很重要,因为子类的所有对象都可能被传递给以超类对象为参数的任何代码,相信你不会希望这些代码崩溃的。 继承打破了超类的封装,因为子类拥有访问父类内部详细内容的权限。...而使用 CRTP,完全消除了动态绑定,降低了继承带来的虚函数表查询开销。...CRTP包含: 从模板类继承, 使用派生类本身作为基类的模板参数。‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ 这样做的目的是在基类中使用派生类。...从基础对象的角度来看,派生对象本身就是对象,但是是向下转换的对象。因此,基类可以通过将static_cast自身放入派生类来访问派生类.

    1.2K40

    从零开始学C++之继承(二):继承与构造函数、派生类到基类的转换

    一、不能自动继承的成员函数 构造函数(包括拷贝构造函数) 析构函数 =运算符 二、继承与构造函数 基类的构造函数不被继承,派生类中需要声明自己的构造函数。...声明构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类成员的初始化调用基类构造函数完成(如果没有给出则默认调用默认构造函数)。...派生类的构造函数需要给基类的构造函数传递参数 #include  using namespace std; class ObjectB { public:     ObjectB...从输出可以看出: 派生类对象的构造次序: 先调用基类对象成员的构造函数,接着是基类的构造函数,然后是派生类的对象成员的构造函数,最后是派生类自身的构造函数。...初始化列表参数多个且其中有调用基类构造函数时,先执行基类构造函数(从最远的开始,如果多重继承则按继承的顺序);其他对象成员若不止一个,则按定义的顺序构造,与初始化列表顺序无关。

    1.5K00

    醒醒吧,静态多态根本没有这么香

    的典型使用场景 —— 静态多态,其实很容易理解,如果需要在编译期让父类的某个方法调用子类的方法,那必然需要让父类能够感知到子类的类型信息,因为你需要将 this 指针转换成子类指针才能调用对应方法。...看起来相当美好,因为让编译器打工可以省去运行时的开销,这里很明显就是使用构建时间去换取虚函数表的开销。但我想说的是,静态多态是个伪命题。...很明显是因为虽然 Child1 和 Child2 同源自 Bsae,但实际上他俩的基类完全是不同类型!...class Child1 : public Base {} class Child2 : public Base {} 既然是不同类型,那么我就无法将内存从父类和子类之间自由转换...其实这一特点单单影响方法还好,模板方法不嫌多,但是如果我想要使用静态多态实现的类有多层继承关系呢?

    69310

    编程轻松炫技:不费吹灰之力打印100个数字,面试考点应有尽有

    今天来给大家用一些C++的骚操作来写出这种代码,欢迎留言与转发~ 这道题目其实非常简单,但却涵盖了很多面试考点,其中包括: 模版特化、便特化,如何编写递归模版 CRTP std::copy、std::iota...、std::transform如何使用,各自算法实现 类静态变量 等等 1.递归 1-100可以拆为554,用三个函数去打印它,函数a cout一次,然后变量加1,函数b层层嵌套a重复5次,函数c层层嵌套...方式3基于方式2,将其改造为crtp编程风格,是不是有点看不懂了,嘿嘿。...其实就是两个类,第一个类Print为父类,打印每次的I,并调用子类,子类PrintDerived即成Print,并将自己传递给父类,子类是一个重载类,控制递归终止。...C++20的std::views,在std::copy时打印。

    18410

    惯用法之CRTP

    其实,这样做的目的其实很明确,从基类对象的角度来看,派生类对象其实就是本身,这样的话只需要使用类型转换就可以把基类转化成派生类,从而实现基类对象对派生对象的访问。...中定义了一个成员函数imp(),而该函数在基类Base中是没有声明的,所以,我们可以理解为对于CRTP,在基类中调用派生类的成员函数,扩展了基类的功能。...而对于普通继承,则是派生类中调用基类的成员函数,扩展了派生类的功能,这就是我们所说的颠倒继承。 使用场景 俗话说,存在即合理。既然有CRTP,那么其必然有自己存在的道理。...如果类型为Derived1和Derived2,则会调用这俩类型对应的imp()函数。而对于Derived3,因为其类内没有实现imp()函数,所以调用的是Base类即基类的imp函数。...但是,问题在于Base类实际上是一个模板类,而不是一个实际的类。因此,如果存在名为Derived和Derived1的派生类,则基类模板初始化将具有不同的类型。

    90020

    模板编程高级技巧与实战

    一、 CRTP(奇异递归模板模式)1.1 静态多态与代码复用核心思想:通过模板参数将派生类类型传递给基类,利用编译时多态替代运行时虚函数调用。这种技术能减少内存占用(无需虚函数表)并提升执行效率。...MessageBox(nullptr, L"Button Draw", L"CRTP Demo", MB_OK); }};static_cast:将基类指针转换为派生类指针...override:C++11引入的关键字,强制要求派生类重写该方法1.2 Windows控件优化实践性能对比:传统动态多态方式需要维护虚函数表(vtable),每次调用产生间接跳转开销。...+绘制按钮 // ... }};优势:DoPaint()的调用时延降低约30%-50%(实测数据)适用场景:高频调用的UI控件基类、需要极致性能的场景1.3 实战技巧扩展静态成员访问...{private: static void SpecificResourceLoader() { LoadImageFromFile(L"button.png"); }};构造函数注入

    17320

    关于Java构造函数(Constructor)的常见问题总结1 为什么调用子类的构造方法的时候,默认会调用父类的构造方法2 常见错误:Implicit super constructor is und

    这篇文章总结了Java使用构造函数中最常遇到的五个问题!...1 为什么调用子类的构造方法的时候,默认会调用父类的构造方法 看下面这个简单的例子: package cc; public class Sub extends Super { public Sub...上一小节,我们知道,如果子类的构造函数中,没有显示的调用父类的构造函数,那么,编译器就会插入super(),也就是自动调用无参的构造函数。但是此时,父类没有无参的构造函数,所以就会报错了。...解决这个问题很简单,我们可以给父类插入一个无参的构造函数,或者在子类构造函数中显示的调用的父类有参构造函数。 在子类的构造函数中显示的调用父类的构造函数 下面的代码是正确的。 ?...Paste_Image.png 构造函数的使用规则 简单的说,在使用的时候,子类的构造函数必须调用父类的构造函数,不管有没有显示的声明。所以,被调用的父类构造函数,一定在定义好!

    3K41

    Python类

    a添加变量或者赋值,可以直接用“.”加变量赋值即可 2.类的构造器         __init__构造函数,在生成对象时调用。   ...类的继承   如果你有一个现有的A类,现在需要写一个B类,但是B类是A类的特殊版,我们就可以使用继承,B类继承A类时,B类会自动获得A类的所有属性和方法,A类称为父类,B类陈为子类,子类除了继承父类的所有属性和方法...Cat is running... 4.类的方法重写 在python中继承中的一些特点: 1)在继承中基类的构造(init()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。 ...区别于在类中调用普通函数时并不需要带上self参数  3)Python总是首先查找对应类型的方法,如果它不能在派生类(子类即当前类)中找到对应的方法,它才开始到基类(父类)中逐个查找。...(先在本类中查找调用的方法,找不到才去基类中找)。  4)由上面的关系,可以进行方法的重写,在子类中重写父类方法。

    98020

    【C++】详细讲解继承(上)

    派⽣类和基类中有同名成员,派⽣类成员将屏蔽基类对同名成员的直接访问,这种情况叫隐藏。...不会,子类把父类同名函数隐藏了,直接报错。 如果传参,像下面这样,就会调用子类里的fun函数。...如果基类没有默认的构造函数,则必须在派⽣类构造函数的初始化列表阶段显⽰调⽤。 派⽣类对象初始化先调⽤基类构造再调派⽣类构造。...这里用到的就是前面说过的 子类和父类对象赋值兼容转换 。我们要拷贝父类的那一部分,就要把父类的那一部分拿出来,我们把子类对象s传给父类Same,Same的拷贝构造函数是引用传参。...//自动调用父类析构 } 4.2 实现一个不能被继承的类 ⽅法1:将基类的构造函数 私有 ,派⽣类的构成必须调⽤基类的构造函数,但是基类的构成函数私有化以后,派⽣类看不⻅就不能调⽤了,那么派⽣类就⽆法实例化出对象

    4000
    领券