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

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

static void main(String[] args) { A a = new A(); B b = new B(); } } 问题:为什么创建A对象时候父类会调用子类方法...但是:创建B对象父类会调用父类方法? 答案: 当子类被加载到内存方法区后,会继续加载父类到内存。...如果,子类重写了父类方法子类方法引用会指向子类方法,否则子类方法引用会指向父类方法引用。 如果子类重载了父类方法,则子类重载方法引用还指向子类方法。...如果子类方法没有重写也没有重载父类方法,则方法引用会指向父类方法。 当子类对象创建时,会先行调用父类构造方法(构造方法也是方法),虚拟机会在子类方法区寻找该方法并运行。...但是:由于java语言是静态多分派,动态单分派。其结果是当编译时候,父类构造方法调用方法参数已经强制转换为符合父类方法参数了。 上边代码在编译前已经转换为下面这个样子了。

6.1K10

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

关于使用MethodHandle子类调用祖父类重写方法探究 注:这个例子原本出现在周志明先生《深入理解Java虚拟机》--虚拟机字节码执行引擎章节,介于有读者朋友有疑问,这里基于Java代码层面解释一下...这里直接看Son类thinking方法(关于为何这样实现,《深入理解Java虚拟机》读书笔记(七)--虚拟机字节码执行引擎(下)也解释了)。...由于找到thinking方法是非static,需要一个隐式入参(也就是栈帧中局部变量表第0个位置this参数),java这叫做该方法接收者。...普通方法调用,这个this参数是虚拟机自动处理,表示是当前实例对象,我们方法可以直接使用。...但是我们这个MethodHandle例子,相当于是模拟了invoke*指令处理,手动调用invoke方法就需要指定这个"this"参数。

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

Java为什么不同返回类型不算方法重载?

本文已收录《Java常见面试题》:https://gitee.com/mydb/interview 方法重载是指在同一个类,定义了多个同名方法,但每个方法参数类型或者是参数个数不同就是方法重载...方法签名是由:方法名称 + 参数类型 + 参数个数组成一个唯一值,这个唯一值就是方法签名,而 JVM(Java 虚拟机)就是通过这个方法签名来决定调用哪个方法。...从方法签名组成规则我们可以看出,方法返回类型不是方法签名组成部分,所以当同一个类中出现了多个方法名和参数相同,但返回值类型不同方法时,JVM 就没办法通过方法签名来判断到底要调用哪个方法了,如下图所示...方法重载使用场景 方法重载经典使用场景是 String 类型 valueOf 方法,valueOf 方法重载有 9 种实现,如下图所示: 它可以将数组、对象和基础数据类型转换成字符串类型...总结 同一个类定义了多个同名方法,但每个方法参数类型或者是参数个数不同就是方法重载。方法重载典型使用场景是 String valueOf 方法,它有 9 种实现。

3.3K10

Android NDK编程(五)--- CC++调用Java不同静态方法

前言 上一篇我们介绍了《Android NDK编程(四)--- C/C++调用Java方法》,主要是C/C++调用Java方法,这一篇我们针对上一篇内容再延伸说一下,关于调不同静态方法。...通过ALT+ENTERnative-lib.cpp增加了对应方法函数,然后写实现方法。 ? 最后再我们按钮事件里调用VaccaeJNI类静态方法 ? 运行结果 ?...上面来说我们从java调C/C++方法其实基本都差不多,下面我们重点要说一下C/C++调用java方法。 我们VaccaeJNI中加入一个native静态方法和一个本地静态方法。 ?...---- 调用不同方法 最后我们要说一下重点,因为我们方法时候可能会调用不同类里面的方法,导航native方法和要调用java方法不在同一个类里,遇到这样方法我们来看一看怎么实现...我们还是VaccaeJNI写一个非静态方法,两个数相乘 ? 然后调用native函数,我们直接写在Mainactivity.java ?

1.6K20

深入理解Java四种创建对象方式调用new语句创建对象调用对象clone()方法运用反射手段创建对象运用反序列化手段

调用new语句创建对象 调用对象clone()方法 运用反射手段创建对象 运用反序列化手段 调用new语句创建对象 // 使用java语言关键字 new 创建对象,初始化对象数据  ​MyObject...2.使用原型模式创建对象比直接 new 一个对象性能上要好的多,因为Object 类 clone 方法是一个本地方法,它直接操作内存二进制流,特别是复制大对象时,性能差别非常明显。... java ,只要给定类名字, 那么就可以通过反射机制来获得类所有信息。...反射实现方式 Java 实现反射最重要一步, 也是第一步就是获取 Class 对象, 得到Class 对象后可以通过该对象调用相应方法来获取该类属性、方法以及调用该类方法。...* 类似于此没有方法接口是标记接口 * * !!!每一次去修改该类时候都会生成一个新序列化标识值!,需要重新新,重新读,这是基本方法。 * 想办法来固定该类标识ID,人为设定。

2K10

实现一个JNI调用Java对象工具类,从此一行代码就搞定!

前言 我们知道jni执行一个java函数需要调用几行代码才行,如 jclass objClass = (*env).GetObjectClass(obj); jmethodID methodID...因为模版函数实际上是在编译时,根据调用类型,拷贝生成多个具体类型函数以便使用。 所以如果有这样调用callMethod(...)...而且这里用强转static_cast等方法都不行。 我考虑两种方法来解决这个问题,一种是保证编译不报错,因为运行时不会执行代码,只要通过编译就可以。另外一种是不同类型编译不同代码。...undefined reference to 使用模版函数出现这个问题,是因为没有将模版函数实现写在头文件,只将模版函数声明头文件,而在源文件实现。...总结 上面我们仅仅是实现了调用普通函数工具,根据这个思路我们还可以实现调用静态函数、获取成员变量、赋值成员变量等,这样当我们进行jni开发时候,如果需要对java对象或类进行操作,只需要一行代码就可以了

1.7K20

Java静态绑定与动态绑定

不同语言对后期绑定实现方法是有所区别的。但我们至少可以这样认为:它们都要在对象安插某些特殊类型信息。...Java动态绑定过程: 虚拟机提取对象实际类型方法表; 虚拟机搜索方法签名; 调用方法。...关于final,static,private和构造方法是静态绑定理解 private:对于private方法,首先一点它不能被继承,既然不能被继承那么就没办法通过它子类对象调用,而只能通过这个类自身对象调用...(这里意思是说如果父类里有一个static方法,它子类里如果没有对应方法,那么当子类对象调用这个方法时就会使用父类方法。而如果子类定义了相同方法,则会调用子类定义方法。...唯一不同就是,当子类对象上转型为父类对象时,不论子类有没有定义这个静态方法,该对象都会使用父类静态方法。因此这里说静态方法可以被隐藏而不能被覆盖。这与子类隐藏父类成员变量是一样

1.5K30

谈谈你对多态了解以及应用

Java多态代码体现在一个子类对象(实现类对象)既可以给这个子类(实现类对象)引用变量赋值,又可以给这个子类(实现类对象)父类(接口)变量赋值。 如Student类可以为Person类子类。...2、多态前提是必须有父类关系或者类实现接口关系,否则无法完成多态。 3、使用多态后父类引用变量调用方法时,会调用子类重写后方法。...调用方法时,调用为各个子类重写后方法。...(); //p2会调用Teacher类重写work方法 当变量名指向不同子类对象时,由于每个子类重写父类方法内容不同,所以会调用不同方法。...子类没有的情况下: ? 当父类中出现同名成员方法时,多态调用该变量时: 编译时期:参考引用变量所属类,如果类没有调用方法,编译失败。

40920

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

extends Person{}         Object类,提供了一些方法子类继承,那么就意味着,java,任何一个对象都可以调用这些被继承过来方法。...四、super关键字 子类继承父类之后,子类可以使用this来表示访问或调用子类属性或方法,使用super就表示访问或调用父类属性和方法。   ...即同一消息可以根据发送对象不同而采用多种不同行为方式。...注:java方法调用,是运行时动态和对象绑定,不到运行时候,是不知道到底哪个方法调用。     ...(java方法调用,是运行时动态和对象绑定)     8)多态注意事项 多态情况下,父类 和 子类存在同名成员变量,无论是静态还是非静态变量,默认访问是父类成员变量。

73061

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

概念:直接父类、间接父类 Java 父类概念是相对Java 中一个父类可以声明多个子类。...super 可用于子类构造器调用父类构造器 注意: 尤其当父类出现同名成员时,可以用 super 表明调用是父类成员 super 追溯不仅限于直接父类 super 和 this 用法相像...我们通过子类构造器创建对象时,一定在调用子类构造器过程,直接或间接调用到父类构造器。 也正因为调用过父类构造器,我们才会将父类声明属性或方法加载到内存,供子类对象使用。 ‍...5.1 多态形式和体现 ‍ 5.1.1 对象多态性: ‍ 多态性,是面向对象中最重要概念, Java 体现:**对象多态性:父类引用指向子类对象** 格式:(父类类型:指子类继承父类类型...但是由于声明为父类引用, 导致我们没有办法直接调用子类特有的属性和方法。 好处: 极大减少了代码冗余,不需要定义多个重载方法。 ‍

12910

java new一个对象过程中发生了什么

javanew一个对象时候,会先查看对象所属有没有被加载到内存,如果没有的话,就会先通过类全限定名来加载。加载并初始化类完成后,再进行对象创建工作。...1、加载 由类加载器负责根据一个类全限定名来读取此类二进制字节流到JVM内部,并存储在运行时内存区方法区,然后将其转换为一个与目标类型对应java.lang.Class对象实例 2、验证 格式验证...:验证是否符合class文件规范 语义验证:检查一个被标记为final类型是否包含子类;检查一个类final方法是否被子类进行重写;确保父类和子类之间没有不兼容一些方法声明(比如方法签名相同,但方法返回值不同...(得到类或者字段、方法在内存指针或者偏移量,以便直接调用方法),这个可以初始化之后再执行。...需要注意是,每个子类对象持有父类对象引用,可在内部通过super关键字来调用父类对象,但在外部不可访问 补充: 通过实例引用调用实例方法时候,先从方法对象实际类型信息找,找不到的话再去父类类型信息

2.6K21

java new一个对象过程中发生了什么

javanew一个对象时候,会先查看对象所属有没有被加载到内存,如果没有的话,就会先通过类全限定名来加载。加载并初始化类完成后,再进行对象创建工作。...1、加载      由类加载器负责根据一个类全限定名来读取此类二进制字节流到JVM内部,并存储在运行时内存区方法区,然后将其转换为一个与目标类型对应java.lang.Class对象实例 2、验证...,但方法返回值不同)操作验证:操作数栈数据必须进行正确操作,对常量池中各种符号引用执行验证(通常在解析阶段执行,检查是否可以通过符号引用描述全限定名定位到指定类型上,以及类成员信息访问修饰符是否允许访问等...(得到类或者字段、方法在内存指针或者偏移量,以便直接调用方法),这个可以初始化之后再执行。...补充: 通过实例引用调用实例方法时候,先从方法对象实际类型信息找,找不到的话再去父类类型信息找。

57320

Java:new一个对象过程中发生了什么?

来源:www.cnblogs.com/JackPn/p/9386182.html ---- javanew一个对象时候,会先查看对象所属有没有被加载到内存,如果没有的话,就会先通过类全限定名来加载...1、加载 由类加载器负责根据一个类全限定名来读取此类二进制字节流到JVM内部,并存储在运行时内存区方法区,然后将其转换为一个与目标类型对应java.lang.Class对象实例 2、验证 格式验证...:验证是否符合class文件规范 语义验证:检查一个被标记为final类型是否包含子类;检查一个类final方法是否被子类进行重写;确保父类和子类之间没有不兼容一些方法声明(比如方法签名相同,但方法返回值不同...(得到类或者字段、方法在内存指针或者偏移量,以便直接调用方法),这个可以初始化之后再执行。...需要注意是,每个子类对象持有父类对象引用,可在内部通过super关键字来调用父类对象,但在外部不可访问 补充: 通过实例引用调用实例方法时候,先从方法对象实际类型信息找,找不到的话再去父类类型信息

1K20

Java new一个对象过程中发生了什么?

作者:沉默哥 cnblogs.com/JackPn/p/9386182.html javanew一个对象时候,会先查看对象所属有没有被加载到内存,如果没有的话,就会先通过类全限定名来加载。...1、加载 由类加载器负责根据一个类全限定名来读取此类二进制字节流到JVM内部,并存储在运行时内存区方法区,然后将其转换为一个与目标类型对应java.lang.Class对象实例 2、验证 格式验证...:验证是否符合class文件规范 语义验证:检查一个被标记为final类型是否包含子类;检查一个类final方法是否被子类进行重写;确保父类和子类之间没有不兼容一些方法声明(比如方法签名相同,但方法返回值不同...(得到类或者字段、方法在内存指针或者偏移量,以便直接调用方法),这个可以初始化之后再执行。...需要注意是,每个子类对象持有父类对象引用,可在内部通过super关键字来调用父类对象,但在外部不可访问 补充: 通过实例引用调用实例方法时候,先从方法对象实际类型信息找,找不到的话再去父类类型信息

60910

Java】继承

代码如下: 父类中出现了同名成员变量时,子类需要访问父类中非私有成员变量时,需要使用 super 关键字,修饰 父类成员变量,类似于之前学过 this 。...使用格式: 子类方法需要修改,代码如下: 小贴士: Fu 类成员变量是非私有的,子类可以直接访问。若 Fu 类成员变量私有了, 类是不能 直接访问。...对象调用方法时,会先在子类 查找有没有对 应方法,若子类存在就会执行子类方法,若子类不存在就会执行父类相应方法。...代码如下: 重写应用 子类可以根据需要,定义特定于自己行为。既沿袭了父类功能名称,又根据子类需要重新实 现父类方法,从 而进行扩展增强。...代 码如下: 6. super和this 父类空间优先于子类对象产生 每次创建子类对象时,先初始化父类空间,再创建其子类对象本身。

78220

SpringBoot AOP 记录日志实例

而封装就要求将功能分散到不同对象中去,这在软件设计往往称为职责分配。 实际上也就是说,让不同类设计不同方法。这样代码就分散到一个个类中去了。这样做好处是降低了代码复杂程度,使类可重用。...但是,这样一来,这两个类跟我们上面提到独立类就有耦合了,它改变会影响这两个类。那么,有没有什么办法,能让我们需要时候,随意地加入代码呢?...实现AOP切面主要有以下几个要素: @Aspect: 将一个java类定义为切面类 @Pointcut:定义一个切入点(规则表达式) 根据需要在切入点不同位置切入内容 @Before:切入点开始处切入内容...类型Date在任何直接java,如java.util.Date和java.sql.Date java..* 任何在java包或者所有类型...Withincode:用于捕获构造器或者方法所有连接点,包括在其中本地类 执行对象连接点 匹配this,和target对象,作为方法调用对象

1.8K11

面试官:new一个对象有哪两个过程?

Javanew一个对象时候,会先查看对象所属有没有被加载到内存,如果没有的话,就会先通过类全限定名来加载。加载并初始化类完成后,再进行对象创建工作。...1、加载 由类加载器负责根据一个类全限定名来读取此类二进制字节流到JVM内部,并存储在运行时内存区方法区,然后将其转换为一个与目标类型对应java.lang.Class对象实例 2、验证 格式验证...但方法返回值不同) 操作验证:操作数栈数据必须进行正确操作,对常量池中各种符号引用执行验证(通常在解析阶段执行,检查是否可以通过符号引用描述全限定名定位到指定类型上,以及类成员信息访问修饰符是否允许访问等...(得到类或者字段、方法在内存指针或者偏移量,以便直接调用方法),这个可以初始化之后再执行。...需要注意是,每个子类对象持有父类对象引用,可在内部通过super关键字来调用父类对象,但在外部不可访问 补充: 通过实例引用调用实例方法时候,先从方法对象实际类型信息找,找不到的话再去父类类型信息

1.9K31
领券