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

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

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

6.2K10

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

关于使用MethodHandle在子类中调用祖父类重写方法的探究 注:这个例子原本出现在周志明先生的《深入理解Java虚拟机》--虚拟机字节码执行引擎章节,介于有读者朋友有疑问,这里基于Java代码层面解释一下...在普通的方法调用中,这个this参数是虚拟机自动处理的,表示的是当前实例对象,我们在方法中可以直接使用。...我觉得使用bindTo绑定方法接收者要比在invoke方法中传递更加友好,也更加符合程序员的大众理解,invoke可以只专注方法显式的入参。 然后再来说bindTo(this)中的this。...基于这个事实,我们这时可以直接在GrandFather的thinking方法中调用Son类独有的方法,使用反射或者直接类型强制转换为Son就行了。...这个参数中指定的是方法接收者的类型,bindTo指定的接收者的类型必须要是这个类或子类,不然会出现ClassCastException异常。

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

    【C++】继承 ⑩ ( 继承机制中的 static 静态成员 | 子类中访问父类静态成员的方法 )

    一、继承机制中派生类中的 static 关键字 1、子类继承父类静态成员 子类继承父类静态成员 : 父类 ( 基类 ) 中 使用 static 关键字 定义的 静态成员变量 , 可以被所有的 子类 (...派生类 ) 共享 ; 2、父类静态成员访问控制权限的改变 继承自 父类的 静态成员变量 , 仍然遵循 继承中 子类的 访问控制特性 , public 公有继承 : 父类成员 在 子类 中 , 访问控制权限...和 保护成员 可以在子类访问 , 私有成员不可在子类中访问 ; 父类中的 public 成员 变为 子类中的 protected 成员 ; 父类中的 protected 成员 仍然是 protected...都不可在子类中访问 ; 父类中的 public 成员 变为 子类中的 private 成员 ; 父类中的 protected 成员 变为 子类中的 private 成员 ; 父类中的 private...; 或 对象名.静态成员名 child.c = 30; 的方式 , 访问 继承自 父类的 静态成员 ; 4、静态成员使用要点 参考 【C++】静态成员变量 ( 静态成员变量概念 | 静态成员变量声明 |

    54810

    在C++中反射调用.NET(一) 反射调用第一个.NET类的方法

    为什么要在C++中调用.NET 一般情况下,我们常常会在.NET程序中调用C/C++的程序,使用P/Invoke方式进行调用,在编写代码代码的时候,首先要导入DLL文件,然后在根据C/C++的头文件编写特殊的...extern int Multiply(int factorA, int factorB); 详细的过程,可以参考之前我这篇文章:《C#调用C和C++函数的一点区别》 有时候,我们也会有在C++中调用...注意,本文说的C++反射调用,不是对C++自身进行封装的反射功能,而是在C++/CLI代码中反射调用.NET代码,原理上跟你在.NET应用中反射调用另外一个.NET的程序集一个道理。...在C++中,类的成员用 -> 符号调用,命名空间或者类的静态成员,用::调用,例如上面的构造函数中的代码: Assembly^ ass = Assembly::LoadFrom(this->assemblyFile...在C++/CLI中使用反射 反射调用第一个.NET类的方法 下面的方法,将会反射调用 User类的一个最简单的方法 : public int GetUserID(string IdString){} 该方法只有一个一个参数和一个简单的返回值

    3.2K100

    一步步分析-C语言如何面向对象编程

    第二个问题:继承 继承描述的是对象之间的关系,子类通过继承父类,自动拥有父类中的属性和行为(也就是方法)。...与C++对比:在C++的方法中,隐含着第一个参数this指针。当调用一个对象的方法时,编译器会自动把对象的地址传递给这个指针。...// 父类中的这个虚函数不应该被调用,也就是说子类必须实现这个虚函数。 // 类似于C++中的纯虚函数。...对象d中,从父类继承而来的虚表指针vptr,所指向的虚表是dog_vtbl。...基本上,在C中面向对象的开发思想就是以上这样。这个代码很简单,自己手敲一下就可以了。如果想偷懒,请在后台留言,我发给您。 六、C面向对象思想在项目中的使用 1.

    88221

    【Java】继承、抽象、组合

    参考链接: C++和Java中的继承比较 Java的继承、抽象、组合  类的继承基类和派生类继承语法:隐藏和覆盖   Object类包含的主要方法clone方法finalize方法getClass方法notify...,则从父类继承的变量将被隐藏子类拥有了两个相同名字的变量,一个继承自父类,另一个由自己声明当子类执行继承自父类的操作时,处理的是继承自父类的变量;而当子类执行它自己声明的方法时,所操作的就是它自己声明的变量...,但是不能更为严格  方法覆盖的应用场合  子类中实现与父类相同的功能,但采用不同的算法或公式在名字相同的方法中,要做比父类更多的事情在子类中需要取消从父类继承的方法  注意事项 必须覆盖的方法 派生类必须覆盖基类中的抽象的方法...不能覆盖的方法 基类中声明为final的终结方法 基类中声明为static 的静态方法 调用被覆盖的方法 super.overriddenMethodName();  Object类  Java程序中所有类的直接或间接父类...,其中包含了调用该方法时需要了解的全部信息 强迫子类完成指定的行为,规定其子类需要用到的“标准”行为  一个绘图的例子 各种图形都需要实现绘图方法,可在它们的抽象父类中声明一个draw抽象方法  abstract

    76030

    C#3.0面向对象程序设计一

    3.0 多态,程序通过一个一般的父类的引用用来实现在多个子类的方法,即调用方法时,实际被调用的代码和对象的实列有关 c++是通过指针或引用(&,变量别名)实现多态的,和c#不同,java多态实现和c#...sealed修饰的类不能被继承,在java中可以通过final修饰类实现 类的实列化 和java一样,c sharp中所有的类都看成是 引用类型,与c++不同,如 A a;该语句只是声明了一个指向类的引用...,并没有创建一个实际的对象实列 类的成员 类的成员可以分为二大类,一是本身声明的, 二是从父类继承来的。...2.0 在类的方法出现的this作为值类型,表示对调用该方法的对象引用。 3.0 在结构的构造函数中出现的this作为变量类型,表示对正在构造的结构引用。...4.0 在结构的方法出现的this作为变量类型,表示对调用该方法的结构引用。

    86360

    对Python继承和多态的理解

    是指在 Python 的面向对象开发过程中,对象的某些方法或者称为函数只想在对象的内部被使用,但不想在外部被访问到这些方法或函数。 即:私有方法是对象不愿意公开的方法或函数。...那么我们想在父类继承来的方法里面执行子类的特有的代码怎么办, 这里就引入了新的名词重写 那么什么是重写呢?...我的理解是,从父类继承过来,只有父类的方法和属性,那么我自己想要在父类的基础上面修改方法和属性该怎么办呢,那么重写就是用来解决这个问题的。...也就是我们在子类中并没有重新写初始化的方法。而是调用父类中的。...子类方法必须要重写父类方法。 首先定义一个父类,其可能拥有多个子类对象,当我们调用一个公共方法时,传递的对象不同,则返回的结果不同。

    27050

    【c++】继承学习(一):继承机制与基类派生类转换

    它是继承关系中处于较高层次的类,其特性(属性和方法)可以传递到派生的类中。其他从父类继承的类会自动获得父类定义的所有公共和受保护的成员。 子类/ 派生类: 子类是从一个或多个父类继承特性的类。...它是继承关系中处于较低层次的类,可以继承其一或多个父类的属性和方法。子类通常会添加一些特有的属性和方法,或者重写某些从父类继承的方法来改变行为。子类集成了父类的特征,并可以拥有自己的特征。...,如果基类成员不想在类外直接被访问,但需要在派生类中能访问,就定义为protected。...在切片过程中,派生类对象的部分(通常是额外添加的成员变量和方法)会被忽略,只有基类中定义的部分会被复制到基类对象中。...C++ 规则规定,如果派生类提供了和基类同名的函数,基类中同名的函数在派生类的作用域就不再可见了 因此,在 B 类的成员函数 fun(int) 中,调用 fun() 试图无参数调用被隐藏的同名函数会无法编译

    37910

    JavaScript 类完整指南

    user.getName() 是方法调用:它执行该方法并返回计算出的值(如果有的话)。 在类方法以及构造函数中,this 的值等于类实例。...在表达式 class Child extends Parent { } 中,子类 child 从父类继承构造函数\字段和方法。...5.1 父构造函数:constructor() 中的 super() 如果你想在子类中调用父构的造函数,则需要使用子构造函数中提供的特殊功能 super()。...类和原型 我必须说,JavaScript 中的类语法在从原型继承中进行抽象方面做得很好。为了描述 class 语法,我甚至没有使用术语原型。 但是这些类是建立在原型继承之上的。...继承是使用 extends 关键字实现的:你可以轻松地从父级创建子级。super 关键字用于从子类访问父类。 要使用封装,请将字段和方法设为私有来隐藏类的内部细节。

    99920

    【Java】面向对象的特征之一:继承

    ,参数列表不同(重载),根据调用方法传递的参数选择合适的方法访问 ; 但是如果我想在子类和父类成员变量名或成员方法中访问父类,那又应该怎么办?...在调用时,必须是构造方法中的第一条语句 不同点: this表示的是当前对象的引用,而super表示子类从父类继承下来部分成员的引用; 在非静态成员放方法中,this用来访问当前类的方法和属性,super...用来访问从父类继承下来的成员方法和属性; 在构造方法中,this()用来调用当前类的构造方法,super()用来调用父类构造方法,两种调用方法不能同时出现在构造方法中; 构造方法中一定会存在super(...)的调用,即使用户没有写编译器也会增加,但是this()不写就没有; 5.子类构造方法 在父类中使用构造方法的时候,在子类中也要提供构造方法,否则报错 为什么会出现这样的情况?...父子父子就是先有父再有子,我们要先帮助父类进行初始化。我对父类使用构造方法就是初始化了?我初始化了什么?他初始化的名字,年龄,颜色又是多少?我们都不知道,所以我们要通过子类帮助父类来进行初始化。

    8600

    virtual

    此时,基类的函数被隐藏(注意别与覆盖混淆)。 纯虚函数 C++语言为我们提供了一种语法结构,通过它可以指明,一个虚拟函数只是提供了一个可被子类型改写的接口。...当实例化一个该类的子类对象的时候,如果该类的子类没有定义虚函数,但是却从父类中继承了虚函数,所以在实例化该类子类对象的时候也会产生一个虚函数表,这个虚函数表是子类的虚函数表,但是记录的子类的虚函数地址却是与父类是一样的...如果我们在子类中定义了从父类继承来的虚函数,对于父类来说情况是不变的,对于子类来说它的虚函数表与之前的虚函数表是一样的,但是此时子类定义了自己的(从父类那继承来的)相应函数,所以它的虚函数表当中关于这个函数的指针就会覆盖掉原有的指向父类函数的指针的值...函数的覆盖和隐藏 父类和子类出现同名函数称为隐藏 父类对象.函数名() 调用父类的函数 子类对象.函数名() 调用子类函数 子类对象.父类名::函数名() 子类调用从父类继承来的函数 父类和子类出现同名虚函数称为覆盖...父类指针=new 子类名(……); 父类指针->函数名(……); 调用子类的虚函数 虚析构函数的实现原理 虚析构函数的实现原理: 当我们在父类中通过virtual修饰析构函数之后,通过父类指针指向子类对象

    66551

    十、继承

    十、继承 C++中的继承是一种面向对象编程(OOP)的特性,它允许一个类(称为派生类或子类)继承另一个类(称为基类或父类)的属性和方法。...通过将共通的属性和方法抽象到基类中,我们可以将注意力集中在派生类特有的属性和方法上。这种分而治之的策略使得类的设计和实现变得更加清晰和简单。...继承的基本使用 C++中的继承是一种面向对象编程的特性,它允许我们定义一个新的类(派生类或子类)来继承另一个类(基类或父类)的属性和方法。...继承中的同名成员 在C++中,当子类(派生类)和父类(基类)中存在同名成员时,这些成员实际上是在不同的作用域中定义的。这种情况主要涉及到成员函数(方法)和成员变量(属性)。...Derived的方法 总结 在C++中处理父子类中的同名成员时,需要注意成员变量会被隐藏,而成员函数则可能涉及重写或隐藏。

    7710

    第二阶段-Java面向对象:【第二章 继承】

    子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为 (父类更通用,子类更具体) 功能:有了继承以后,我们定义一个类的时候,可以在一个已经存在的类的...2.5 继承中构造方法的关系 A:子类中所有的构造方法默认都会访问父类中空参数的构造方法 B:理由: 因为子类会继承父类中的数据,可能还会使用父类的数据 所以,子类初始化之前,一定要先完成父类数据的初始化...2.6 继承中成员方法的关系 子类中的方法和父类中的方法声明一样 通过子类调用方法: ·先找子类中,看有没有这个方法,有就使用 ·再看父类中,看有没有这个方法,有就是用 ·如果没有就报错(不去看父亲的父亲...2.7 方法重写(override) 方法重写:子类中出现了和父类中方法声明一模一样的方法 (区别于方法重载,方法重载仅仅是方法名一样) 子类重写的应用:当子类需要父类的功能,而功能主体子类又有自己特有的内容时...2.8 final关键字 final 关键字声明类可以把类定义为不能继承的,即最终类; 或者用于修饰方法,该方法不能被子类重写: Final修饰变量的初始化时机 ·被final修饰的变量只能赋值一次 ·

    52230

    java中什么是继承,和继承的接口的关系?

    继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。...我是” + id + “号” + name + “.”); } } 这个Animal类就可以作为一个父类,然后企鹅类和老鼠类继承这个类之后,就具有父类当中的属性和方法,子类就不会存在重复的代码,...image ---- 继承的特性 子类拥有父类非 private 的属性、方法。 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。 子类可以用自己的方式实现父类的方法。...,这是 Java 继承区别于 C++ 继承的一个特性。...,即最终类;或者用于修饰方法,该方法不能被子类重写: 声明类: final class 类名 {//类体} 声明方法: 修饰符(public/private/default/protected)

    66740

    【Java零基础入门篇】第 ④ 期 - 继承(二)

    例如访问父类的成员变量、成员方法和构造方法。 可以在子类的方法或构造方法中,通过“super.属性”或”super.方法”的方式,显式的调用父类中声明的属性或方法。...在Java类中使用super来调用父类中的指定操作: super可用于访问父类中定义的属性(成员变量); super可用于调用父类中定义的成员方法; super可用于在子类构造器中调用父类的构造器; 调用父类的构造方法...,那么在子类构造器的首行,没有显示的声明”super(形参列表)”,默认调用的是父类中空参的构造器:super(); 注意: 当子父类出现同名成员时,可以用super表明调用的是父类中的成员; super...2.子类和父类定义了同名方法 子类内存里只有子类定义的方法,不再有父类定义的方法,这种现象叫做“覆盖”,也叫“方法覆写“ 覆盖 在继承关系中,子类从父类中继承了可访问的方法,但有时从父类继承下来的方法不能完全满足子类需要...,这时就需要在子类方法中修改父类方法,即子类重新定义从父类中继承的成员方法,这个过程称为方法重写或覆盖(覆写)。

    12510

    Java继承的概念及方法

    继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。...输出结果为: super.i = 50, this.i = 100 final关键字 final 关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写: 声明类...被声明为 final 类的方法自动地声明为 final,但是实例变量并不是 final 构造器 子类不能继承父类的构造器(构造方法或者构造函数),但是父类的构造器带有参数的,则必须在子类的构造器中显式地通过...调用父类的构造方法的唯一途径是使用 super 关键字,如果子类中没显式调用,则编译器自动将 super(); 作为子类构造方法的第一条语句。这会形成一个构造方法链。...但如果子类覆盖或重写了父类的方法,则只有使用 super 才能在子类中调用父类中的被重写的方法。 4、this 关键字 this 关键字表示当前对象。

    45920

    《JavaSE》---12.<面向对象系列之(继承)>

    通过继承 子类会将父类中的成员变量,成员方法继承到子类中,可以通过子类实例化对象,然后去引用父类成员变量和成员方法。...子类会继承父类的构造方法。此时必须要在子类中定义一个构造方法,并且在首行用super();来调用父类的构造方法,帮助父类构造,再构造子类自己的构造方法。这样才可以顺利编译。...若子类中没有构造方法去用super调用,那么就会编译报错,很好理解,既然子类继承的父类,那么在子类中,就一定要去调用父类的构造方法,帮助从父类继承下来的成员变量进行初始化。 小结: 1....总结 继承就是对共性的抽取,达到代码的复用。 通过继承子类会将父类中的成员变量,成员方法继承到子类中,可以通过子类实例化对象,然后去引用父类成员变量和成员方法。...this访问的时候,既可以访问从父类继承下来的,也可以访问子类自己的 super只能访问从父类继承过来的。在子类方法中,如果想要明确访问父类中成员时,借助super关键字即可。

    9210

    CC++面试常问题集(2)

    C++中,并不是所有的成员函数都能被子类继承,有三类成员函数不能被子类继承,分别是:构造函数(包括拷贝构造)、析构函数、赋值运算符重载函数。...一,构造函数  构造方法用来初始化类的对象,与父类的其它成员不同,它不能被子类继承(子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法)。...因此,在创建子类对象时,为了初始化从父类继承来的数据成员,系统需要调用其父类的构造方法。 二,析构函数  析构函数也不会被子类继承,只是在子类的析构函数中会调用父类的析构函数。...纯虚函数 函数声明的时候=0 没有方法实体的是纯虚函数 当类中有一个纯虚函数,这个类也称为抽象类。 抽象类特点: 无法实例化对象。...image.png 接口类用来表达一种能力或协议。 传参是子类。 可以使用接口类指针指向其子类对象,并调用子类对象中实现的接口类中纯虚函数。 不能使用接口类实例化对象。

    1.2K10

    【笔记】C++面向对象高级编程

    这个课程主要是我用来C++回顾和拾遗的,其中很多内容都来自他其它的课程,并且有很多是《EffectiveC++》的内容,在看了在看了。 这里直接就是我当时记录的全部笔记了,有点乱,自己也不太满意。...委托, 利用指针实现, 功能来自类内一个指向另一个类的指针 构造的时候都是从小到大(从父类到子类), 析构则相反, 内存分配也是大套小的 设计模式 普通单例: 静态成员在类内, 只要一写出这个类就会构造...父类写好一套算法流程, 但是其中调用的都是虚函数, 子类实现父类的函数后, 调用父类的算法流程, 父类由于本质上使用的是子类this指针, 因此会自动在流程中调用子类的实现....因此我们说多态继承的时候是继承了函数的调用权而不是函数本身的空间 虚指针指向虚函数表, 虚函数表按照目标类中函数的声明顺序对函数地址指针进行排列, 函数指针指向代码段中的函数代码位置 对象的函数调用分为静态绑定和动态绑定两种..., 静态绑定是指非虚函数和不满足多态条件的虚函数调用, 在静态绑定中的情况下, 编译后的代码实际上直接调用call跳转到真正函数的地址进行执行 动态函数绑定需要满足三个条件: 通过指针进行调用, 指针是从子类上转型到父类的

    91530
    领券