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

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

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

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

    开心档之C# 匿名方法我们已经提到过,委托是用于引用与其具有相同标签的方法。换句话说,您可以使用委托对象调用可由委托引用的方法。 匿名方法(Anonymou

    C# 匿名方法我们已经提到过,委托是用于引用与其具有相同标签的方法。换句话说,您可以使用委托对象调用可由委托引用的方法。...匿名方法(Anonymous methods) 提供了一种传递代码块作为委托参数的技术。匿名方法是没有名称只有主体的方法。...在匿名方法中您不需要指定返回类型,它是从方法主体内的 return 语句推断的。图片编写匿名方法的语法匿名方法是通过使用 delegate 关键字创建委托实例来声明的。...Console.WriteLine("Anonymous Method: {0}", x);};代码块 Console.WriteLine("Anonymous Method: {0}", x); 是匿名方法的主体...委托可以通过匿名方法调用,也可以通过命名方法调用,即,通过向委托对象传递方法参数。注意: 匿名方法的主体后面需要一个 ;。

    82620

    Java核心技术 卷I 基础知识 学习笔记(4)

    参考:Java核心技术 卷I 基础知识 一个对象变量可以指示多种实际类型的现象被称为多态。在运行时能够自动地选择调用哪个方法的现象被称为动态绑定。...(3)如果是private、static、final方法或者构造器,那么编译器可以准确地知道应该调用哪个方法,将这种调用方式称为静态绑定。...虚拟机中的即使编译器比传统编译器的处理能力强得多。这种编译器可以准确地知道类之间的继承关系,并能够检测出类中是否真正地存在覆盖给定的方法。...一种是在抽象类中定义部分抽象类方法或不定义抽象类方法,这样就必须将子类也标记为抽象类,另一种是定义全部的抽象方法,这样一来,子类就不是抽象的了。 类即使不包含抽象方法,也可以将类声明为抽象类。...需要注意的是,可以定义一个抽象类的对象变量,但是它只能引用非抽象子类的对象。 在子类中定义equals方法时,首先调用超类的equals。

    51840

    spring-aop 之 aop:config

    结构图里面的aspectName来自于aop:aspect的ref属性,此属性是必须配置的,因为Spring要知道aop:before等标签指定的方法是哪个bean/类/对象的方法。...检测结果缓存 因为postProcessBeforeInstantiation方法会在每个bean初始化之前被调用,所以没有必要每次都真的进行基础类检测和跳过类检测,Spring使用了advisedBeans...TargetSource 从源码中可以看出,对于自定义的TargetSource,Spring会立即执行代理子类的创建。...从源码中可以看出,如果ClassFilter匹配得到满足并且Pointcut并不能匹配此类的任意方法,便会用反射的方法获取targetClass(被检测类)的全部方法逐一交由Pointcut的MethodMatcher...equals & hashCode 如果被代理类实现了equals或者是hashCode方法,那么生成的代理子类的equals、hashCode方法实际上执行的是JdkDynamicAopProxy相应方法的逻辑

    1.3K50

    Java学习笔记【持续更新】

    当前对象 this就是所在函数所属对象的引用 简单说:哪个对象调用了this所在的函数,this就代表哪个对象 static的特点: 1.static是一种修饰符,用于修饰成员 2.static修饰的成员被所有的对象所共有...就参考一点,就是该函数功能是否有访问到对象中的特有数据 简单点说,从源代码看该功能是否需要访问非静态的成员变量,如果需要,该功能就是非静态的 如果不需要,就可以将该功能定义成静态的,当然也可以定义成非静态的...就在子类的构造函数中加入了super()语句 如果父类中没有定义空参数构造函数,那么子类的构造函数必须用super来明确要调用父类中哪个构造函数,同时子类构造函数中如果使用this调用了本类构造函数时,...作为了解 2.成员函数: 编译时,参考引用型变量所属的类中是否有调用的函数,有,编译通过,没有,编译失败 运行时,参考的是对象所属的类中是否有调用的函数 简单说,编译看左边,运行看右边 3.静态函数:...编译时,参考引用型变量所属的类中是否有调用的静态方法 运行时,参考引用型变量所属的类中是否有调用的静态方法 简单说,,编译和运行都看左边 其实对于静态方法,是不需要对象的,直接用类名调用即可 内部类访问特点

    1.3K50

    Java基础系列(十七):Object类(上)

    如果一个类继承自Object类,我们可以将 extendsObject给省略掉,如果在一个类的定义中没有明确的指出哪个是它的父类,那么Object类就认为是这个类的父类。...,具体是用C(C++)在DLL中实现的,然后通过JNI调用。...equals方法 Object类中的equals方法用于检测一个对象是否等于另一个对象。在Object类中,这个方法将判断两个对象是否具有相同的引用。如果两个对象具有相同的引用,它们一定是相等的。...因为计算这个等式要比一个一个地比较类中的域所付出的代价小得多。 3) 检测otherObject是否为null,如果为null,返回false。这项检测是很有必要的。...所以,如果在子类中重新定义equals,就要在其中包含调用 super.equals(other)。 提示:对于数组类型的域,可以使用静态的Arrays.equals方法检测相应的数组元素是否想等。

    38730

    Java核心技术 继承

    并且,子类可以增加覆盖父类的域或方法,但不能删除继承的任何域和方法。 子类可以隐式的调用父类默认的构造方法。  如果父类没有默认构造方法,必须显示调用。...如果是private\static\final方法,那么编译器可以准确知道掉哦那个哪个方法,这种调用方式称为静态绑定。...3.虚拟机调用该方法。 阻止继承 有时候,不希望利用某个类定义子类。不允许扩展的类被称为final类。如果在定义类的时候利用了final修饰符就表明该类是final类。...equals方法: Object类中的equals方法用于检测一个对象是否等于另一个对象。在Object中,这个方法将判断两个对象是否具有相同的引用。然而,对大多数类来说,这种判断并没有什么意义。...equals方法时,首先调用父类的equals,如果检测失败,那就不相等,如果检测成功,则继续比较子类中的实例域: public class Manager extends Employee { . .

    53320

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

    5.返回类型可以相同,也可以不同,如果不同的话,子类重写后的方法返回类型必须是父类方法返回类型的子类型             例如:父类方法的返回类型是Person,子类重写后的返回类可以是Person...编译看左边的意思:java 编译器在编译的时候会检测引用类型中含有指定的成员,如果没有就会报错。子类的成员是特有的,父类的没有的,所以他是找不到的。     ...注:java中的方法调用,是运行时动态和对象绑定的,不到运行的时候,是不知道到底哪个方法被调用的。     ...调用重写的方法,在运行期间才能确定这个方法到底是哪个对象中的。...这个取决于调用方法的引用,在运行期间所指向的对象是谁,这个引用指向哪个对象那么调用的就是哪个对象中的方法。

    75661

    面向对象之封装和多态

    良好的封装,可进行数据完整性检测,保证数据的有效性。...一些只用于本类的辅助性方法可以用 private,希望其他类调用的方法用 public。...运行时类型(运行时,具体是哪个子类就是哪个子类) 为什么会有这俩种类型呢 在发生多态时,编译时看编译时类型,运行时看运行时类型。 ? 注:看代码里的注释,我结合代码分析了多态。 ?...对应上面那个代码的例子: ((Circle) shape).area(); 一个父类的引用类型变量可以“指向”其子类的对象。 一个父类的引用不可以访问其子类对象新增加的成员(属性和方法)。...可以使用 引用 变量 instanceof 类名 来判断该引用型变量所“指向”的对象是否属于该类或该类的子类。

    46010

    (三)组件治理之编译期检查

    这里有一个细节点,在方法 Code 中的字段与方法调用,在 owner 找不到的情况还要继续从他的父类与接口继续查找,因为调用的字段与方法有可能在父类。...,他们的包名在不同的 SDK 版本不一样,但他们在运行阶段会通过 SDK 版本来选择加载哪个类,所以,类似这类的 unsolved 是可以放过的,但前提是做好 review 3、检查 xml 中 class...: AbstractMethodError 异常主要是检测没有实现父类的抽象方法,起初以为这个检查挺简单的,但在一路思考之后发现,并没有那么简单,画个树状图大家就能看明白了: 实现类的父类可能是抽象类,...并且抽象类的父类可能也是抽象类,并且还带有接口,所以,就需要从前往后查找父类是否为抽象类,查到之后必须从后往前遍历,因为抽象类有可能把父类或是接口的抽象方法给实现,这样的话,子类就无需实现了,这种情况是不会发生...按道理,应该可以继续遍历接口的 innerClass 内部类,检查是否有 DefaultImpls 类,然后检查 DefaultImpls 的方法是否与接口方法签名一致,是的话,也算是实现了接口方法,目前这个部分的代码还在

    21730

    Python 面向对象-高阶-内置成员和魔术方法#学习猿地

    不会传递对象或者类进来 ``` ### 常用函数 ```python # 检测类和对象相关 # issubclass(子类,父类) # 检测一个类是否为另一个类的子类 # res = issubclass...(D,B) # isinstance(对象,类) # 检测一个对象是否是该类或该类的子类的实例化结果 # res = isinstance(d,A) # 操作类和对象成员相关 # hasattr(对象/...类,'成员名称')  检测类/对象是否包含指定名称的成员 # res = hasattr(d,'name') #getattr(对象/类,'成员名称') # 获取类/对象的成员的值 # res = getattr...res = dir(d) ``` ### 魔术方法 > 魔术方法就是不需要手动调用就可以自动执行的方法 ```python 1....    返回值:  必须有,并且必须是一个整型     注意事项:len要获取什么属性的值,就在返回值中返回哪个属性的长度即可 6.

    39910

    《深入理解Java虚拟机》笔记

    JVM确定目标方法的时候有两种方法: 静态分派:根据参数类型和方法名称来决定调用哪个方法。...不管多么复杂,这些都是在编译期间确定的,因为这里是向上找的。 动态分派:最普遍的就是Interface a = new Implements(),a调用方法到底应该是哪个类的在编译期间是无法确定的。...虚拟机优化动态分派的效率一般是为类在方法区中建立一个虚方法表: 虚方法表中存放各个方法实际入口地址,如果某个方法在子类中没有被重写,那么子类的虚方法表里面的地址入口和父类相同方法的地址入口是一致的,都指向父类的实现入口...当这个方法再次被调用时,会先检查改方法是否存在被JIT编译过的版本,如果存在则优先使用编译后的本地代码。...Thread的start方法先行于线程的任何一个动作; 线程的所有动作都先行于线程的终止检测; 对线程interrupt方法的调用先行于被中断线程的代码检测到的中断事件的发生; 对象的初始化完成先行于finalize

    36210

    Python 面向对象-高阶-内置成员和魔术方法#学习猿地

    不会传递对象或者类进来 ``` ### 常用函数 ```python # 检测类和对象相关 # issubclass(子类,父类) # 检测一个类是否为另一个类的子类 # res = issubclass...(D,B) # isinstance(对象,类) # 检测一个对象是否是该类或该类的子类的实例化结果 # res = isinstance(d,A) # 操作类和对象成员相关 # hasattr(对象/...类,'成员名称') 检测类/对象是否包含指定名称的成员 # res = hasattr(d,'name') #getattr(对象/类,'成员名称') # 获取类/对象的成员的值 # res = getattr...res = dir(d) ``` ### 魔术方法 > 魔术方法就是不需要手动调用就可以自动执行的方法 ```python 1....返回值: 必须有,并且必须是一个整型 注意事项:len要获取什么属性的值,就在返回值中返回哪个属性的长度即可 6.

    32010

    java集合源码分析(二):List与AbstractList

    无参的 listIterator()用于获取迭代器,而有参的 listIterator()可以传入下标,从集合的指定位置开始获取迭代器。指定的索引指示首次调用next将返回的第一个元素。...这是个多态方法,可以选择是否从指定下标开始,默认从下标为0的元素开始迭代; 视图类 SubList 和 RandomAccessSubList: subList():获取视图类,会自动根据实现类是否继承...至于lastRet这个成员变量只是用于记录最近一次操作的节点是哪个,跟方向性是无关。...考虑到 equals()情况特殊,所以我们也认为它是一个重写的方法。 我们可以先看看 JavaDoc 是怎么说的: 比较指定对象与此列表是否相等。...,以及反向迭代的相关方法,并且可以从指定的位置开始创建迭代器。

    34920
    领券