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

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

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

9.5K30

Python_子类调用父类的方法

注意一点,在子类内部通过继承的方式调用父类的属性时,必须要带上self位置参数(self只在实例化过程中和在实例调用属性时才能省略(self本来的含义就是指向实例自己));而实例在通过继承调用父类的属性或方法时...该部分的代码块如下:注意一点,在子类内部通过继承的方式调用父类的属性时,必须要带上self位置参数(self只在实例化过程中和在实例调用属性时才能省略(self本来的含义就是指向实例自己));而实例在通过继承调用父类的属性或方法时...2.方式二 使用super来代替父类名,以方便代码的后期维护,见下图: ?...使用super的好处,一是可以代替父类名,这样后期父类名更改了,我们只需要更改子类名称后面的父类名即可,子类中其他的父类名可以不用更改;二是使用了super后,调用父类方法时可以不传参数self。...__init__(self,name,age,sex) #通过子类把参数传给父类(self不能少,self只有在实例化和实例调用类时才能省略,此处不是) #使用super来替换父类名

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

    前端基础-ES5继承

    ---- 第0章 先谈ES5继承 继承:多个子类对象可以共用父类对象的成员属性和成员方法(代码重用–重复使用); 0.1 原型链继承 核心原理:B.prototype = new A(); 能够继承A构造函数以及原型链上的所有成员...//定义子类构造函数 function B(){ } //设置子类构造函数的原型对象 = 父类构造函数的实例对象 B.prototype = new A(); var b = new B...(); console.log(b.age); b.say(); 缺点:子对象自身的constructor属性丢失了, 变成了父类构造函数 0.2 冒充继承 实现方式:在子类构造函数中,调用父类构造函数的...(call, apply, bind)方法,使用子类构造函数的this去冒充父类构造函数的this。...父类.call(子类的对象, 其他参数); //意思是让子类的对象,去代替父类中的this。

    46510

    小朋友学Java(10):多态

    学本节之前,可以先复习 小朋友学C++(12):多态 一、定义 多态是同一个行为具有多个不同表现形式或形态的能力。...二、现实中的多态 例1:打印机 例2:按下键盘的F1键 如果当前是在Win 7的桌面,会弹出“Windows帮助和支持” 如果当前是在Word界面,会打开Word的帮助页面 如果当前是在IE浏览器窗口,...会打开“Internet Explorer帮助” 三、多态的3个必要条件 联想一下花木兰替父从军的故事,多态的存在有三个前提 1 要有继承关系 2 子类要重写父类的方法 (这里父类的方法,可以是抽象方法...,也可以是普通方法) 3 父类引用指向子类对象 四、程序 abstract class Animal { abstract void eat(); } class Cat extends...// 调用的是 Cat 的 work } else if(a instanceof Dog) { Dog d = (Dog)a; d.work();

    59050

    【说站】java通配符有哪些

    java通配符有哪些 1、通配符,代表未知类型,代表不关心或无法确定实际操作的类型,一般与容器类配合使用。 public void testV(List list) {} 2、的类型可能是指定的类型或子类型。 //t1要么是Test2,要么是Test2的子类 public void testC(Test1,下限定义,有阅读能力和部分写作能力,子类可以写入父类。这种方法表明参数化的类型可以是指定的类型,也可以是父类。...super Test5> t1) {     //子类代替父类     Test2 value = (Test2) t1.getValue();     System.out.println(value.getT...类型参数的形式可以取代通配符。 能够使用通配符的人使用通配符,因为通配符在形式上往往更简单,可读性更好。 本教程操作环境:windows7系统、java10版,DELL G3电脑。

    66920

    设计模式六大原则

    (即假若父类是某功能模块的零件,使用子类代替父类并且功能模块能正常运行)【子类实例能够替换父类实例】   继承包含这样一层含义:父类中凡是已经实现好的方法(相对于抽象方法而言),实际上是在设定一系列的规范和契约...比如使用继承会给程序带来侵入性,程序的可移植性降低,增加了对象间的耦合性,如果一个类被其他的类所继承,则当这个类需要修改时,必须考虑到所有的子类,并且父类修改后,所有涉及到子类的功能都有可能会产生故障。...通俗含义: 子类可以扩展父类的功能,但不能改变父类原有的功能 子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。 子类中可以增加自己特有的方法。...当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。 当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。...面向对象的开发很好的解决了这个问题,一般情况下抽象的变化概率很小,让用户程序依赖于抽象,实现的细节也依赖于抽象。即使实现细节不断变动,只要抽象不变,客户程序就不需要变化。

    28140

    【AICAMP —— Python】入门系列!(6. 面向对象)

    里式替换原则LSP(the Liskov Substitution Principle LSP) 子类可以替换父类出现在任何地方,比如古代的替父从军,子类代替父类出现在任何地方。...在定义好类之后,我们可以使用类来进行实例化,在别的语言中,如Java, C++,都是可以使用关键字new一个对象,在Python中,不需要使用,比如我们初始化如下两个"打工人"对象: fengqingyang...类的方法与属性扩展 私有属性 私有属性一般在前面使用两个下划线'__'开头,来声明这是一个私有属性。私有属性不能在类外被使用或者直接访问。在类的内部,一般在使用时使用self..../实例的名称空间,存放对象/实例的名字,称为对象/实例的属性 方法重写 子类与父类在某些方法的实现上会有所区别,比如父亲在吃饭时,使用的是左手,而儿子确实一个左撇子,因此同样都是吃饭这个方法,却会有不同的实现细节...这种情况下,仅使用引用计数是不够的。Python 的垃圾收集器实际上是一个引用计数器和一个循环垃圾收集器。

    38240

    设计模式——二:里氏替换原则

    在士兵类中定义了一个方法killEnemy,使用枪来杀敌人, 具体使用什么枪来杀敌人,调用的时候才知道。...在这种情况下,我们发现业务调用类已 经出现了问题,正常的业务逻辑已经不能运行,那怎么办?有两种办法。 ● 在Soldier类中增加instanceof的判断,如果是玩具枪,就不用来杀敌人。...父类方法的输入参数是HashMap类型,子类的输入参数是Map类型,也就是说子类的输入参数类型的范围扩大了,子类代替父类传递到调用者中,子类的方法永远都不会被执行。...){ System.out.println("子类被执行..."); return map.values(); } } 在父类的前置条件大于子类的前置条件的情况下,业务场景: public...在实际项目中,每个子类对应不同的业务含义,使用父类作为参数,传递不同的子类完成不同的业务逻辑。

    47120

    设计模式(十五)-面向对象概念

    软件设计(十五)-UML建模(下) 一、设计原则 1、单一职责:设计目的单一的类。 2、开放-封闭原则:对扩展开放,对修改关闭。 3、里氏替换原则:子类可代替父类。...1、创建型模式 抽象工厂:提供一个接口,创建一系列相关或相互依赖的对象。 原型:用原型实例指定创建对象的类型,并通过拷贝创建新对象。...(为什么不new而是拷贝,效率更高,拷贝是直接在内存,new是在创建对象) 单例:全局保证一个实例。 工厂模式、构建器模式。 2、结构型模式 适配器模式:讲一个类转成其他可以使用的接口,方便协同工作。...(转换接口) 桥接:将类的抽象和实现部分分离出来,可以独立变化。(继承树拆分 就属于桥接模式) 装饰模式:动态的给一个对象额外增加职责。(附加职责) 外观、组合、享元模式、代理模式。...(多方案切换) 访问者模式:在不改变类的前提下,对这些元素进行操作。

    29630

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

    一、public 公有继承 - 示例分析 1、类型兼容性原则 类型兼容性原则 : C++ 的 " 类型兼容性原则 “ 又称为 ” 赋值兼容性原则 " ; 子类代替父类 : 需要 基类 ( 父类 ) 对象的..." 公有继承 " 的 派生类 ( 子类 ) 本质上 具有 基类 ( 父类 ) 的 完整功能 , 使用 基类 可以解决的问题 , 使用 公有继承派生类 都能解决 ; 特别注意 : " 保护继承 " 和..." 私有继承 " 的 派生类 , 是 不具有 基类 的 完整功能的 , 因为 最终继承 后的派生类 , 无法在 类外部调用 父类的 公有成员 和 保护成员 ; 2、类型兼容性原则应用场景 " 类型兼容性原则..." 应用场景 : 直接使用 : 使用 子类对象 作为 父类对象 使用 ; 赋值 : 将 子类对象 赋值给 父类对象 ; 初始化 : 使用 子类对象 为 父类对象 初始化 ; 指针 : 父类指针 指向...子类对象 , 父类指针 值为 子类对象 在 堆内存 的地址 , 也就是 将 子类对象 地址 赋值给 父类类型指针 ; 引用 : 父类引用 引用 子类对象 , 将 子类对象 赋值给 父类类型的引用 ; 二

    44100

    Python3.6.5标准库文档(完整中文版)---内置函数(八)

    在版本3.6中更改:允许使用下划线对代码进行分组,如代码文字。...isinstance(object,classinfo ) 如果对象参数是classinfo 参数的实例或其(直接,间接或虚拟)子类的实例,则返回true。...如果object不是给定类型的对象,则该函数总是返回false。如果classinfo是类型对象的元组(或者是递归的,其他这样的元组),如果object是任何类型的实例,则返回true 。...issubclass(class,classinfo ) 如果返回true 类是一个子类(直接,间接或虚拟)的CLASSINFO。一个类被认为是它自己 的一个子类。...classinfo可以是类对象的元组,在这种情况下,将检查classinfo中的每个条 目。在其他情况下,TypeError会引发异常。

    99220

    设计模式|LSP(里氏替换)原则

    在这种情况下,我们发现业务调用类已经出现了问题,正常的业务逻辑已经不能运行,那怎么办?好办,有两种解决办法: 在Soldier类中增加instanceof的判断,如果是玩具枪,就不用来杀敌人。...父类方法的输入参数是HashMap类型,子类的输入参数是Map类型,也就是说子类的输入参数类型的范围扩大了,子类代替父类传递到调用者中,子类的方法永远都不会被执行。...大家可以这样想,在一个Invoker类中关联了一个父类,调用了一个父类的方法,子类可以覆写这个方法,也可以重载这个方法,前提是要扩大这个前置条件,就是输入参数的类型宽于父类的类型覆盖范围。...在实际项目中,每个子类对应不同的业务含义,使用父类作为参数,传递不同的子类完成不同的业务逻辑,非常完美!...最佳实践 在项目中,采用里氏替换原则时,尽量避免子类的“个性”,一旦子类有“个性”,这个子类和父类之间的关系就很难调和了,把子类当做父类使用,子类的“个性”被抹杀——委屈了点;把子类单独作为一个业务来使用

    70130

    新手小白学JAVA 面向对象之多态

    在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。...在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。...静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。...总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。...比如:花木兰替父从军,大家都把花木兰看做她爸,但是实际从军的是花木兰,而且,花木兰只能做她爸能做的事,在军营里是不可以化妆的。 向下转型(较少):子类的引用的指向子类对象,过程中必须要采取到强制转型。

    24030

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

    一、public 公有继承 - 示例分析 1、类型兼容性原则 类型兼容性原则 : C++ 的 " 类型兼容性原则 “ 又称为 ” 赋值兼容性原则 " ; 子类代替父类 : 需要 基类 ( 父类 ) 对象的..." 公有继承 " 的 派生类 ( 子类 ) 本质上 具有 基类 ( 父类 ) 的 完整功能 , 使用 基类 可以解决的问题 , 使用 公有继承派生类 都能解决 ; 特别注意 : " 保护继承 " 和..." 私有继承 " 的 派生类 , 是 不具有 基类 的 完整功能的 , 因为 最终继承 后的派生类 , 无法在 类外部调用 父类的 公有成员 和 保护成员 ; 2、类型兼容性原则应用场景 " 类型兼容性原则..." 应用场景 : 直接使用 : 使用 子类对象 作为 父类对象 使用 ; 赋值 : 将 子类对象 赋值给 父类对象 ; 初始化 : 使用 子类对象 为 父类对象 初始化 ; 指针 : 父类指针 指向...子类对象 , 父类指针 值为 子类对象 在 堆内存 的地址 , 也就是 将 子类对象 地址 赋值给 父类类型指针 ; 引用 : 父类引用 引用 子类对象 , 将 子类对象 赋值给 父类类型的引用 ; 二

    30920

    java 中级面试题_java中级面试题

    3、java抽象类和接口有什么区别?项目中怎么去使用它们? 相同点: A. 两者都是抽象类,都不能实例化。...B. interface实现类及abstractclass的子类都必须要实现已经声明的抽象方法。...尽管interface实现类及abstrct class的子类都必须要实现相应的抽象方法,但实现的 形式不同。...interface中的每一个方法都是抽象方法,都只是声明的 (declaration, 没有方法体),实现类必须要实现。而abstract class的子类可以有选择地实现。...使用: abstract:在既需要统一的接口,又需要实例变量或缺省的方法的情况下,使用abstract; interface:使用: 类与类之前需要特定的接口进行协调,而不在乎其如何实现。

    52931

    HotSpot虚拟机中的对象

    对象的创建 当虚拟机遇到一条new指令时: 检查 检查能否用这个指令的参数在常量池中定位到一个类的符号引用 检查这个符号引用代表的类是否已经被加载,解析和初始化过 如果没有被加载,解析,初始化,先进行类加载过程...用-XX:+/-UseTLAB参数设定是否使用TLAB 初始化零值(不包括对象头) 使用TLAB则在分配TLAB时初始化 设置对象头 包括类信息,类的元数据信息,对象哈希码,对象GC分代年龄...这个指针能确定这个对象是哪个类的实例。...不一定所有虚拟机都有 如果对象是Java数组,还有一块用于记录数组长度的数据 2.2 实例数据 父类中继承和子类中定义的,都有记录 HotSpot虚拟机把相同宽度的字段分配到一起 在满足前面一个条件的情况下...,父类中定义的变量会在子类之前 如果CompactFiles参数为true(默认为true),子类中较窄的变量也可能会插到父类变量的空隙中 2.3 对齐填充 不一定必然存在 没有特别含义,仅起到占位符的作用

    44950

    开发者都应该了解的SOLID原则(下)

    its super-class(子类一定能用父级类替换) 这个原则的目的是确定一个子类可以毫无错误地代替父类的位置。...: 如果父类(Animal)有一个接受父类类型(Animal)的参数的方法,它的子类(Pigeon)应该接受一个父类类型(Animal)或子类类型(Pigeon)作为参数 如果父类返回一个父类类型(Animal...可见AnimalLegCount函数不需要知道Animal的具体类型,只需要调用Animal类的LegCount方法,因为按约定Animal类的子类都必须实现LegCount函数。...我们就要痛苦地移动到所有Http的实例来编辑代码,这将违背OCP(开放闭合)。...Http类应当减少关心使用的Http 服务的类型, 我们建立一个Connection 接口: 1interface Connection { 2 request(url: string, opts

    68320

    SqlAlchemy 2.0 中文文档(二十七)

    这是操作的最低级别,默认情况下引发NotImplementedError。 在子类上重写这个方法可以使通用行为应用于所有操作。...Python 的 isinstance()函数相同,但这里的标志可以在不需要导入所有这些类的情况下使用,并且 SQLAlchemy 类系统可以更改,同时保持这里的标志不变以实现向前兼容性。...另请参见 对象状态简介 attribute dict 返回对象使用的实例字典。 在正常情况下,这通常与映射对象的__dict__属性同义,除非已配置了替代的仪器系统。...通常情况下,这将是一个ColumnElement子类的实例,代表着一个列表达式。 attribute info 返回底层 SQL 元素的‘info’字典。...这是操作的最低级别,默认情况下引发NotImplementedError。 在子类上覆盖此操作可以使通用行为应用于所有操作。

    37410
    领券