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

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

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

9.4K30

为什么Java成员变量不能重写?成员变量Java能够重写么?不会重写成员变量,而是隐藏成员变量访问隐藏域方法

这篇文章讨论了Java面向对象概念中一个基本概念--Field Hiding(成员变量隐藏) 成员变量Java能够重写么?...意思就是: 一个,子类成员变量如果和父成员变量同名,那么即使他们类型不一样,只要名字一样。父成员变量都会被隐藏。子类,父成员变量不能简单用引用来访问。...而是,必须从父引用获得父隐藏成员变量,一般来说,我们不推荐隐藏成员变量,因为这样会使代码变得难以阅读。...其实,简单来说,就是子类不会去重写覆盖父成员变量,所以成员变量访问不能像方法一样使用多态去访问。...访问隐藏域方法 就是使用引用类型,那么就可以访问到隐藏域,就像我们例子代码 就是使用类型转换System.out.println(((Super)c1).s); 翻译自http://www.programcreek.com

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

GoLang接口---下

C++,Java 和 C#)数据和方法被封装为 概念:包含它们两者,并且不能剥离。...该特性允许我们不改变已有的代码情况下定义和使用新接口。 接收一个(或多个)接口类型作为参数函数,其实参可以是任何实现了该接口类型变量。...认为是 Go 编程重要最佳实践。 有用接口可以开发过程中被归纳出来。添加新接口非常容易,因为已有的类型不用变动(仅仅需要实现新接口方法)。...已有的函数可以扩展为使用接口类型约束性参数:通常只有函数签名需要改变。对比基于 OO 类型语言在这种情况下则需要适应整个层次结构变化。...---- Go 面向对象 我们总结一下前面看到:Go 没有,而是松耦合类型、方法对接口实现。 OO 语言最重要三个方面分别是:封装,继承和多态, Go 它们是怎样表现呢?

35340

Go 泛型之泛型约束

所以, Go 泛型版本,interface 语法也得到了一些扩展,也正是这些扩展给那些刚刚入门 Go 泛型 Go 开发者带来了一丝困惑,这也是约束认为是 Go 泛型一个难点原因。...这类基于行为(方法集合)定义约束对于习惯了 Go 接口类型开发者来说,是相对理解。...接口元素也有两,一就是常规方法元素(method element),每个方法元素对应一个方法原型;另一则是此次扩展新增类型元素(type element),即在接口类型,我们可以放入一些类型信息...扩展后,Go 将接口类型分成了两,一是基本接口类型(basic interface type),即其自身和其嵌入接口类型都只包含方法元素,而不包含类型元素。...Go 规定一个方法类型集合为所有实现了该方法接口类型集合,显然也是一个无限集合,如下图所示: 通过方法元素类型集合,我们也可以合理解释仅包含多个方法常规接口类型类型集合,那就是这些方法元素类型集合交集

18610

《Go 语言程序设计》读书笔记(四)接口

T类型变量上调用一个 *T方法是合法,编译器隐式获取了它地址。但仅仅是一个语法糖:T类型值不拥有所有*T指针方法。...Go语言中,变量总是一个定义明确值初始化,即使接口类型也不例外。...w: w = os.Stdout 这个赋值过程调用了一个具体类型到接口类型隐式转换,和显式使用io.Writer(os.Stdout)是等价。...当一个接口只一个单一具体类型实现时有一个例外,就是由于它依赖,这个具体类型不能和这个接口存在在一个相同。这种情况下,一个接口是解耦这两个包一个方式。...因为Go语言中只有当两个或更多类型须以相同方式进行处理时才有必要使用接口,它们必定会从任意特定实现细节抽象出来。

35320

Go 接口-契约介绍

任何类型只要实现了这个 Write 方法签名,就可以认为是 Writer 接口实现。 总之,Go语言提倡面向接口编程。...1.3 面向接口编程 PHP、Java等语言中也有接口概念,不过PHP和Java语言中需要显式声明一个实现了哪些接口,Go语言中使用隐式声明方式实现接口。...接口类型是Go语言提供一种工具,实际编码过程是否使用它由你自己决定,但是通常使用接口类型可以使代码更清晰易读。...,所以 Go 接口类型方法集合中放入首字母小写非导出方法也是合法,并且我们 Go 标准库也找到了带有非导出方法接口类型定义,比如 context 包 canceler 接口类型,它代码如下...通过对标准库为数不多例子,我们可以看到,如果接口类型方法集合包含非导出方法,那么这个接口类型自身通常也是非导出,它应用范围也仅局限于包内。

15550

Go语言核心36讲(Go语言进阶技术八)--学习笔记

14 | 接口类型合理运用 前导内容:正确使用接口基础知识 Go 语言语境,当我们在谈论“接口”时候,一定指的是接口类型。因为接口类型与其他数据类型不同,它是没法实例化。...这里你要注意是:接口类型声明这些方法所代表就是该接口方法集合。一个接口方法集合就是它全部特征。... 3 个方法共同组成了接口类型Pet方法集合。 只要一个数据类型方法集合中有这 3 个方法,那么它就一定是Pet接口实现类型。这是一种无侵入式接口实现方式。...很奇怪对?其实不然。 Go 语言中,我们把由字面量nil表示值叫做无类型nil。这是真正nil,因为它类型也是nil。...这是因为相比于包含很多方法大接口而言,小接口可以更加专注地表达某一种能力或某一特征,同时也更容易组合在一起。

34101

Go语言核心36讲(Go语言基础知识六)--学习笔记

06 | 程序实体那些事儿 (下) 在上一篇文章,我们一直都在围绕着可重名变量,也就是不同代码块重名变量,进行了讨论。还记得?...比如你今后肯定会遇到struct{},它就代表了不包含任何字段和方法、空结构体类型。 而空接口interface{}则代表了不包含任何方法定义、空接口类型。...int16可表示范围可比int8型大了不少。问题是,dstInt值是多少? 首先你要知道,整数 Go 语言以及计算机中都是以补码形式存储主要是为了简化计算机对整数运算过程。...因此,MyString2值与string类型值可以使用类型转换表达式进行互转。...你能具体说说别名类型代码重构过程可以起到哪些作用

40601

Go语言核心36讲(Go语言进阶技术八)--学习笔记

Go语言核心36讲(Go语言进阶技术八)--学习笔记 14 | 接口类型合理运用 前导内容:正确使用接口基础知识 Go 语言语境,当我们在谈论“接口”时候,一定指的是接口类型。...这里你要注意是:接口类型声明这些方法所代表就是该接口方法集合。一个接口方法集合就是它全部特征。... 3 个方法共同组成了接口类型Pet方法集合。 只要一个数据类型方法集合中有这 3 个方法,那么它就一定是Pet接口实现类型。这是一种无侵入式接口实现方式。...很奇怪对?其实不然。 Go 语言中,我们把由字面量nil表示值叫做无类型nil。这是真正nil,因为它类型也是nil。...这是因为相比于包含很多方法大接口而言,小接口可以更加专注地表达某一种能力或某一特征,同时也更容易组合在一起。

34530

11-接口

值类型也可以实现接口,当我们把一个值类型实例转为接口类型时,会被装箱,因为接口总认为是引用类型,并且它们方法总是虚方法。...未装箱值类型是没有方法表指针,执行装箱将使CLR可以查询类型方法表,便可以调用其虚方法了。 抽象:is-a关系;接口:can-do关系。...//[9-9] 19 } 20 } 我通俗理解是:我是一个人[值类型Location],我有编程能力[实现IChangeBoxedLocation接口], 所以必要时候你可以把我当作程序员来使用...,所以我们要告诉C#编译器我们哪一个Print实现了哪个接口,C#通过方法名前面加上接口名来告诉C#编译器。...一个类型中用完全限定名定义接口方法时,该方法认为是私有的,因为类型本身无法调用它,当转型为一个接口时,这个方法将可以调用,这时又是一个共有方法 显示接口成员实现 显示实现接口成员正是用到了上面的用完全限定名来实现接口

53590

Golang interface

interface Go语言中,接口(interface)是一种类型,定义了一组方法签名,用于描述对象行为,是一组方法集合。接口只定义方法方法名称、参数列表和返回值列表)而不实现。...接口是一种抽象类型,可以其他具体类型实现,从而实现多态性。 实现接口 一个具体类型只要拥有了接口中所有方法实现,就可以认为是接口类型实现类型。...实现接口方法时,如果传入是当前具体类型指针,如: type Cat struct { } func (c *Cat) eat() { fmt.Println("eat") } func (c...Cat指针,即&Cat{} interface赋值 如果一个接口类型方法集合包含了另一个接口类型所有方法,那么这个接口类型就可以赋值给另一个接口类型。...方法传入Cat与传入*Cat区别 即 func (c *Cat) eat(){} func (c Cat) eat(){} 之区别 如果希望方法可以修改struct属性值,那么就传入*Cat

12030

Golang 编程思维和工程实战

和 Effective Go 两篇官方文章,真的非常推荐必须要好好看完、看懂两篇文章(英文不好同学可以看中文翻译文档),然后按照官方编码规范来具体 coding,主要是能够具体编码中有迹可循...4 Golang model service 模型【 MVC 模型】 一个项目工程,为了使得代码更优雅,需要抽象出一些模型出来,同时基于 C++面向对象编程思想,需要考虑到一些、继承相关。... Golang ,没有、继承概念,但是我们完全可以通过 struct 和 interface 来建立我们想要任何模型。...我们工程,抽象出一种我自认为是类似 MVC 模型,但是不完全一样,个人觉得这个模型抽象比较好,容易扩展,模块清晰。...M,service 对应 MVC C, 调用访问地方对应 MVC V 5 Golang 单例模式 单例模式是一种常用软件设计模式,核心结构只包含一个被称为单例特殊,通过单例模式可以保证系统中一个有且仅有一个实例且该实例可以外界访问

81820

从源码角度分析一次诡异加载问题

最近有同学在做 APM 链路监控发现了一个诡异加载问题,没有调用到函数里面用到,居然触发了加载,于是结合 JVM 源码做了一下分析,过程如下: 现象描述 简化后有如下几个,其中 IParent...是一个抽象,ChildImpl 是 IParent 子类,TestB 有一个 test 方法,入参为 IParent,TestA 有两个静态方法,一个 foo,一个 test,其中 test 方法中新建了一个...main 方法调用 TestA foo 方法 package me.ya; public class Main { public static void main(String[] args...) { TestA.foo(); } } 那么问题是: 只调用 TestA foo 方法,不调用 test 方法,会触发 IParent 和 ChildImpl 加载...到这里就很清楚为什么函数没有调用到,函数内用到竟然加载了。 简单总结就是:TestB 加载过程需要进行校验文件合法性,其中一项就是函数调用参数赋值是否合法。

80010

Go类型嵌入介绍和使用类型嵌入模拟实现“继承”

通过接口类型嵌入其他接口类型可以实现接口组合,这也是 Go 语言中基于已有接口类型构建新接口类型惯用法。 按 Go 语言惯例,Go 接口类型只包含少量方法,并且常常只是一个方法。...接口类型类型嵌入比较简单,我们只要把握语义,也就是“方法集合并入”就可以了。...到这里,我们就清楚了,嵌入字段使用的确可以帮我们 Go 实现方法“继承”。 文章开头,类型嵌入这种看似“继承”机制,实际上是一种组合思想。...7.1 结构体类型嵌入接口类型 结构体类型嵌入接口类型后,结构体类型方法集合会发生什么变化呢?...和结构体指针类型方法集合包含结构体类型方法集合,是一个道理。 到这里,基于类型嵌入“继承”方法实现原理,我们基本都清楚了。但不知道你会不会还有一点疑惑:只有通过类型嵌入才能实现方法“继承”

16350

Java开发三大怪

事实上,lombok已经告诉调用者,@Data注解说明:只有将一个视为数据时,才应该如此使用。然则,一个领域应该作为数据?...业务功能各个步骤映射到代码,平铺直叙,没有封装,也没有合理职责分配。ShipmentServices就好似专注于运输上帝,它无所不知,成为业务主控对象。...必须明确,面向接口编程原则所谓“接口”,并非Javainterface类型,而是设计者定义一种交互标准,以此可形成调用双方都需遵循契约。实际上,每个公开方法定义都可认为是接口。...它会将当前名当做接口类型名称,然后要求你输入更为具体名。...根据“use interface where possible”语义,IDE会帮助你检测其他用到当前地方,将其改为使用抽象接口类型。 编码实现时,不要做多余抽象,符合“简单设计”原则。

43920

Go 也能实现 “继承”?

继承是面向对象三大特性之一,继承是从已有的中派生出新,新能吸收已有数据属性和行为,并能扩展新能力。...Go 语言里“继承”体现如一个结构体拥有另一个结构体所有字段和方法,并在此基础上,定义新字段和方法。类型嵌入组合思想, Go 语言里体现就是类型嵌入。...定义 Student 结构体,定义 School 字段,GoToTheClass 方法,嵌入 Person 类型,直接以结构体类型作为结构体字段,称为 结构体类型嵌入,此字段也视为 字段嵌入。...这是因为 Student “继承” 了 Person,Person 结构体字段和方法 Student 结构体里隐式实现。... Go 标准库可以看到很多这种组合方式应用。小结本文介绍了 Go 语言中 “继承”,它是通过组合思想去模拟实现面向对象继承。

18000

JAVA知识基础(七):封装

1.概述 封装(Encapsulation)是指一种将抽象性函式接口实现细节部分包装、隐藏起来方法。 封装可以认为是一个保护屏障,防止该类代码和数据外部类定义代码随机访问。...Java 会使用 package 这种机制原因也非常明显,就像我们取姓名一样 ,光是一间学校同一届同学,就有可能会出现不少同名同学,如果不取姓的话,那学校处理学生资料,或是同学彼此之间称呼,...表示该类型简名可以导入语句所在编译单元任何地方使用.并不意味着你可以使用该类型所有成员简名,而只能使用类型自身简名。...即什么属性或者方法使用必须依附于什么东西,例如使用或接口作为挂靠单位才行(里可以挂靠各种成员,而接口里则只能挂靠常量)。...这个方法可以工作。但是,因为这样一来,就可以从“一个实现了哪个接口”推断出“这个需要使用哪些常量”,有“会暴露实现细节”问题。

26850

深入理解Golang泛型

泛型允许程序员强类型程序设计语言中编写代码时使用一些以后才指定类型,实例化时作为参数指明这些类型。...方法2:使用了反射,性能会有影响 1.3 Golang新特性 如果不想增加一个新功能逻辑一模一样函数,同时也不想使用有性能问题反射的话。就可以使用到泛型新特性。...约束可比类型 Go1.18 内置了一个类型约束 comparable约束,comparable约束类型集是所有可比较类型集合。允许使用该类型参数==!=值。...**keyName**追加不是字符串而是数字,是否会报错?...和上面一样,这里不光*认为是乘号,| 还会被认为是按位或操作 type NewType2[T *int|*float64] []T 为了避免这种误解,解决办法就是给类型约束包上 interface

1.2K80
领券