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

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

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就行了。...这就要回到findSpecial方法中的第四个class类型的参数,即本例中使用的Father.class。

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

    iOS-UITextField 全面解析iOS中UITextField 使用全面解析UITextField的代理方法通知UITextField 在storyboard 中设置属性

    iOS中UITextField 使用全面解析 建议收藏,用到的时候来这里一查就都明白了 //初始化textfield并设置位置及大小 UITextField *text = [[UITextField...– textRectForBounds:    //重写来重置文字区域 – drawTextInRect:    //改变绘文字属性.重写时调用super可以按默认图形属性绘制,若自己完全重写绘制函数...show]; return NO; } } return YES; } 通知 UITextField派生自UIControl,所以UIControl类中的通知系统在文本字段中也可以使用...中设置属性 ?...2、Placeholder : 可以在文本框中显示灰色的字,用于提示用户应该在这个文本框输入什么内容。当这个文本框中输入了数据时,用于提示的灰色的字将会自动消失。

    7.3K60

    Swift学习:构造器(中)

    在使用之前,我们需要了解一些基本的问题: 类中所有存储属性,包括继承父类的属性,都要在构造过程中设置初值 Swift类的构造器分为指定构造器和便利构造器,确保完成构造过程 一、指定构造器和便利构造器 指定构造器...: 类的主要构造器,负责初始化类中所有属性,在继承关系中可调用父类链中的父类构造器 每个类至少一个指定构造器。...指定构造器和便利构造器的基本使用原则: 规则1:当前类存在父类时,指定构造器器必须调用其直接父类的指定构造器,为保证继承的属性得以初始化。 规则2:便利构造器必须调用同一类中定义的其他构造器。...重写父类指定构造器必须带上override,即使你的子类将父类的指定构造器重写成了便利构造器 注意3: 子类编写和父类便利构造器相匹配的子类构造器时,由于子类不能直接调用父类的便利构造器,并不能看做是对父类构造器的重写...所以子类中“重写”父类便利构造器时,不需要加override修饰符。 四、构造器的自动继承 子类在默认情况下不会继承父类的构造器。但是如果满足特定条件,父类构造器还是是可以被自动继承的。

    93480

    【Kotlin】Kotlin 类的继承 二 ( 属性覆盖 | 属性覆盖的四种情况 | 常量 变量 属性覆盖 | 子类初始化与属性覆盖 )

    属性覆盖 : 属性覆盖与方法覆盖的方式基本相同 ; ① 属性覆盖前提 : 在父类中使用 open 修饰的属性 , 可以在子类中被覆盖 ; ② 属性覆盖方式 : 在子类中使用 override 修饰被覆盖的属性...覆盖属性设置 getter / setter 方法 : 子类中使用 override 覆盖的属性设置对应的 getter 和 setter 方法 ; open class Father { open...覆盖属性声明在子类主构造函数中 : 可以将子类中覆盖的父类属性声明在主构造函数中 , 如下示例 : open class Father { open var age : Int = 60 }...常量覆盖 : 父类中 val 修饰的常量属性可以在子类中使用 val 或 var 覆盖 ; open class Father { open val name : String = "Tom"...最佳实践 : 在父类中 , 尽量不在 构造函数 , init 初始化代码块 , 属性初始化 时使用被 open 关键字修饰的可覆盖属性成员 , 因为该值不稳定 , 会增加不确定因素 ;

    1.2K20

    Swift2.1-继承继承

    在Swift中类可以调用和访问方法,属性和属于它们父类的下标脚本,并且提供它们自己重写的方法,属性和下标脚本来定义或修改它们的行为。...访问父类方法,属性和下标脚本 当你为子类提供了一个方法,属性或者下标脚本,有时那是有用的,来使用现有的父类实现作为你重写的一部分。...一个命名为someIndex的重写下标脚本当使用super[someIndex]在重写的下标脚本实现中,可以访问父类中相同的脚本。...一个继承属性的存储或计算性质不被看做一个子类--它仅被看做继承属性有某个名字或类型。你必须声明你重写的属性名字和类型,来确保编译器可以检查你的重写匹配了父类中有相同名字和类型的属性。...任何想要在子类里重写final方法,属性或下标脚本都会报一个编译时错误。在扩展中添加到一个类中的方法,属性或下标脚本也可以子扩展的定义里被标记为final。

    45810

    全面理解Java中继承关系

    在一个构造器中调用另一个重载构造器使用this调用完成,在子类构造器中调用父类构造器使用super调用来完成。...,子类中的构造方法的类型在父类中有) class Student extends Person{  //因为当父类中没有无参构造器时,子类中的构造方法的类型在父类中有  public Student(int...继承的执行顺序问题  继承体系中的构造器执行顺序    当调用子类构造器实例化子类对象时,父类构造器总是在子类构造器之前执行。...即静态只能覆盖静态子类重写父类方法时,最好声明得一模一样如果子类中定义了一个与父类private方法具有相同的方法名、相同的形参列表、相同的返回值类型的方法,依然不是重写,只是在子类中重新定义了一个新的方法...如果希望父类的某个方法被子类重写,但不希望被其他类自由访问,则可以使用protected来修饰方法。尽量不要在父类构造器中调用将要被子类重写的方法。

    1.5K00

    Java入门必背100条

    局部变量:声明在方法内、方法形参、代码块内、构造器形参、构造器内部的变量 ② 关于权限修饰符的不同 属性:可以在声明属性时,指明其权限,使用权限修饰符。...58、super调用属性、方法: ①在子类的方法或构造器中,通过使用”super.属性”或”super.方法”的方式,显式的调用父类中声明的属性或方法,通常情况下,习惯省略”super.”。...②特殊情况:当子类和父类中定义了同名的属性时,要想在子类中调用父类中声明的属性,则必须显式的使用”super.属性”的方式,表明调用的是父类中声明的属性。...③特殊情况:当子类重写了父类中的方法以后,想在子类的方法中调用父类中被重写的方法时,则必须显式的使用”super.方法”的方式,表明调用的是父类中被重写的方法。...59、super调用构造器: 1 我们可以在子类的构造器中显式的使用”super(形参列表)”的方式,调用父类中声明的指定的构造器。

    1.2K20

    【JavaSE学习】 Day5JavaSE面向对象(中)看这三篇就够了

    三、super关键字 super 关键字可以理解为:父类的 可以用来调用的结构:属性、方法、构造器 super调用属性、方法  我们可以在子类的方法或构造器中。...特殊情况:当子类和父类中定义了同名的属性时,我们要想在子类中调用父类中声明的属性,则必须显式的使用"super.属性"的方式,表明调用的是父类中声明的属性。...super调用构造器 我们可以在子类的构造器中显式的使用"super(形参列表)"的方式,调用父类中声明的指定的构造器 "super(形参列表)"的使用,必须声明在子类构造器的首行!  ...:super() 在类的多个构造器中,至少一个类的构造器中使用了"super(形参列表)",调用父类中的构造器 四、子类对象实例化全过程 理解即可。...创建子类的对象,在堆空间中,就会加载所父类中声明的属性 从过程上看 当我们通过子类的构造器创建子类对象时,我们一定会直接或间接的调用其父类的构造器,进而调用父类的父类的构造器,...直到调用了java.lang.Object

    65620

    Java语法手册 三(面向对象)

    在Java中创建一个类 要使用: class,一个类名,一对大括号{}; 类的属性: 在类主体中定义变量来描述类的静态特征(属性) 这些变量称为类成员变量; 在方法中的变量称为局部变量 编写类的方法...//方法名主要在调用这个放法时使用,在java中 一般采用骆驼式命名法 //方法执行后可能会返回一个结果该结果的,类型称为返回值类型,使用return 返回值; //如果方法不返回结果返回值类型默认...访问; // 使用this this会先在本类中找 属性/方法如果有掉自己的,没有才会去找父类的属性/方法; 子类中声明 构造函数 需要使用 super(); 调用相应的父类的构造函数 :...(子类重写父类的方法访问权限必须 >= 父类方法) 子类重写父类方法,抛出的异常类型,不能大于父类的异常类型; 注意: 子类 和 父类 方法重写: 方法名相同 参数列表相同......// 子类继承父类重写方法// final表示方法不能重写即: 可以继承,但定义了 private 方法就不能被继承了因此更不会被重写所以存在冲突……可以不用设置 private; final 修饰变量

    8510

    第七章 面向对象编程(进阶)

    super 可用于在子类构造器中调用父类的构造器 注意: 尤其当子父类出现同名成员时,可以用 super 表明调用的是父类中的成员 super 的追溯不仅限于直接父类 super 和 this 的用法相像...举例 2:子类继承父类以后,发现子类和父类中定义了同名的属性,是否可以在子类中区分两个同名的属性? 可以! ‍ 4.2 如何调用? ‍ 使用 super 关键字即可。 ‍...我们在通过子类的构造器创建对象时,一定在调用子类构造器的过程中,直接或间接的调用到父类的构造器。 也正因为调用过父类的构造器,我们才会将父类中声明的属性或方法加载到内存中,供子类对象使用。 ‍...4.4 super 调用属性、方法 ‍ 子类继承父类以后,我们就可以在子类的方法或构造器中,调用父类中声明的属性或方法。(满足封装性的前提下) 如何调用呢?需要使用"super."...的结构,表示调用父类的属性或方法。 一般情况下,我们可以考虑省略"super."的结构。但是,如果出现子类重写了父类的方法或子父类中出现了同名的属性时, 则必须使用"super."

    15110

    基础篇-ObjectC继承、类别、属性

    对于界面相似度很高的情况下,使用继承可以节省很多代码和设置,只需要在子类中重写父类中的方法,或者增加新的子类方法即可,代码非常的简洁维护起来也很方便。下面小节下相关的知识,供需要的朋友查看。   ...这里说的方法需要在 父类中的 .h中声明,子类才可以使用super 调用父类的方法,可以继承过来父类的一切属性,可以使用父类的成员变量。...在继承中需要注意的是:重写的这个方法在父类中执行时会替换掉原来的方法的(就算子类中没有调用这个新重写的方法,这个新方法也已经被执行了),一般自己不调用这个重写的方法,子类一般只调用新加的方法。  ...在OC语言中,基本上所有类的根类都是NSObject类。 提示:重写即子类重新实现了父类中的某个方法,覆盖了父类以前的实现。 提示:每个类中都有一个super class指针,该指针指向自己的父类。...(通过类别和runtime 的对相关联技术生成新的属性时,无法使用这个这个设置,只能使用@dynamic) 编译器期间,让编译器自动生成getter/setter方法。

    1.9K10

    来了来了它来了,100条必背JAVA知识点(下)

    53、super调用属性、方法: ①在子类的方法或构造器中,通过使用"super.属性"或"super.方法"的方式,显式的调用父类中声明的属性或方法,通常情况下,习惯省略"super."。...②特殊情况:当子类和父类中定义了同名的属性时,要想在子类中调用父类中声明的属性,则必须显式的使用"super.属性"的方式,表明调用的是父类中声明的属性。...③特殊情况:当子类重写了父类中的方法以后,想在子类的方法中调用父类中被重写的方法时,则必须显式的使用"super.方法"的方式,表明调用的是父类中被重写的方法。...54、super调用构造器: ①我们可以在子类的构造器中显式的使用"super(形参列表)"的方式,调用父类中声明的指定的构造器。 ②"super(形参列表)"的使用,必须声明在子类构造器的首行!...⑤在类的多个构造器中,至少一个类的构造器中使用了"super(形参列表)",调用父类中的构造器。

    69110

    Swift学习:构造器(下)

    //2.可失败构造器其实是在构造失败时创建一个类型为自身类型的可选类型的对象。 } 二、枚举类型可失败的构造器 通过枚举类型可失败构造器获取枚举类型中特定的枚举成员,完成构造任务。...这里包括两种情况: 用子类的可失败构造器重写父类的可失败构造器(这种情况针对于可能子类增加了更多的可失败处理) 用子类的非可失败构造器重写一个父类的可失败构造器。...:Teacher: //我们也可以在子类的非可失败构造器中使用强制解包来调用父类的可失败构造器,具体使用如下: class Teacher:Person{ override init() {...//2.但是这里虽然重写父类中必要的指定构造器时,却不需要添加override修饰符: required init() { //构造器的实现代码 } } 七、通过闭包或函数设置属性的默认值...在构造过程中,我们可以使用闭包或全局函数为某个存储型属性提供定制的默认值。

    80970

    JavaSE(二)之继承、封装、多态

    2.)提供一个公开的方法设置或者访问私有的属性              设置 通过set方法,命名格式:     set属性名();  属性的首字母要大写              访问 通过get方法...5)父类中的属性和方法可以被子类继承         子类中继承了父类中的属性和方法后,在子类中能不能直接使用这些属性和方法,是和这些属性和方法原有的修饰符(public protected default...例如:             父类中的属性和方法使用public修饰,在子类中继承后"可以直接"使用             父类中的属性和方法使用private修饰,在子类中继承后"不可以直接"使用...        注:具体细则在修饰符部分详细说明 父类中的构造器是不能被子类继承的,但是子类的构造器中,会隐式的调用父类中的无参构造器(默认使用super关键字)。         ...四、super关键字 子类继承父类之后,在子类中可以使用this来表示访问或调用子类中的属性或方法,使用super就表示访问或调用父类中的属性和方法。

    75761

    Java项目实训_20201227

    封装的原则是使对象以外的部分不能随意的访问和操作对象的内部属性,从而避免了外界对对象内部属性的破坏。可以通过对类的成员设置一定的访问权限,实现类中成员的信息隐藏。...子类不能继承父类中访问权限为private的成员变量和方法。 子类可以重写父类的方法,即命名与父类同名的成员变量。   ...这使得同一个属性或方法在父类及其各个子类中具有不同的语义。例如:"几何图形"的"绘图"方法,"椭圆"和"多边形"都是"几何图"的子类,其"绘图"方法功能不同。   ...编译时多态:在编译阶段,具体调用哪个被重载的方法,编译器会根据参数的不同来静态确定调用相应的方法。 运行时多态:由于子类继承了父类所有的属性(私有的除外),所以子类对象可以作为父类对象使用。...程序中凡是使用父类对象的地方,都可以用子类对象来代替。一个对象可以通过引用子类的实例来调用子类的方法。

    87310

    19.Swift学习之构造函数与析构函数

    默认构造函数 在创建类和结构体的实例时必须为所有的存储属性设置一个合适的初始值,如果不是在定义时初始化值,可以在构造函数中赋值 构造函数就像一个没有形式参数的实例方法,使用 init 关键字来写 init...类类型的构造函数委托 构造函数的继承与重写 在Swift中,子类的构造函数有两种来源,首先是自己拥有的构造函数,其次是从父类中继承过来的构造函数。但是,比不是所有父类构造函数都能够被子类继承。...子类继承父类的构造函数是有条件的,遵守以下2个规则: 规则1——如果子类没有定义任何指定初始化器,它会自动继承父类所有的指定初始化器 规则2——如果子类提供了所有父类指定初始化器的实现——要么是通过规则...如果一个子类中任意的构造器和父类的便利构造器一模一样, 不算重写 一个例子 class Person { var name: String!...required 修饰符来表明所有该类的子类都必须实现该构造函数 当子类重写父类的必要构造函数时,必须在子类的构造函数前添加 required 修饰符以确保当其它类继承该子类时,该构造函数同为必要构造函数

    1K30

    关于继承、重写与重载、封装、接口的硬核干货

    在子类的构造方法中,通过Super()调用了父类的构造方法。这充分地说明子类是可以适用父类的属性和方法。...在Java中,子类可以轻松的访问父类的属性和方法,当然还是用刚才提过的super()了。...如果子类中没有包含和父类同名的属性,则子类可以继承父类属性,那么在子类实例方法中就无需显式地适用super作为调用者。...重写是建立在继承关系之上的,在子类中重新编写来自父类的方法以达到自己的需求的目的。...继承可重写,方法可重载。 那么,在重写中还需要注意: 在重写了父类中的方法,按正常的办法子类对象是无法访问到父类中被覆盖的方法的,但是也是可以在子类中调用父类的被覆盖的方法。

    1K20

    【java筑基】浅谈代码复用技术——继承、组合

    1.3 super限定 可以在子类对象中使用super限定该对象调用父类中被子类覆盖的方法、成员变量。和this关键字一样。super关键字也不能出现在静态方法中。...其实,子类定义的同名实例变量并不会真的覆盖掉父类实例变量,只是简单的被隐藏了。当创建一个类的实例对象时,依然会为该对象父类中的实例变量分配内存空间,即使他被隐藏了。...1.父类的成员变量尽量设置为private类型。 2.父类的辅助其它方法的工具方法尽量设置为private,需要被别的类访问但是不希望被重写的方法添加final关键字。...只希望被子类访问的方法设置为protected。 3.尽量不要在父类的构造方法中调用可能被子类改写的类。...1.子类需要额外增加特有属性。

    25210

    Modern Times

    ,子类将会拥有父类所有的方法和属性 * - 通过继承可以将多个类中共有的代码写在一个父类中, * 这样只需要写一次即可让所有的子类都同时拥有父类中的属性和方法 *...如果希望在子类中添加一些父类中没有的属性或方法直接加就行 * - 如果在子类中添加了和父类相同的方法,则子类方法会覆盖掉父类的方法,方法可以重写!!...getter方法用来读取属性 setter方法迎来设置属性 getter和setter被统一称为属性的存储器,定义时在方法之前添加get和set,调用的时候直接通过点语法调用 (function ()...- 它们被称为属性的存取器 * */ // TS中设置getter方法的方式 get name(){ // console.log...方式一(直接使用) test(10)//直接使用 使用时直接传递参数使用,类型会由TS自动推断出来,但有时编译器无法自动判断时还需要使用下面的方式 方式二(指定类型) 也可以在函数后手动指定泛型 可以同时指定多个泛型

    42910
    领券