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

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

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

6.2K10

【C++】多态 ⑥ ( 函数重定义涉及的问题 - 子类覆盖父类函数名 )

fun(int a, int b) void fun(int a) 注意 : 是重定义 , 不是重写 ; 重写 需要 为 父类 函数添加 virtual 关键字修饰 , 会有多态效果 ; 重定义 时...C2661: “Child::fun”: 没有重载函数接受 3 个参数 ; 该错误是编译阶段报的错误 , 编译根本通不过 ; 3、错误原因分析 - 函数重定义问题 : 子类覆盖父类函数名 错误原因分析...: 函数重定义 带来的问题 , 子类覆盖父类函数名 ; 函数重定义的函数名称覆盖问题 : C++ 编译器 发现 Child c 对象要调用 void fun(int a, int b, int c) 函数..., 子类中已经存在 fun 函数了 , 子类 会 覆盖 父类的函数名 , C++ 编译器只会在 子类查找 该函数 , 不会去父类 查找 ; 子类查找函数 : C++ 编译器 在 子类中找到了 void...: 没有重载函数接受 3 个参数 ; 4、正确调用函数的方法 在这种情况下 , 由于子类 重定义了部分 父类的重载函数 , 导致 父类的 函数名被覆盖 , 此时需要使用 域操作符 访问父类 被覆盖的函数

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

    String类为什么被设计为不可变的?

    value的,同时子类也访问不到,当然String类不可能有子类,因为类被final修饰了 final修饰,表明value的引用是不会被改变的,而value只会在String的构造函数中被初始化,而且并没有其他方法可以修改...this : new String(value, beginIndex, subLen); } 为什么String被设置为不可变的? 字符串常量池 字符串常量池可以节省大量的内存空间。...实际上是将引用放到哈希表中),随后将引用赋给str1 如果存在,则不创建任何对象,直接将池中"abc"对象的引用返回,赋给str2。...因为str1、str2指向同一个对象,所以结果为true。...这样,str4就指向了堆中创建的这个"abc"字符串对象; 因为str3和str4指向的是不同的字符串对象,结果为false。

    53410

    为自定义属性包装类型添加类 @Published 的能力

    ,但适用于 NSUbiquitousKeyValueStore ),来展示如何为其他的自定义属性包装类型添加可访问包裹其的类实例的属性或方法的能力。...本文中为其他属性包装类型添加的类似 @Published 的能力是指 —— 无需显式设置,属性包装类型便可访问包裹其的类实例的属性或方法。...上面的代码也解释了为什么在使用了属性包装器后,无法再声明相同名称(前面加下划线)的变量。 // 在使用了属性包装器后,无法再声明相同名称(前面加下划线)的变量。...的包装,即可轻松地创建自定义 Publisher 调用包裹类实例的 objectWillChange 和给 projectedValue 的订阅者发送信息均应在更改 wrappedValue 之前 @...代码要点: 由于设置的 projectValue 和 _setValue 的工作是在 CloudStorage 构造器中进行的,此时只能捕获为 nil 的闭包 sender ,通过创建一个类实例 holder

    3.3K20

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

    " 应用场景 : 直接使用 : 使用 子类对象 作为 父类对象 使用 ; 赋值 : 将 子类对象 赋值给 父类对象 ; 初始化 : 使用 子类对象 为 父类对象 初始化 ; 指针 : 父类指针 指向...子类对象 , 父类指针 值为 子类对象 在 堆内存 的地址 , 也就是 将 子类对象 地址 赋值给 父类类型指针 ; 引用 : 父类引用 引用 子类对象 , 将 子类对象 赋值给 父类类型的引用 ; 二...指向 子类对象 定义 一个子类对象 Child child ; 定义父类的指针 , 将 指针 指向 子类对象 的地址 , 这是合法的 ; 代码示例 : // 父类对象 Parent parent...); } 2、使用 子类对象 为 父类对象 进行初始化 定义父类对象 , 可以直接使用 子类对象 进行初始化操作 ; // II....// 子类对象 可以调用 父类公有函数 child.funParent(); // 将指向子类对象的指针传给接收父类指针的函数 // 也是可以的 fun_pointer

    30920

    错误的将int定义为Integer造成程序无限执行下去,被骂惨

    作者:头条/老徐聊技术 来源:http://suo.im/6eEXNK 前言:春节期间,坐在公司加班,本以为可以坐在那看看日志,打打游戏,聊会天一天就过去了,突然加群里我,为什么我的任务执行了快一上午了...当时真是脑袋翁的一下,这是啥问题,报个错也行呀。在本地项目中跑跑试试看,还是没发现问题,依旧不打印执行完毕的日志。...那我就看看是不是判断出问题了,在判断的地方打印出前后比较的值,发现从128开始,128!=128,返回为false。 这是什么情况? ? 128!...我把int定义成了Integer。瞬间明白了为什么? 大家都知道Integer是有缓存的,当数值在-128~127之间,是从缓存中取数据。 ? Integer缓存源码 这里给大家做个测试 ?...定义Integer ? 定义int 总结:还好当时知道Integer的源码,看见128之后,想到了Integer的缓存,不然真的得找一会原因了。

    48210

    静态内部类和内部类的区别_内部类不能定义为抽象类

    ,直接可以 new Person(); 当然如果在外部类中访问这个静态内部类,则必须 new MyMain.Person(); 这个时候我试验了一下 如果定义person类为 private static...Person() new TestInner().new Person().display(); } } 运行结果 kobe bryant GreenLand Los angeles 同样如果给person类定义为...正常情况下,你不能在接口内部放置任何代码,但嵌套类可以作为接口的一部分,因为它是static 的。...只是将嵌套类置于接口的命名空间内,这并不违反接口的规则,我试验了一下 ,无论是静态类还是非静态类都可以写在接口里。...如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    34820

    轻松的将python程序打包为独立的EXE文件,并配上自定义的图标

    python是解释型语言,学习阶段都是用解释器加载运行的。不过在教小朋友的时候,如果先教会他们如何将python打包成为exe文件,令程序能随意运行,更容易提高学习兴趣。...首先,下载安装pyinstaller 在命令行输入 pip install pyinstaller即可 安装完毕后可先大致了解下pyinstaller的基本参数 其中最常用的是-F 将程序打包为独立...exe文件 生成的exe文件在dist子目录中 这样生成的文件是默认的图标 为了美观,可以用参数-i 为程序配置一个图标,只是图标文件应该包含常见的多分辨率格式,以便适应在不同场合显示,不能是单一图片...你可以用专用的软件处理生成图标,不过少量的图标生产,其实最方便的还是直接找网上的在线工具解决。...生成好图标文件之后,在打包命令中多使用一个-i参数并给出图标文件名,生成的exe文件就可以使用上自定义的图标了。 注意事项:1、打包路径避免使用中文路径和中文文件名。

    3.2K100

    第17次文章:初探JVM

    类加载全过程 一、为什么研究类加载全过程? (1)有助于了解JVM运行过程 (2)更深入了解java动态性(解热部署,动态加载),提高程序的灵活性。...-当初始化一个类的时候,如果发现其父类还没有进行初始化,则需要先初始化其父类 -虚拟机会保证一个类的()方法在多线程环境中正确加锁和同步。...-使用java.lang.reflect包的方法对类进行反射调用 -当初始化一个类,如果其父类没有被初始化,则会先初始化其父类 (2)类的被动引用(不会发生类的初始化) -当访问一个静态域时,只有真正声明这个域的类才会被初始化...通过子类引用父类的静态变量,不会导致子类初始化 -通过数组定义类引用,不会触发此类的初始化 -引用常量不会触发此类的初始化(常量在编译阶段就存入调用类的常量池中了) 2、为了测试类的初始化时机,我们首先创建一个父类...由于A为父类A_Father的子类,并且父类没有被初始化,所以类加载器首先初始化的是父类A_Father(主动引用),而不是直接初始化子类A。

    28930

    【C++】多态 ⑩ ( 不建议将所有函数都声明为 virtual 虚函数 | 多态的理解层次 | 父类指针和子类指针步长 )

    是 根据 指针类型 进行的 , 指针 自增 ++ , 指针的地址值 会增加 指针类型字节大小 ; 指针的 步长 是 根据 指针 指向的 内存空间 的数据类型确定的 ; 子类 继承 父类 , 如果 子类...没有添加任何 成员函数 与 成员方法 , 那么子类指针 与 父类指针 的步长是相同的 ; 一、不建议将所有函数都声明为 virtual 虚函数 C++ 类中 , 每个 成员函数 都可以声明为 virtual...调用 虚函数 可执行 子类对应的函数 ; 多态实现条件 : ① 继承 , ② 虚函数重写 , ③ 父类指针/引用指向子类对象 ; 父类指针 可以 指向 父类对象 , 也可以指向 不同的 子类对象 ;...自定义的 Student 类型 , 则 p++ 的计算结果是 p 指针的地址值 加上 sizeof(*p) 对象的字节长度 ; 显然 父类 与 子类 对象 的 字节大小是不同的 , 在进行数组操作 ,...是 根据 指针 指向的 内存空间 的数据类型确定的 ; 子类 继承 父类 , 如果 子类 没有添加任何 成员函数 与 成员方法 , 那么子类指针 与 父类指针 的步长是相同的 ; 代码示例 : #include

    30350

    JAVA重写和重载的区别「建议收藏」

    问:下面程序的运行结果是什么,为什么? 问: Java 重载与重写是什么?有什么区别?...Android类中的一个重载例子 重写(Override)是父类与子类之间的多态性,实质是对父类的函数进行重新定义,如果在子类中定义某方法与其父类有相同的名称和参数则该方法被重写,不过子类函数的访问修饰权限不能小于父类的...;若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法,如需父类中原有的方法则可使用 super 关键字。...答:   重写是子类方法重写父类的方法,重写的方法名不变,而类的构造方法名必须与类名一致,假设父类的构造方法如果能够被子类重写则子类类名必须与父类类名一致才行,所以 Java 的构造方法是不能被重写的...而重载是针对同一个的,所以构造方法可以被重载。 问:下面程序的运行结果是什么,为什么?

    48630

    java类加载和初始化_java静态变量什么时候初始化

    大家好,又见面了,我是你们的朋友全栈君。...2、链接 将Java类的二进制代码合并到JVM的运行状态之中的过程。...验证:确保加载的类信息符合JVM规范,没有安全方面的问题; 准备:正式为类变量分配内存并设置类变量默认初始值的阶段,这些内存都将在方法区内进行分配; 解析:虚拟机常量池内的符号引用(常量名)替换为直接引用...当初始化一个类的时候,如果发现其父类还没有进行初始化,则需要先触发其父类的初始化。 虚拟机会保证一个类的()方法在多线程环境中被正确加锁和同步。...如:当通过子类引用父类的静态变量,不会导致子类初始化; 通过数组定义类引用,不会触发此类的初始化; 引用常量不会触发此类的初始化(常量在链接阶段就存入调用类的常量池中了); 三、类加载器的作用 将class

    50320

    Java虚拟机类加载机制浅谈

    注意:通过子类引用父类静态字段,只会初始化父类不会初始化子类;通过数组定义来引用类,也不会触发该类的初始化;常量在编译阶段会存入调用类的常量池中,本质上没有直接引用到定义常量的类,因此也不会触发定义常量的类的初始化...一 类加载过程 1 加载        加载阶段主要完成三件事,即通过一个类的全限定名来获取定义此类的二进制字节流,将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构,在Java堆中生成一个代表此类的...符号引用验证:基于方法区的存储结构验证,发生在解析中,是否可以将符号引用成功解析为直接引用。...即父类定义的静态语句块和静态字段都要优先子类的变量赋值操作。...3)Bootstrap Loader(启动类加载器)是最顶级的类加载器了,其父加载器为null. 3   类加载器的双亲委派模型        类加载器双亲委派模型的工作过程是:如果一个类加载器收到一个类加载的请求

    77460

    一文读懂Java泛型中的通配符 ?

    下面是我的译文: Java泛型中的通配符机制的目的是:让一个持有特定类型(比如A类型)的集合能够强制转换为持有A的子类或父类型的集合,这篇文章将解释这个是如何做的。...或者将 listA 赋值给 listB ?换言之,下面的赋值语句是否合法? listA = listB; listB = listA; 答案是两个都不合法。 为什么呢?...super A> 的意思是List集合 list,它可以持有 A 及其父类的实例。...当你知道集合里所持有的元素类型都是A及其父类的时候,此时往list集合里面插入A及其子类(B或C)是安全的,下面是一个例子: public static void insertElements(List...ArrayList(); insertElements(listObject); 涛声依旧注:因为此时我们可以确定传入的list集合里的元素是A及其父类,所以我们往这个集合里插入A及其子类是兼容的

    93830

    面向对象设计原则-里氏替换原则

    LSP不仅能够使类的继承关系更加清晰,而且能够提高代码的可重用性和可维护性。下面将详细介绍LSP以及如何在Java中应用该原则。...LSP的定义LSP原则的正式定义是:“如果S是T的一个子类型,那么S对象可以替换T对象,而程序执行的结果不会发生变化。” 换句话说,一个子类必须能够完全替代其父类,且不会对程序的正确性造成任何影响。...LSP的重要性LSP的重要性体现在以下几个方面:(1)提高代码的可重用性由于子类必须能够替代其父类,因此我们可以在程序中重用父类的代码,而不需要在子类中重复编写相同的代码。...这样可以大大提高代码的可重用性。(2)减少出错的可能性如果子类不能够完全替代其父类,那么在程序执行过程中就可能会出现错误,这些错误可能会导致程序崩溃或者产生不可预料的结果。...否则,这个子类就不能够完全替代其父类。

    27510

    HotSpot JVM中KlassoopDescoop的作用与关系

    Klass的子类中,InstanceKlass代表一个普通的Java类(比如我们自定义的一个Java类),ArrayKlass代表数组类型的Java类(该Java类是JVM内部自动创建的,由数组维数和数组基础类型唯一确定...---- 当JVM加载或定义一个Java类时,它会在内部创建一个对应的Klass对象,用来存放该Java类的各种信息。...那既然已经有Klass对象了,为什么还要创建个java.lang.Class类型的Java对象呢?...该对象会包含java.lang.Class类及其父类里所有非静态字段。 还包括其他字段吗? 还包括发起创建该对象对应的Java类中静态字段。...而这个java.lang.Class对象包含的字段为java.lang.Class类及其父类里所有非静态字段,加上发起创建该java.lang.Class对象对应的Java类中静态字段。

    68320

    什么是重载什么是覆盖_java覆盖和重载的关系

    大家好,又见面了,我是你们的朋友全栈君。 java中的方法重载发生在同一个类里面两个或者多个方法的方法名相同但是参数不同的情况。与此相对,方法覆盖是说子类重新定义了父类的方法。...(2)java的方法重载,就是在类中可以创建多个方法,他们具有相同的名字,但具有不同参数和不同的定义。调用方法时通过传递给他们不同的参数个数和参数类型来决定具体使用那个方法,这就是多态性。...重写(Overriding) (1)父类与子类的多态性,对父类的函数进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写。...在java中,子类可继承父类的方法,则不需要重新编写相同的方法。但有时子类并不想原封不动继承父类的方法,而是想做一定的修改,这就采用方法重写。方法重写又称方法覆盖。...(2)若子类中的方法与父类的中的某一方法具有相同的方法名、返回类型和参数表,则新方法覆盖原有的方法。如需要父类的原有方法,可以使用super关键字,该关键字引用房钱类的父类。

    78930

    Java每日一练(2017619)

    () A notify() B notifyAll() C sleep D wait() ★请转发给身边需要的朋友!...,这些同名的方法为重载; 而覆盖是指一个子类对其父类中的某个可见方法进行了重新的定义,即重新定义的方法满足名称相同,参数相同以及对应的参数相同的条件。...这样,调用时将会调用子类中的方法,而不会调用父类中被覆盖的方法。 ---- (单选题) 2、this代表了()的对象引用,super表示的是当前对象的()对象?...A 当前类当前类 B 当前类的父类当前类 C 当前类当前类的父类 D 以上都不正确 正确答案是:C 解析:this代表当前对象,也就是当前类的对象的引用 super代表其父类对象 ---- (单选题)...顺序为:父类的静态变量, 父类的静态代码块 ,子类的静态变量,子类的静态代码块。 ---- (单选题) 5、下列 java 程序输出结果为______。

    71150
    领券