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

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

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

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

    面向对象程序设计中“超类”和“子类”概念的来历

    众所周知,在面向对象程序设计中,子类从超类中继承数据成员和成员方法,然后在此基础上再根据实际需要进行扩展并增加属于子类的数据成员和成员方法。...也就是说,子类的对象比超类的对象具有更加丰富的属性,或者具有更多的行为。或者说,子类的功能比超类的功能更加强大。那么为什么不把子类叫做超类呢? ?...实际上,超类和子类的概念来自于集合论,借鉴了超集和子集的概念。子集中的所有元素都属于其超集,而超集中并不是所有元素都属于子集。...同理,在面向对象程序设计中,所有子类对象都属于其超类的实例,而反过来则是不成立的。 ?

    1.5K40

    理解Python中的类对象、实例对象、属性、方法

    def msg(): # 静态方法,可以没有参数 pass # 类对象: 将具有相似属性和方法的对象总结抽象为类对象,可以定义相似的一些属性和方法,不同的实例对象去引用类对象的属性和方法...如果通过实例对象来引用类属性,相当于实例对象在实例方法中创建了一个和类属性相同的名字,等同于局部变量实例属性,和类属性无关; # 私有类属性: 类外通过类对象引用不能直接更改,只能通过实例方法调用类对象更改...# 类方法: 需要修饰器@classmethod,标示其为类方法,类方法的第一个参数必须为类对象,一般用cls表示,通过cls引用的必须是类属性和类方法。...# 静态方法: 需要修饰器@staticmethod,标示其为静态方法。需要做一些功能,和类相关,但不需要类和对象参与,此时可以使用静态方法,静态方法可以不需要参数。...# 实例对象: 通过类对象创建的实例对象 # 实例属性: 通过方法定义的属性 # 私有实例属性: __开头定义的变量名;只能通过方法调用来更改 公有实例属性: 可以通过实例对象重新定义

    3.9K30

    Java 类和对象,如何定义Java中的类,如何使用Java中的对象,变量

    方法n;                                           }   Java对象  使用对象的步骤:  1.创建对象:      类名 对象名 = new 类名(); ...5    引用对象的方法:对象.方法       phone.sendMessage() ; //调用对象senMessage()方法  成员变量和局部变量  1.成员变量     在类中定义,用来描述对象将要有什么...  2.局部变量      在类的方法中定义,在方法中临时保存数据  成员变量和局部变量的区别  1.作用域不同:        局部变量的作用域仅限于定义他的方法        成员变量的作用域在整个类内部都是可见的...  2.初始值不相同:          Java会给成员变量一个初始值          Java不会给局部变量赋予初始值,必要初始化  3.在同一个方法中,不允许有同名局部变量;  在不同的方法中,...可以有同名局部变量  4.两类变量同名时,局部变量具有更高得优先级(就近原则)

    6.9K00

    Java——String类使用详解(实例化、字符串比较、匿名对象、两种实例化方法的区别)

    1、String类的两种实例化方式 String类不是一个基本数据类型,它是一个类,这个类设计过程种加入了Java的特殊支持,其实例化形式有两种形式: 直接赋值: String 对象 = “内容”; 构造方法...3、String匿名对象 任何编程语言都不会提供字符串数据类型,字符串在很多语言中使用字符数组,Java中为解决这个问题,提供了String类,Java里面也提供双引号声明的数据,这些数据不是普通的变量...4、String类两种实例化的区别 由第一节中 的内容可知,对于String示例化方式有两种,到底该使用哪种,两种的区别是什么?...在使用直接赋值实例化String类对象操作中,字符串内容定义后实际上会自动保存在一个对象池之中,而后,若有其他 的字符串对象也采用直接赋值的形式,且内容与之前的完全相同,则不会开辟新的堆内存空间,而是通过对象池...(str);//false 使用构造方法进行String类对象实例化,产生的对象不会保存在对象池中,此对象无法重用。

    1.8K10

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

    关于使用MethodHandle在子类中调用祖父类重写方法的探究 注:这个例子原本出现在周志明先生的《深入理解Java虚拟机》--虚拟机字节码执行引擎章节,介于有读者朋友有疑问,这里基于Java代码层面解释一下...在普通的方法调用中,这个this参数是虚拟机自动处理的,表示的是当前实例对象,我们在方法中可以直接使用。...GrandFather的实例对象,实际传入的是bindTo或invoke指定的实例对象。...基于这个事实,我们这时可以直接在GrandFather的thinking方法中调用Son类独有的方法,使用反射或者直接类型强制转换为Son就行了。...我们也可以使用findVirtual找到该方法,不过就需要一个GrandFather的实例对象(当然也就不用使用反射了): static class Son extends Father { void

    9.5K30

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

    地方 , 都可以使用 " 公有继承 " 的 派生类 ( 子类 ) 对象 替代 , 该 派生类 ( 子类 ) 得到了 除 构造函数 和 析构函数 之外的 所有 成员变量 和 成员方法 ; 功能完整性 :..." 应用场景 : 直接使用 : 使用 子类对象 作为 父类对象 使用 ; 赋值 : 将 子类对象 赋值给 父类对象 ; 初始化 : 使用 子类对象 为 父类对象 初始化 ; 指针 : 父类指针 指向...); } 2、使用 子类对象 为 父类对象 进行初始化 定义父类对象 , 可以直接使用 子类对象 进行初始化操作 ; // II....类型兼容性原则 : 使用 子类对象 为 父类对象 进行初始化 Parent parent = child; 3、完整代码示例 #include "iostream" using namespace...类型兼容性原则 : 使用 子类对象 为 父类对象 进行初始化 Parent parent3 = child; // 控制台暂停 , 按任意键继续向后执行 system(

    30920

    JAVA设计模式2:工厂方法模式,将对象的实例化过程封装在子类

    主打方向:Vue、SpringBoot、微信小程序 本文讲解了 Java 设计模式中的工厂方法模式,并给出了样例代码,工厂方法模式是一种创建型设计模式,它提供了一种将对象的实例化过程封装在子类中的方式...---- 一、什么是工厂方法模式 工厂方法模式是一种创建型设计模式,它提供了一种将对象的实例化过程封装在子类中的方式,在工厂方法模式中父类定义了一个创建对象的接口,但具体的对象的创建由子类决定。...这样,将对象的实例化过程延迟到子类中,使得子类可以根据需要创建具体的对象。 在工厂方法模式中,通常会有一个抽象工厂类和多个具体工厂类。...当类将对象的创建委托给多个具体工厂类中的某一个,并希望将具体工厂类的选择和使用与创建对象的类分离时。...例如,一个抽象类定义了一个抽象方法,让子类来实现该方法并创建具体的对象。 当类将对象的创建委托给多个具体工厂类中的某一个,并希望将具体工厂类的选择和使用与创建对象的类分离时,可以使用工厂方法模式。

    31840

    类与对象(一)—— 类(继承)

    所以我们不难得出,子类对象其实是拥有父类对象中所有的所有成员的,只是父类对象中的私有属性和方法,子类无法访问而已,只是拥有,但不能使用。 就像有些东西你可能拥有,但是你并不能使用。...西瓜籽:“不对啊,你这里说子类无法访问父类的私有成员啊,那为啥上面那段代码的却有结果?” 大西瓜:“我在Animal类中声明了set/get方法来对私有的age变量来进行操作。”...向上转型:将一个子类的引用赋给一个超类变量,即父类的对象引用指向子类对象。可以理解为小范围指向大范围,这是被编译器所允许的。...annimal对象无flying()方法,说明向上转型时,父类只能调用父类方法或者子类覆写后的方法,而子类中的单独方法则是无法调用的。...向下转型:与向上转型相反,将一个超类的引用赋给一个子类变量,即子类的对象引用指向父类对象。这时就是大范围指向小范围了,只是不被编译器允许的。

    38950

    如何使用Python中的装饰器创建具有实例化时间变量的新函数方法

    1、问题背景在Python中,我们可以使用装饰器来修改函数或方法的行为,但当装饰器需要使用一个在实例化时创建的对象时,事情就会变得复杂。...例如,我们想要创建一个装饰器,可以创建一个新的函数/方法来使用对象obj。如果被装饰的对象是一个函数,那么obj必须在函数创建时被实例化。...如果被装饰的对象是一个方法,那么必须为类的每个实例实例化一个新的obj,并将其绑定到该实例。2、解决方案我们可以使用以下方法来解决这个问题:使用inspect模块来获取被装饰对象的签名。...如果被装饰的对象是一个方法,则将obj绑定到self。如果被装饰的对象是一个函数,则实例化obj。返回一个新函数/方法,该函数/方法使用obj。...当这些函数/方法被调用时,dec装饰器会将obj绑定到self(如果是方法)或实例化obj(如果是函数)。然后,dec装饰器会返回一个新函数/方法,该函数/方法使用obj。

    9210

    全面理解Java中继承关系

    在构造器中使用super,则super会用于限定于该构造器初始化的是该对象从父类继承得到的实例变量,而不是该类自己定义的实例变量。意思就是调用父类的构造器。...当创建一个子类对象时,不仅会为该类的实例变量分配内存,也会为它从父类继承得到的所有实例变量分配内存,即使子类定义了与父类中同名的实例变量。 即依然会为父类中定义的、被隐藏的变量分配内存。...如果子类中的实例变量被私有了 ,其父类中的同名实例变量没有被私有,那么子类对象就无法直接调用该变量,但可以通过先将对象变量强制向上转型为父类型,在通过该对象引用变量来访问那个实例变量,就会得到的是父类中的那个实例变量...父类中那些仅为辅助其他的工具方法,应该使用private修饰,让子类无法访问方法;如果父类中的方法需要被外部类调用,则必须以public修饰,但又不想让子类重写,就可以使用final修饰符。...,就会调用被子类重写后的②号test()方法,子类的test方法调用了子类的实例变量name,父类直接调用的子类的test方法,此时子类还未初始化,还未调用子类构造器,实例变量name还未被指定初始值,

    1.5K00

    从TypeScript入手,驾驭HarmonyOS开发的技术风潮!-----------(中篇)

    })() 继承 继承: 类与类之间的关系 继承后类与类之间的叫法: A类继承了B这个类,那么此时A类叫子类,B类叫基类 子类 —> 派生类 基类 --> 超类(父类) 一旦发生了继承的关系,就出现了父子类的关系...// 继承后类与类之间的叫法: // A类继承了B这个类,那么此时A类叫子类,B类叫基类 // 子类 ---> 派生类 // 基类 --> 超类(父类) // 一旦发生了继承的关系,就出现了父子类的关系..., 任何位置都可以访问类中的成员 private 修饰符, 类中的成员如果使用private 来修饰, 外部是无法访问这个成员数据的, 子类中也是无法访问该成员数据的....修饰符, 类中的成员如果使用private 来修饰, 外部是无法访问这个成员数据的, 子类中也是无法访问该成员数据的. // protected 修饰符, 类中的成员如果使用protected来修饰,...('赵丽颖') })() private 修饰符 外部无法访问类中的私有属性 子类中也无法访问类中的私有属性 protected 修饰符 外部无法访问类中的私有属性

    17410

    Java访问权限之 protected详解「建议收藏」

    (作为子类,Test类中建立超类实例,直接去访问超类的protected方法是不可以的),因此编译不通过。     ...其次,若子类与基类不在同一包中时,子类中不能访问基类实例(对象)(所调用)的protected方法。 MyObject子类访问权限只满足本类示例的访问。...由于子类与基类(父类)不在同一包中,所以在子类中,只有本类实例可以访问其从基类继承而来的protected方法。而在子类中不能访问基类实例(对象)(所调用)的protected方法。...而在子类中也无法访问其他子类实例(即便相同父类的亲兄弟)所继承的protected修饰的方法。...,因此,当创建子类对象调用父类的protected成员变量时,必须要注意:子类对象和子类是对应的!

    1.4K40

    【Java 虚拟机原理】Java 类中的类加载初始化细节 ( 只使用类中的常量时加载类不会执行到 ‘初始化‘ 阶段 )

    ; 通过 new 关键字创建实例对象 ; 通过 Class 反射 获取类 ; 如 : Class.forName(“Xxx”) 获取类 ; 序列化 / 反序列化 ; 调用 clone 克隆对象 ; 有...main 函数的类 , 会默认自动加载 ; 调用子类 , 如果之前没有加载过父类 , 则 自动加载父类 ; 访问 类 的 静态变量 有些类加载操作 , 不需要执行 加载 -> 连接 ( 验证 , 准备...加载 -> 连接 ( 验证 , 准备 , 解析 ) 阶段 , 就可以完成常量池的初始化 , 即使没有执行 初始化 这个步骤 , 也不影响使用类中的常量值 ; 在 连接 的 准备 阶段 , 为 普通 的...18 三、数组加载示例 ---- 对数组进行创建操作 , 如创建了一个对象数组 , 此时不会加载该对象对应的类 , 只会为其在内存分配空间 ; 创建数组时 , 触发的是 Student...[] 数组类型的 类加载初始化 , 但是不会触发 Student 类的初始化操作 ; 如果调用数组中的元素时 , 就需要初始化 Student 类 ; Student 类 : public class

    3.6K20

    typeScript的基础认识

    extends关键字),类和接口之间叫实现(使用的是implements) })() 类 // 类:可以理解为模板,通过模板可以实例化对象 // 面向对象的编程思想 (() => { // ts中类的定义及使用...stu.sayHi() // 总结:类和类之间如果要有继承关系,需要使用extends关键字 // 子类中可以调整父类中的构造函数,使用的是super关键字(包括调用父类中的实例方法,也可以使用...constructor(name: string) { // 调用父类的构造函数,实现子类中属性的初始化操作 super(name) } // 实例方法,重写父类中的实列方法...,代表的是公共的,任何位置都可以访问类中的成员 // private修饰符 ----私有的,类中的成员如果使用private来修饰,那么外部是无法访问这个成员数据的,当然,子类中也是可以访问该成员数据的...// protected修饰符 ----受保护的,类中的成员如果使用protected来修饰,那么外部是无法访问这个成员数据的,当然,子类中是可以访问该成员数据的 (() => { // 定义一个类

    11810

    面向对象编程(一)

    比如根据Animal类创建的对象有cat,dog等。 2.1、定义类 要定义一个类,使用关键字class,后跟类的名称。类中通常包含属性(变量)和方法(函数)。...此后通过该类创建的对象,都必须强制传入这两个属性。类中定义的__init__方法是该类的构造方法,也就是构造该实例的时候需要传入name和foot两个属性共同创建该对象。...,类中定义的方法第一个参数永远是self,表示当前自身的实例。...:用于在创建对象时进行初始化操作,是构造方法。 __del__。用于在对象被销毁(垃圾回收)前进行清理操作。 __str__。用于定义对象的字符串表示,通过str(obj)调用。 __repr__。...Dog重写了父类Animal中的call方法。我们根据Dog类创建出来的实例,调用的call方法,优先调用子类方法。

    13810
    领券