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

Java - 你可以覆盖一个没有调用父类构造函数的类吗?

在Java中,如果一个类没有显式调用父类的构造函数,那么会默认调用父类的无参构造函数。但是,如果父类没有无参构造函数,而只有带参数的构造函数,那么子类在构造时必须显式调用父类的带参数构造函数。

覆盖一个没有调用父类构造函数的类是不可行的,因为在Java中,子类的构造函数必须首先调用父类的构造函数,以确保父类的初始化工作完成。这是因为子类继承了父类的属性和方法,而构造函数负责初始化这些属性和方法。

如果子类没有显式调用父类的构造函数,编译器会自动插入一条默认的super()语句,即调用父类的无参构造函数。如果父类没有无参构造函数,编译器会报错。

因此,为了覆盖一个没有调用父类构造函数的类,我们需要在子类的构造函数中显式调用父类的构造函数,使用super关键字来实现。例如:

代码语言:java
复制
public class ChildClass extends ParentClass {
    public ChildClass() {
        super(); // 调用父类的无参构造函数
        // 子类的其他初始化操作
    }
}

在这个例子中,子类的构造函数首先调用了父类的无参构造函数,然后进行了子类的其他初始化操作。

总结起来,覆盖一个没有调用父类构造函数的类是不可行的,子类的构造函数必须首先调用父类的构造函数,以确保父类的初始化工作完成。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

python 子类调用构造函数实例

当子类继承后,需要调用方法和属性时,需要调用初始化函数。...,但新构造函数没有初始化,当没有初始化构造函数时,就会报错。...super函数返回一个super对象,解析过程自动查找所有的,当前和对象可以作为super函数参数使用,调用函数返回方法是超方法。...使用super函数如果子类继承多个只许一次继承,使用一次super函数即可。 如果没有重写子类构造函数,是可以直接使用属性和方法。...以上这篇python 子类调用构造函数实例就是小编分享给大家全部内容了,希望能给大家一个参考。

3.5K30

Java中子类和构造函数

参考链接: Java继承和构造函数 这篇文章总结了关于Java构造常见​​问题。  1)为什么创建一个子类对象要也需要调用构造函数? ...如果没有,编译器会插入调用构造语句。这就是为什么在创建子类对象时构造函数会被调用。  这里没有创建两个对象,只有一个子对象。...让构造器被调用原因是,如果有私有的属性需要在它构造函数中初始化。 ...在Java中,如果一个没有定义构造函数,编译器会为默认创建一个无参构造函数。如果在中定义了构造函数super(String s),在这种情况下,编译器将不会为创建一个无参构造函数。...3)子类中显式调用构造函数  下面的代码是正常:    子类(Sub)构造函数显式地调用(Super)中带参构造参数。如果中定义了相对应构造函数,那将会被正常良好调用

2.1K20

Android 通过 JNI 调用 Java 构造方法和方法

Android 还可以通过 JNI 来调用 Java 一个构造方法,从而创建一个 Java 调用构造方法 调用构造方法步骤和之前调用实例方法步骤类似,也需要获得对应和方法 id。...完成了以上准备条件后,就可以通过 NewObject 来调用构造方法,从而创建具体。...再来看一个调用自定义构造方法示例,还是之前 Animal ,它构造方法有一个 String 类型参数。...通过这种方法,同样可以创建一个 Java调用方法 可以通过 JNI 来调用实例方法。...首先,构造一个相应子类,然后获得 类型和方法 id,以及准备对应参数,根据方法返回值选择调用不同 CallNonvirtualMethod 函数

2.6K20

ASP.NET AJAX(6)__Microsoft AJAX Library中面向对象类型系统命名空间——构造函数——定义方法——定义属性——注册——抽象——继承——调用

可重复注册命名空间,每个独立脚本模块前都要注册命名空间以保证命名空间存在 定义构造函数 定义成员(方法、属性、事件) 注册 ——构造函数 构造函数即为function定义 通常用于初始化域变量..._mymethod=function{throw Error.notImplemented();}}//包含抽象方法 ——继承 调用构造函数必须调用构造函数,否则会丢失继承效果...可以直接以普通方式实现抽象成员 toString方法无法被继承 ——调用方法 MyNamespace.MyClass.prototype={myMethod:function(param1...= function(name) { MyNamespace.Intern.initializeBase(this, [name]);//调用构造函数 } MyNamespace.Intern.prototype...= function(name) { MyNamespace.Intern.initializeBase(this, [name]);//调用构造函数 } MyNamespace.Intern.prototype

6.2K50

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

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

6.1K10

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

编译器错误是因为默认super()无参构造函数没有定义。在Java中,如果一个没有定义构造函数,编译器会自动插入一个默认无参构造函数。...上一小节,我们知道,如果子类构造函数中,没有显示调用构造函数,那么,编译器就会插入super(),也就是自动调用无参构造函数。但是此时,没有无参构造函数,所以就会报错了。...解决这个问题很简单,我们可以插入一个无参构造函数,或者在子类构造函数中显示调用有参构造函数。 在子类构造函数中显示调用构造函数 下面的代码是正确。 ?...Paste_Image.png 构造函数使用规则 简单说,在使用时候,子类构造函数必须调用构造函数,不管有没有显示声明。所以,被调用构造函数,一定在定义好!...比如说,考虑这个Scanner,他有几个构造函数可以通过这几个构造函数,声明你想要读取数据来源,如果编译器增加了无参构造函数,那么不给定读取数据源,就会报错,程序无法执行,因为我们不能不指定一个数据源就让他去读取数据

2.7K30

知道?多个多线程环境下静态构造函数执行顺序

网上很多资料说到静态构造函数,但是很少提到与线程相关,这个例子实际上是想测试一下静态构造函数多线程冲突。 其实,这个问题源自于XCode v7.3中一个隐秘BUG。...实体A静态构造函数中可能会开一个线程去执行方法B,然后静态构造函数接着执行后续方法C,问题就在于B和C都会争夺同一个锁,如果B拿到这个锁,它会创建一个A实例,但是因为A静态构造函数正常执行C,C...// 2,CreateOperate将会实例化一个TEntity对象,从而引发TEntity静态构造函数, // 避免实际应用中,直接调用Entity静态方法时,没有引发...它本身也有静态构造函数,并且它静态构造函数里面会开一个线程去调用EntityFactory.CreateOperate(Type type),该方法会取得一个字典锁,然后通过Activator.CreateInstance...答案: 上面微软答复邮件说得很清楚,静态构造函数只会被调用一次,并且在它执行完成之前,任何其它线程都不能创建这个实例或使用这个静态成员!

85970

c++学习笔记4,调用派生顺序构造和析构函数一个

大家好,又见面了,我是全栈君 测试源代码: //測试派生构造函数调用顺序何时调用 //Fedora20 gcc version=4.8.2 #include using namespace...<<endl; } }; 測试代码: int main() { A a; A *a1; cout<<"能够看到a1并没有调用构造函数..."<<endl; A *a2=new A; //仅仅有在new 一个对象时候才会调用构造函数 cout<<"能够看到...a3也并没有调用构造函数"<<endl; A *a3=&a; B b; } 输出为: 能够看到,在创建派生对象时候,首先调用是基构造函数,然后才是调用派生自己构造函数...而在析构时候,顺序则刚好相反,先调用派生析构函数,然后才是调用构造函数。这是由于对象创建时候对象存放在堆栈中原因。(new 对象尽管是存在堆中,可是在堆栈中依旧存放其堆中地址,因此。

68210

Java】反射简介,利用反射打印一个当中构造函数,方法和属性。

2、Java属于先编译再运行语言,程序中对象类型在编译期就确定下来了,而当程序在运行时可能需要动态加载某些,这些因为之前用不到,所以没有被加载到JVM。...Class clazz = Student.class; 通过对象获取 (能够拿到这个对象但是不知道是什么可以假定下边代码没有第一行,只有第二行,那么能否知道s是哪个对象?)。...2.获取一个构造函数 通过class对象我们可以获取这个构造函数。传入参数是一些class对象,通过这些class对象能确定要获取是哪个构造函数,例如下边代码。...注意参数,第一个参数是name,代表着你想要获取方法名称,第二个参数不陌生了吧,在上边我们获取构造函数时候见过,这个参数就代表着要获取方法参数类型都是什么,防止方法重载影响。...modifier值是一个累加结果,大家可以自己试一试。在上边代码中我们能够看到,构造方法和普通方法都可以调用 getModifiers()方法,当然属性也可以

12110

23.C++- 继承多种方式、显示调用构造函数、父子之间同名函数、virtual虚函数  上章链接: 22.C++- 继承与组合,protected访问级别

注意: protected继承只针对子类有效 比如当是protected继承时,则子类子类就无法访问所有成员 一般而言,C++项目只用到public继承 显示调用构造函数 当我们创建子类对象时...,编译器会默认调用无参构造函数 若有子类对象,也会默认调用子类对象无参构造函数。...StrB(int i):123 也可以通过子类构造函数初始化列表来显示调用 接下来,修改上面子类StrB(string s)函数,通过初始化列表调用StrA(string s)构造函数 改为:...子类可以定义父同名成员和同名函数 子类中成员变量和函数将会隐藏同名成员变量和函数 同名成员变量和函数依然存在子类中 通过作用域分辨符(::)才可以访问同名成员变量和函数...,可以访问子类中同名覆盖成员函数 首先参考下面,没有函数示例: class Parent { int i; public: void example()

3.1K90

【面试题】Java中子类和静态代码块、非静态代码块、构造函数执行顺序总结一览表

我们来看下B编译成class文件时候,非静态代码块和构造函数相关代码如下:从代码中,我们可以看出非静态代码块执行顺序优先于构造函数。...如果中,没有无参构造,那么子类必须使用supper这个关键字来调用带参数构造方法,否则在编译期都不能通过。...如果想了解更多,可以看看这几篇文章《JVM学习第一篇思考:一个Java代码是怎么运行起来-上篇》、《JVM学习第二篇思考:一个Java代码是怎么运行起来-下篇》和《一个Java在运行时候,变量是怎么在...总结:好了,通过上面分析,我们可以得到以下总结:1:如果在同一个中静态代码块、非静态代码块、构造函数执行顺序如下:静态代码块→非静态代码块→构造函数这个过程,我们反编译class文件也可以看到。...,我们可以知道运行结果:B静态代码块 子类A静态代码块 B非静态代码块 sya() B构造函数 子类A非静态代码块 sya()1 子类A构造函数 A!

55750

C++和java多态区别

唔,要说了,好象差不多嘛,不是都要维护一张函数?别急,让我们先看一下例子,这样就能更好理解它们之间区别到底有多大了。...下面是C++和java例子,不看后面的答案,能够正确说出它们执行结果?...java对象在构造前(调用构造函数之前)就已经存在了,其函数表和对象类型也已经确定了,就是说还没有出生就已经存在了。...四、用final关键字修饰最终方法不能被覆盖。            五、变量只能被隐藏不会被覆盖,子类实例变量可以隐藏变量,子类变量也可以隐藏实例变量。      ...其次调用无参构造函数,Parent构造函数中做唯一事情就是调用了add(2);       第三、由于子类add(int y)方法覆盖方法,所以add(2)实际调用是子类方法,

92010

新手学JAVA(七)----Override VS Overload

有180cm高?...重载实质: 方法名相同 参数个数可以不同 参数类型可以不同 当访问一个重载方法时,首先编译器会比较参数类型与实际调用方法中使用值得类型,已选择正确方法,如果发现没有匹配方法,则编译器报错。...Override ---- 说到覆盖,就要先说说面向对象三大特征之一:继承;在继承过程中,子类中可以直接使用所继承下来方法,但是当子类中有声明了相同名称方法的话,调用则是子类方法,这就是所谓覆盖...从上面的这段代码可以看出,子类重新定义print()方法,子类覆盖方法与相同,知识方法体不一样。 三....name) '''带一个参数构造函数''' {} student (string name,string code) '''带两个参数构造函数''' } 上面的三个例子是3个构造函数重载函数

47120

Java与继承

首先,我们讲述一下与初始化相关东西,然后再从几个方面阐述继承这一大特性。以下是本文目录大纲:   一.了解?   二.了解继承?   三.常见面试笔试题 一.了解?   ...如果两个存在继承关系,则子类会自动继承方法和变量,在子类中可以调用方法和变量。在java中,只允许单继承,也就是说 一个最多只能显示地继承于一个。...但是一个可以被多个继承,也就是说一个可以拥有多个子类。   1.子类继承成员变量   当子类继承了某个之后,便可以使用成员变量,但是并不是完全继承所有成员变量。...如果有无参构造器,则在子类构造器中用super关键字调用构造器不是必须,如果没有使用super关键字,系统会自动调用无参构造器。...第一种用法主要用来在子类中调用同名成员变量或者方法;第二种主要用在子类构造器中显示地调用构造器,要注意是,如果是用在子类构造器中,则必须是子类构造一个语句。

68730

Java与继承

首先,我们讲述一下与初始化相关东西,然后再从几个方面阐述继承这一大特性。以下是本文目录大纲:   一.了解?   二.了解继承?   ...如果两个存在继承关系,则子类会自动继承方法和变量,在子类中可以调用方法和变量。在java中,只允许单继承,也就是说 一个最多只能显示地继承于一个。...但是一个可以被多个继承,也就是说一个可以拥有多个子类。   1.子类继承成员变量   当子类继承了某个之后,便可以使用成员变量,但是并不是完全继承所有成员变量。...如果有无参构造器,则在子类构造器中用super关键字调用构造器不是必须,如果没有使用super关键字,系统会自动调用无参构造器。...第一种用法主要用来在子类中调用同名成员变量或者方法;第二种主要用在子类构造器中显示地调用构造器,要注意是,如果是用在子类构造器中,则必须是子类构造一个语句。

71610

Java与继承

首先,我们讲述一下与初始化相关东西,然后再从几个方面阐述继承这一大特性。以下是本文目录大纲:   一.了解?   二.了解继承?   ...如果两个存在继承关系,则子类会自动继承方法和变量,在子类中可以调用方法和变量。在java中,只允许单继承,也就是说 一个最多只能显示地继承于一个。...但是一个可以被多个继承,也就是说一个可以拥有多个子类。   1.子类继承成员变量   当子类继承了某个之后,便可以使用成员变量,但是并不是完全继承所有成员变量。...如果有无参构造器,则在子类构造器中用super关键字调用构造器不是必须,如果没有使用super关键字,系统会自动调用无参构造器。...第一种用法主要用来在子类中调用同名成员变量或者方法;第二种主要用在子类构造器中显示地调用构造器,要注意是,如果是用在子类构造器中,则必须是子类构造一个语句。

50330

静态代码块、静态变量,构造代码块、实例变量执行顺序和继承逻辑

如果问:Java三大特性是什么?顺口就能答出:封装、继承、多态。如果继续问:真的了解Java继承? 或许本来很懂,但被我这么一问就有点怀疑了。...但是,但是,但是,如果构造快为有参构造,请记得显示调用super方法,否则是不能被初始化。如果子类构造没有显示地调用构造器,则将自动调用默认(没有参数) 构造器。...,这个时候,bean属性还没有被注入 @PostConstruct优先于afterPropertiesSet执行:在这执行,属性已经完成了赋值(注入) 继续补充:子类默认调用构造函数问题 Java有个很有趣现象...:有N多个构造函数,子类如果只写一个的话那么子类最终就只有一个构造函数可用,因此子类在这方面要特别的注意喽。...若木有空构造,子类所有构造都必须显示调用super(xxx)· 总结 据反馈,看了此篇文章后,很多小伙伴感觉自己学是另外一个Java,其实这就是JavaSE,很多架构师认为,Java基础才是精华中精华

91350

java面向对象相关知识

当新对象被创建时候,构造函数会被调用。每一个都有构造函数。在程序员没有提供构造函数情况下,Java编译器会为这个创建一个默认构造函数Java构造函数重载和方法重载很相似。...可以一个创建多个构造函数。每一个构造函数必须有它自己唯一参数列表。...Java不支持像C++中那样复制构造函数,这个不同点是因为如果不自己写构造函数情况下,Java不会创建默认复制构造函数。...内部类可以引用他包含成员,如果可以,有没有什么限制一个内部类对象可以访问创建它外部类对象内容,内部类如果不是static,那么它可以访问创建它外部类对象所有属性内部类。...可以一个成员函数调用外面写一个try语句,在这个成员函数内部写另一个try语句保护其他代码。每当遇到一个try语句,”异常“框架就放到堆栈上面,直到所有的try语句都完成。

55510
领券