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

当Base类构造函数在Java中调用重写方法时,Derived类对象的状态

当Base类构造函数在Java中调用重写方法时,Derived类对象的状态取决于重写方法的实现。如果重写方法在Base类构造函数被调用之前被调用,那么Derived类对象的状态将不会受到Base类构造函数的影响。如果重写方法在Base类构造函数被调用之后被调用,那么Derived类对象的状态将受到Base类构造函数的影响。

在Java中,构造函数是一种特殊的方法,它用于初始化对象的状态。当创建一个Derived类对象时,首先会调用Base类的构造函数,然后再调用Derived类的构造函数。在Base类构造函数被调用期间,Derived类对象的状态尚未完全初始化,因此在Base类构造函数中调用重写方法可能会导致未定义的行为。

为了避免这种情况,建议在Base类构造函数中避免调用重写方法,或者在Derived类中使用super关键字来显式调用Base类的构造函数。这样可以确保Derived类对象的状态在Base类构造函数被调用之前已经完全初始化。

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

相关·内容

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

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

6.1K10

关于使用MethodHandle子类调用祖父重写方法探究

关于使用MethodHandle子类调用祖父重写方法探究 注:这个例子原本出现在周志明先生《深入理解Java虚拟机》--虚拟机字节码执行引擎章节,介于有读者朋友有疑问,这里基于Java代码层面解释一下...这里直接看Sonthinking方法(关于为何这样实现,《深入理解Java虚拟机》读书笔记(七)--虚拟机字节码执行引擎(下)也解释了)。...由于找到thinking方法是非static,需要一个隐式入参(也就是栈帧中局部变量表第0个位置this参数),java这叫做该方法接收者。...普通方法调用,这个this参数是虚拟机自动处理,表示是当前实例对象,我们方法可以直接使用。...基于这个事实,我们这时可以直接在GrandFatherthinking方法调用Son独有的方法,使用反射或者直接类型强制转换为Son就行了。

9.4K30

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

可重复注册命名空间,每个独立脚本模块前都要注册命名空间以保证命名空间存在 定义构造函数 定义成员(方法、属性、事件) 注册 ——构造函数 构造函数即为function定义 通常用于初始化域变量...function()} ——定义属性 Microsoft AJAX Library面向对象类型系统将get_xxx和set_xxx开头方法认做属性(一种约定) 避免定义只写属性,使用某个方法替代..._mymethod=function{throw Error.notImplemented();}}//包含抽象方法 ——继承 调用构造函数 有父必须调用构造函数,否则会丢失继承效果...Employee三个 接口 与定义方法大致相同 构造函数抛出异常 所有的方法抛出异常(只有方法签名,不提供实现) 注册接口使用registerInterface方法 接口无法继承其他接口 接口定义.../如果当前 Type object 表示对象继承层次结构,或者如果当前 Type 是 object 支持接口,则为 true Type.isClass Type.isInterface Type.isNamespace

6.2K50

方法全部都是 static 关键字修饰 ,它构造方法最好作为 private 私有化,理由是方法全是 static, 不知道的人会去new对象调用,需要调用构造方法。 但 static

方法全部都是 static 关键字修饰 ,它构造方法最好作为 private 私有化,理由是方法全是 static, 不知道的人会去new对象调用,需要调用构造方法。...但 static方法直接用调用就行!...可以通过调用。     其实它本身也可以通过对象调用。     推荐使用调用。     静态修饰内容一般我们称其为:与相关成员。...注意事项     a:静态方法是没有this关键字       如何理解呢?       ...成员变量属于对象,所以也称为实例变量(对象变量)。   B:内存位置不同     静态变量存储于方法静态区。     成员变量存储于堆内存。

1.1K20

super关键字

1.介绍及使用 由于设计不好,或者场景需要,子类和父可能会存在相同名称成员,如果要在子类方法访问父类同名成员,直接访问是无法做到java提供了super关键字,主要作用:子类方法访问父成员...2.子类构造方法 子类对象构造,需要先调用构造方法,然后执行子类构造方法。...[] args) { Derived d = new Derived(); } } 结果打印: Base() Derived() 子类构造方法,并没有写任何关于基构造代码,但是构造子类对象...调用构造,必须是子类构造函数第一条语句。 4. super(...) 只能在子类构造方法中出现一次,并且不能和 this 同时出现。...都是 Java 关键字。 2. 只能在非静态方法中使用,用来访问非静态成员方法和字段。 3. 构造方法调用时,必须是构造方法第一条语句,并且不能同时存在。

8310

JavaSE继承和多态

子类构造方法,super(…)调用构造,必须是子类构造函数第一条语句 super(…)只能在子类构造方法中出现一次,并且不能和this同时出现 3、super和this 相同点...} 二、多态 1、多态概念 通俗来说,就是多种形态,具体点就是去完成某个行为,不同对象去完成时会产生出不同 状态 java要实现多态条件: 必须在继承体系下 子类必须要对父方法进行重写...,传递不同类对象,会调用对应方法 2、重写 重写概念: 重写(override):也称为覆盖,子类重写函数,对父函数进行覆盖 重写是子类对父非静态、非private修饰,非final修饰...,和子类都有同名属性时候,通过父引用,只能引用父自己成员属性 构造方法没有多态性,构造调用方法(如果这个方法被子类重写, 就会触发动态绑定, 但是此时子类对象还没构造完成), 可能会出现一些隐藏但是又极难发现问题...代码运行效率降低 属性没有多态性,和子类都有同名属性时候,通过父引用,只能引用父自己成员属性 构造方法没有多态性,构造调用方法(如果这个方法被子类重写, 就会触发动态绑定, 但是此时子类对象还没构造完成

26720

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

Paste_Image.png 继承自一个时候,构造方法就会首先调用super()方法。如果没有显式写这个语句,那么编译器就会自动插入这个语句。...这就是为什么我们上面的那个例子程序会先调用super构造方法。 但要切记,** 虽然调用了父构造方法,但只创建了一个对象也就是子对象。...编译器错误是因为默认super()无参构造函数是没有定义Java,如果一个没有定义构造函数,编译器会自动插入一个默认无参构造函数。...解决这个问题很简单,我们可以给父插入一个无参构造函数,或者子类构造函数显示调用有参构造函数子类构造函数显示调用构造函数 下面的代码是正确。 ?...为什么Java一个已经实现了一个带参构造函数时候,不实现默认无参构造函数? 这是个很有趣问题。

2.5K30

Java面试-面向对象

Java,运行时多态性或动态方法分派是一个在运行时而不是在编译解决对覆盖方法调用过程。在此过程,将通过超引用变量调用重写方法。让我们看下面的示例,以更好地理解它。...Java接口是蓝图,或者可以说它是抽象方法和静态常量集合。接口中,每个方法都是公共和抽象,但不包含任何构造函数。因此,接口基本上是一组带有空主体相关方法。...您必须注意一件事是Object clone()是一种受保护方法,因此您需要重写它。 Q17。Java构造函数是什么? 复制构造函数是一个成员函数,用于使用同一另一个对象初始化一个对象。...尽管Java不需要复制构造函数,因为所有对象都是通过引用传递。而且,Java甚至不支持自动按值传递。 Q18。什么是Java构造函数重载?...Java构造函数重载是一种将任意数量构造函数添加到每个具有不同参数列表技术。编译器使用列表参数数量及其类型来区分重载构造函数

69120

#1构造函数调用方法 | TW洞见

我们构造函数调用方法,碍着ReSharper什么事儿了? 其实这个警告就是提醒我们不要在非封闭类型构造函数调用方法或虚属性。但为什么这样做不合适呢?解惑之前,我们先来了解两个概念。...你也许已经猜到了,它结果是: Base constructor Derived constructor 我们初始化一个对象,总是会先执行基构造函数,然后再执行子类构造函数。...} } Base构造函数调用方法V(),ReSharper会给出virtual member call in constructor警告。...而由于之前提到类型初始化顺序,执行Base b = new Derived();这样代码Base构造函数要早于Derived构造函数执行,因此执行到foo.Bar()foo还是个空引用...Virtual member call in constructor警告是因为,对于Base b = new Derived();这样代码: 基构造函数执行要早于子类构造函数构造函数对于虚方法调用

1.1K110

【易错概念】Solidity语法重载,继承定义

调用另一个合约实例函数,会执行一个 EVM 函数调用,这个操作会切换执行时上下文,这样,前一个合约状态变量就不能访问了。...重载(Override)是多态一种形式,是一个内部,方法多个参数,根据入参个数不同,会返回不同结果。 重写(Overwrited),是子类继承父重写方法。...一个合约从多个合约继承区块链上只有一个合约被创建,所有基合约代码被复制到创建合约。...中使用 super 调用实际函数在当前上下文中是未知,尽管它类型是已知。 这与普通虚拟方法查找类似。 4.1 基构造函数参数 派生合约需要提供基构造函数需要所有参数。...} } 一种方法直接在继承列表调用构造函数(is Base(7))。

1.5K30

深入解析C++函数和虚继承:实现多态性与继承关系高级特性

这使得继承关系,通过基指针或引用调用函数,可以根据实际对象类型来动态地确定要执行函数版本,实现多态性特性。...C++指针或引用指向派生对象,通过调用函数,可以实现对应于派生特定实现。这种根据对象实际类型来确定调用哪个函数机制就是动态绑定。...cwaterbird,由于它继承于cbird和cfish,所以会先去调用他们构造函数,但是他们又继承于canimal,于是又先去调用animal was created,然后再是鸟类自身构造...->pureVirtualFunction(); // 通过基指针调用Derived实现 return 0; } 在上述示例BasepureVirtualFunction函数被声明为纯虚函数...Derived继承自Base,并提供了对纯虚函数具体实现。通过Derived对象或基指针可以调用纯虚函数具体实现。 纯虚函数允许定义一组接口,并强制要求派生提供相应实现。

62710

Java Review (十、面向对象----继承)

量,则会发生子类实例变量隐藏父实例变量情形,子类定义实例方法可以通过 super 来访问父中被隐藏实例变量 程序创建一个子类对象,系统不仅会为该类定义实例变量分配内存,也会为,...也就是说,系统创建一个Java对象,如果该Java有两个父(一个直接父A,一个间接父B),假设A定义了 2个实例变量,B定义了 3个实例变量,当前定义了 2个实例变量,那么这个Java...这 Derived对象将会保存两个 tag变量,一个是 Parent 定义 tag 实例变量, 一个是Derived 定义 tag 实例变量。...调用构造器 子类是不继承父构造器(构造方法或者构造函数,它只是调用(隐式或显式)。...如果父没有不带参数构造器, 并且子类构造又没有显式地调用其他构造器则 Java 编译器将报告错误。

47230

【C++】构造函数分类 ② ( 不同内存创建实例对象 | 栈内存创建实例对象 | new 关键字创建对象 )

一、不同内存创建实例对象 1、栈内存创建实例对象 在上一篇博客 【C++】构造函数分类 ① ( 构造函数分类简介 | 无参构造函数 | 有参构造函数 | 拷贝构造函数 | 代码示例 - 三种类型构造函数定义与调用...) , 介绍了 三种类型 构造函数 , 并在 main 函数 分别 调用了这 3 种构造函数 ; 下面的调用方式 , 调用一个构造函数 , 创建 Student 实例对象 , 最终将实例对象赋值给了...栈内存 变量 Student s1 ; 这些都是 栈内存 创建 实例对象 情况 ; // 调用无参构造函数 Student s1; // 打印 Student s1 实例对象值..., 会自动将栈内存实例对象销毁 ; 栈内存 调用 构造函数 创建 实例对象 , 不需要关注其内存占用 ; 2、堆内存创建实例对象 栈内存 声明 实例对象 方式是 : 该 s1...; Student* s2; C++ 语言中 , 可以使用 new 关键字 , 调用有参构造函数 , 创建 实例对象 ; 在下面的 C++ 代码 , 声明并定义了 MyClass , 该类定义了一个有参构造函数

14520

TypeScript 官方手册翻译计划【十二】:

TypeScript 不会分析构造调用方法以检测初始化语句,因为派生可能会重写这些方法,导致初始化成员失败。...super(); } } JavaScript ,忘记调用 super 是一个常见错误,但 TypeScript 会在必要给你提醒。... ES2015 ,返回实例对象构造器会隐式地将 this 值替换为 super(...) 任意调用者。有必要让生成构造器代码捕获 super(...)...这是因为诸如 Error、Array 这样构造函数使用了 ES6 new.target 去调整原型链,但是, ES5 调用构造函数时候,没有类似的方法可以确保 new.target 值。...super 调用定义方法 this 类型 ,名为 this 特殊类型可以动态地引用当前类型。

2.5K10

C++和java多态区别

Java函数调用方式: 区别还是满大。...2) 调用(本例Base构造函数 3) 构造函数调用init(),执行程序首先判断出当前对象实际类型是Base(注意:Derived还没构造出来,当然不会是Derived,这是与...2) 调用(本例Base构造函数 3) 构造函数调用init(),执行程序首先判断出当前对象实际类型是Derived(注意:Derived已经构造出来,它函数表当然也已经确定了...java对象构造前(调用构造函数之前)就已经存在了,其函数表和对象类型也已经确定了,就是说还没有出生就已经存在了。...而C++只有构造完毕后(所有的构造函数都被成功调用)才存在,其函数表和对象实际类型才会确定。所以这两个例子执行结果会不一样。

89910

为什么Java成员变量不能被重写?成员变量Java能够被重写么?不会重写成员变量,而是隐藏成员变量访问隐藏域方法

这篇文章讨论了Java面向对象概念中一个基本概念--Field Hiding(成员变量隐藏) 成员变量Java能够被重写么?...不会重写成员变量,而是隐藏成员变量 Java文档对隐藏域定义: Within a class, a field that has the same name as a field in the superclass...意思就是: 一个,子类成员变量如果和父成员变量同名,那么即使他们类型不一样,只要名字一样。父成员变量都会被隐藏。子类,父成员变量不能被简单用引用来访问。...其实,简单来说,就是子类不会去重写覆盖父成员变量,所以成员变量访问不能像方法一样使用多态去访问。...访问隐藏域方法 就是使用父引用类型,那么就可以访问到隐藏域,就像我们例子代码 就是使用类型转换System.out.println(((Super)c1).s); 翻译自http://www.programcreek.com

3.5K40

对象与内存控制

,有方法调用者为其赋值,随着方法结束而消亡 方法内部变量:方法内部定义局部变量,必须在方法内对其进行显示初始化,随着方法结束而消亡 代码块内部局部变量:代码块内定义局部变量,必须在代码块内对其显式初始化...,几个实例就要创建几块内存空间 实例变量初始化时机 定义变量时候 代码块 构造 定义实例变量指定初始值、初始化块为实例变量指定初始值语句地位是平等经过编译器处理后,他们都将被提取到构造...,也就是说在编译后,初始化都会被放在构造按先后顺序进行初始化赋值 变量初始化时机 同一个JVM变量只能初始化一次 定义变量时候 静态代码块 父构造创建Java对象时候,都会先去执行该类对象非静态代码块和构造器...,最后才是该类非静态代码块和构造器 所谓隐式调用和显式调用,其实就是有没有用super去调用构造区别。...访问子类对象方法 子类可以重写方法,子类也可以通过super方式调用方法多态情况下,子类重写方法会覆盖掉父方法 class Base{ int count =2; public

39630

继承和多态(1)(继承部分)

子类构造方法 子类对象构造,需要先调用构造方法,然后执行子类构造方法。原理如下。...extends Base{ public Derived(){ // super(); // 注意子类构造方法默认会调用无参构造方法:super(), /...(); } } 结果打印: Base() Derived() 子类构造方法,使用super()或super(参数)能访问父构造方法。...(有this调用在第一行,其super也不会出现默认隐藏调用子类没有构造方法,默认有隐含无参数构造方法并且其内部存在super()。...构造方法调用时,必须是构造方法第一条语句,并且不能同时存在 【不同点】 1. this是当前对象引用,当前对象调用实例方法对象,super相当于是子类对象从父继承下来部分成员引用

7810
领券