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

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

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

9.5K30

为什么 build 方法放在 State 中而不是在 StatefulWidget 中

为什么 build 方法放在 State 中而不是在 StatefulWidget 中呢?其中前2点是源代码的注释中给出的原因,最后一点是我的一点个人理解。...灵活性 将 build 方法放在 State 中比放在 StatefulWidget 中更具灵活性,比如说,AnimatedWidget 是 StatefulWidget 的子类,AnimatedWidget...是一个抽象类,其中有一个 Widget build(BuildContext context) 的抽象方法,此方法需要子类重写,AnimatedWidget 源代码如下: abstract class...闭包 this 指向异常 假设 build 方法在 StatefulWidget 中,StatefulWidget 的子类写法如下: class MyWidget extends StatefulWidget...如果 build 方法在 State 中,代码如下: class MyWidget extends StatefulWidget { final Color color; const MyWidget

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

    什么在代码中要求我们使用LocalDateTime而不是Date?

    作者:何甜甜在吗 来源:http://1t.click/a7Gm 在项目开发过程中经常遇到时间处理,但是你真的用对了吗,理解阿里巴巴开发手册中禁用static修饰SimpleDateFormat...通过阅读本篇文章你将了解到: 为什么需要LocalDate、LocalTime、LocalDateTime【java8新提供的类】; java8新的时间API的使用方式,包括创建、格式化、解析、计算、...在多并发情况下使用SimpleDateFormat需格外注意 SimpleDateFormat除了format是线程不安全以外,parse方法也是线程不安全的。...calb中中属性设置cal c、返回设置好的cal对象 但是这三步不是原子操作 多线程并发如何保证线程安全 - 避免线程之间共享一个SimpleDateFormat对象,每个线程使用时都创建一次SimpleDateFormat...=> 较好的方法 1.Date对时间处理比较麻烦,比如想获取某年、某月、某星期,以及n天以后的时间,如果用Date来处理的话真是太难了,你可能会说Date类不是有getYear、getMonth这些方法吗

    1.1K20

    Python 在子类中调用父类方法详解(单继承、多层继承、多重继承)

    测试环境: win7 64位 Python版本:Python 3.3.5 代码实践: 1、在子类中通过“类名”调用父类的方法 class FatherA: def __init__(self)...__init__(self) # 在子类中调用父类的方法:父类名.方法名称(参数) if __name__ == '__main__': b = SubClassB() 运行结果: >>> ==...(如类SubClassB的父类由FatherA变为FatherD时),必须遍历整个类定义,把子类中所有的父类类名全部替换过来 2、在子类中通过“super”方法调用父类的方法 场景1、单层继承 class...__init__() # 在子类中调用父类的方法:super().方法名称(参数) if __name__ == '__main__': b = SubClassB() class FatherA...__init__() # 在子类中调用父类的方法:super(type, obj).方法名称(参数) if __name__ == '__main__': b = SubClassB() 运行结果

    3.2K30

    Effective Java(第三版)——条目十六:在公共类中使用访问方法而不是公共属性

    如果不更改API,则无法更改其表示形式,无法强制执行不变量,并且在访问属性时无法执行辅助操作。...在类定义和使用它的客户端代码中,这种方法比访问方法产生更少的视觉混乱。 虽然客户端代码绑定到类的内部表示,但是这些代码仅限于包含该类的包。...如果类的内部表示是可取的,可以在不触碰包外的任何代码的情况下进行更改。 在私有内部类的情况下,更改作用范围进一步限制在封闭类中。 Java平台类库中的几个类违反了公共类不应直接暴露属性的建议。...着名的例子包括java.awt包中的Point和Dimension类。 这些类别应该被视为警示性的示例,而不是模仿的例子。...虽然公共类直接暴露属性并不是一个好主意,但是如果属性是不可变的,那么危害就不那么大了。

    84410

    深入理解java的泛型

    编译器在编译的过程中执行类型检查来保证类型安全,但是在随后的字节码生成之前将其擦除。 这样就会带来让人困惑的结果。本文将会详细讲解泛型在java中的使用,以避免进入误区。...泛型和协变 有关协变和逆变的详细说明可以参考: 深入理解协变和逆变 这里我再总结一下,协变和逆变只有在类型声明中的类型参数里才有意义,对参数化的方法没有意义,因为该标记影响的是子类继承行为,而方法没有子类...接下来我们考虑泛型的情况,List 是不是 List的父类呢?很遗憾,并不是。 我们得出这样一个结论:泛型不是协变的。 为什么呢?...所以我们在使用泛型时候的一些操作会遇到问题。 假如我们有一个泛型的类,类中有一个方法,方法的参数是泛型,我们想在这个方法中对泛型参数进行一个拷贝操作。...总结 本文讨论了泛型在java中使用中可能会存在的问题,希望大家能够喜欢。

    42310

    泛型泛型知多少

    编译器在编译的过程中执行类型检查来保证类型安全,但是在随后的字节码生成之前将其擦除。 这样就会带来让人困惑的结果。本文将会详细讲解泛型在java中的使用,以避免进入误区。...,对参数化的方法没有意义,因为该标记影响的是子类继承行为,而方法没有子类。...接下来我们考虑泛型的情况,List 是不是 List的父类呢?很遗憾,并不是。 我们得出这样一个结论:泛型不是协变的。 为什么呢?...所以我们在使用泛型时候的一些操作会遇到问题。 假如我们有一个泛型的类,类中有一个方法,方法的参数是泛型,我们想在这个方法中对泛型参数进行一个拷贝操作。...总结 本文讨论了泛型在java中使用中可能会存在的问题,希望大家能够喜欢。

    1.1K10

    《Java从入门到失业》第五章:继承与多态(5.1-5.7):继承

    假如我们把这些玩具枪抽象成类,类图的示意图大致如下: ? 我们发现,这3者之间有很多相同的属性和方法(红色部分)。有没有什么办法能够减少这种编写重复代码的办法呢?Java提供了继承来解决这个问题。...我们可以在更高一层抽象一个枪类,在枪类里面编写这些重复的属性和方法,然后其余的枪都继承自枪类,它们只需要编写各自独有的属性和方法即可,使用继承优化后的类图设计如下: ?...不过在Java中,我们一般习惯用超类和子类的方式来称呼。...(如上节中的例子),但是因为某些原因我们又想复原成子类,这个时候就需要用到强制类型转换了,我们把这种超类类型强制转换为子类类型的操作称为向下转型。...在实际工作运用中,笔者并不推荐大量使用向下转型操作,因为大部分的向下转型都是因为超类的设计问题而导致的,这个话题在这就不展开讨论了,等大家经验丰富后,自然会体会到。

    57520

    Java面向对象三大特性详解「建议收藏」

    重载和重写的区别: 方法重载:在同一个类中处理不同数据的多个相同方法名的多态手段。 方法重写:相对继承而言,子类中对父类已经存在的方法进行区别化的修改。...那么如果自己用super关键字在子类里调用父类的构造方法,则必须在子类的构造方法中的第一行。 要注意的是:如果子类构造方法中既没有显示调用父类的构造方法,而父类没有无参的构造方法,则编译出错。...创建本类对象时,调用的方法为本类方法; 创建子类对象时,调用的方法为子类重写的方法或者继承的方法; 使用多态的时候要注意:如果我们在子类中编写一个独有的方法(没有继承父类的方法),此时就不能通过父类的引用创建的子类对象来调用该方法...B、抽象类 定义:抽象类前使用abstract关键字修饰,则该类为抽象类。 使用抽象类要注意以下几点: 1. 抽象类是约束子类必须有什么方法,而并不关注子类如何实现这些方法。 2....从这里可以看出,继承是一个 “是不是”的关系,而 接口 实现则是 “有没有”的关系。

    91621

    《流畅的Python》第十一章学习笔记

    A的f方法 鸭子类型 忽略对象的真正类型,转而关注对象有没有实现所需的方法、签名和语义。...在框架之外,鸭子类型通常比类型检查更简单,也更灵活 抽象基类 collections.abc中有很多有用的抽象类 Python的抽象基类可以使用register类方法在终端用户的代码中把某个类「声明」为一个抽象基类的...让解释器把调用分派给正确的方法,而不是if/elif/else块硬编码分派逻辑 抽象基类是用于封装框架引入的一般性概念和抽象。...容器抽象基类 注意:与其他方法描述符一起使用时,abstractmethod需要放在最里面 虚拟子类 即便不继承,也有办法把一个类注册为抽象基类的虚拟子类。...注册虚拟子类的方法是在抽象基类上调用register方法。issubclass和 isinstance等函数都能识别,但是注册的类不会从抽象基类中继承任何方法或属性。

    46910

    Java面向对象—抽象类和接口

    一.抽象类   在了解抽象类之前,先来了解一下抽象方法。抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。...对于一个父类,如果它的某个方法在父类中实现出来没有任何意义,必须根据子类的实际需求来进行不同的实现,那么就可以将这个方法声明为abstract方法,此时这个类也就成为abstract类了。   ...在其他方面,抽象类和普通的类并没有区别。 二.接口   接口,英文称作interface,在软件工程中,接口泛指供别人调用的方法或者函数。...从这里可以看出,继承是一个 "是不是"的关系,而 接口 实现则是 "有没有"的关系。...如果一个类继承了某个抽象类,则子类必定是抽象类的种类,而接口实现则是有没有、具备不具备的关系,比如鸟是否能飞(或者是否具备飞行这个特点),能飞行则可以实现这个接口,不能飞行就不实现这个接口。

    22620

    欢迎来到我的Java世界“抽象类”

    在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。...2.虽然图形图Shape中也存在draw的方法,但由于shape类并不是具体的图形,因此其内部的draw方法实际是没有办法实现的。...静态成员:抽象类中可以包含静态成员(静态变量、静态方法、静态代码块等)。这些静态成员属于类本身,而不是类的实例,因此它们可以通过类名直接访问,而无需创建类的实例。 8....抽象类与接口的区别:虽然抽象类和接口都用于定义类的规范,但它们在实现和使用上有所不同。接口是纯粹的抽象,只能包含抽象方法和常量,而抽象类可以包含已实现的方法和变量。...这种机制强制子类实现特定的行为,确保了子类具有某些必要的功能。 3. 作为类型隐藏和全局变量的角色 在面向对象的方法中,抽象类还可以用来进行类型隐藏和充当全局变量的角色。

    10610

    详解 Java 泛型

    其二,在声明和使用泛型的类和方法中,在 class 文件层面,需要有一个额外的表结构来记录存在泛型参数时的类和方法签名,这个表名为 Signature,是虚拟机规范定义的 class 文件中类、方法、字段可能存在...在字节码层,main 方法中出现了类型强制转换的字节码(checkcast)!...因此前三句添加元素的代码都没有错误(A B C 就是类型 A 本身或者 A 类型的子类),最后一句报错,因为 Object 类不是 A 的子类。 此时,对于 list 的 get 方法有什么影响呢?...问题点在于这里使用 extends 时,我们规定的只是上界,不是下界,这样的话可能的引用类型就会有无限多种(一个非 final 的类可以有无数个子类)。...此时就需要看有没有配合 super 或者 extends 关键字使用了。

    93420

    JAVA实习生面试问题

    三:数组是一种可读/可写数据结构没有办法创建一个只读数组。然而可以使用集合提供的ReadOnly方 只读方式来使用集合。该方法将返回一个集合的只读版本。        ...因此通过一个父类发出的方法调用可能执行的是方法在父类中的实现,也可能是某个子类中的实现,它是由运行时刻具体的对象类型决定的。        ...12.Java有没有goto?         goto是java中的保留字,现在没有在java中使用。         13.数组有没有length()这个方法?...取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。         接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。...最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。

    56630

    为Java程序员金三银四精心挑选的五十道面试题与答案

    新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。...【基础】 答:不是。 4、float 型float f=3.4是否正确? 【基础】 答:不正确;精度不准确,应该用强制类型转换,如下所示:float f=(float)3.4 。...7、Java 有没有goto? 【基础】 答:goto 是java 中的保留字,现在没有在java 中使用。 8、int 和Integer 有什么区别?...如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写(Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。...不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。

    87360

    【Java】基础18:什么叫多态?

    其中父类引用(也就是图中的Zoo)在调用方法时,会先看自己有没有这个方法(eat方法)。...每一个动物就建立对象,但是只需要一个show()方法就可以了。 show()方法参数是父类类型的引用。 这样无论建立多少个动物对象,只要是子类,都可以将参数传入这个方法,直接使用。...这就叫代码的可拓展性,以后无论是删减哪种动物,或者是添加哪种动物,这个方法都可以使用,不用改变。 三、多态的弊端 多态这么方便,那它有没有什么弊端呢? 是有的。...多态不能调用子类的特有方法,需要使用到强制转换。 ? 兔类中有一个特有的方法jump(),兔类的父接口Zoo中没有这个方法。 那么父类引用zoo就不能调用这个特有的方法。...ClassCastException,中文就是:类转换异常。 其实很好理解,变量zoo定义的时候,本来是子类dog对象,现在强制转换成子类Rabbit,自然没法运行。

    61410

    Java 最全异常讲解

    JRE 在方法的调用栈中查找,从生成异常的方法开始回溯,直到找到相应的异常处理代码为止。...发生多态后,如果强制转化的并不是父类的子类时发生。...异常的处理办法之一:捕获异常 try块 try 语句指定了一段代码,该段代码就是一次捕获并处理的范围。在执行过程中,当任意一条语句产生异常时,就会跳过该段中后面的代码。...在方法中使用 try-chatch-finally 由这个方法处理异常。在一些情况下,当前方法并不需要处理发生的异常,而是向上传递给调用它的方法处理。...包含如下意思: 父类没有声明异常,子类也不能; 不可抛出原有方法抛出异常类的父类或上层类 抛出的异常类型的数目不可以比原有的方法抛出的还多(不是指个数) 异常的处理办法之三:手动抛出异常(throw子句

    56010

    Java 继承关系中的 java.lang.ClassCastException 错误

    通常我们在 OOP 设计中都会使用到继承。 但是在继承对象之间的强制转换可能会遇到 java.lang.ClassCastException 异常的错误。...考察下面的代码: Parent b = new parent(); Child c = (Child) b ; 采用该方法不能实现对象类型由超类向子类的转换。...上面的原因是父类的对象是由父类创建的,然后你尝试将父类创建的对象强制转换到子类中。...因为父类创建的对象和子类需要创建的对象分别使用不同的地址空间,那在转换的时候将会出现地址空间引用的错误,因此 JVM 会认为你将 2 个完全不同类型的对象进行转换,这个时候出现上面的运行时错误。...要解决这个问题的办法就是在创建父类的时候使用子类来创建,并且强制将创建的父类转换为子类就可以了。 使用这种创建方法就能保证使用相同的地址空间。

    1.5K00
    领券