`

类初始化陷阱(续)

    博客分类:
  • java
阅读更多

 对于前一篇文章http://sunflowers.iteye.com/blog/256318 认识不足,特写词文章纠正

 

一,为了方便,我将Parent类和Child类放于同一java文件内,代码如下

package com.sunflower.lang;

public class Child extends Parent {

	public Child() {
		// 如果没有显式super()调用,java compiler会自动插入super()相关代码
		System.out.println("Child()构造执行...\n");
	}
	// /////////////////////测试注释方法,开始////////////////////////////////////////////////
	@Override
	public void parentMethod() {
		System.out.println("Child重载的parentMethod执行...\n");
		System.out.println("##当前类是" + this.getClass() + "\n");
	}

	// /////////////////////测试注释方法,开始////////////////////////////////////////////////

	public static void main(String[] args) {
		System.out.print("Child.class main method 执行...\n");
		new Child();
	}
}

class Parent {

	public Parent() {
		//默认,编译器会插入类似super()的方法
		System.out.println("Parent()构造执行...\n");
		
		System.out.println("猜猜下面调用的是谁的方法??Parent?\n");
		parentMethod();
		System.out.println("parentMethod调用完毕,你猜对了吗?是不是很奇怪啊?\n");
		System.out.println("Parent()构造执行结束...\n");
	}

	protected void parentMethod() {
		System.out.println("parent类中内ParentMethod执行...\n");
		System.out.println("当前类是" + this.getClass() + "\n");
		//此处调用父类里的私有方法
		System.out.println("ParentMethod 执行 Parent私有方法parentPrivateMethod...\n");
		
		parentPrivateMethod();
		
		System.out.println("parent类中内ParentMethod执行结束...\n");
	}
	
	//parent私有方法哦,打印结果是不是很吃惊啊
	private void parentPrivateMethod(){
		System.out.println("parentPrivateMethod执行开始...\n");
		System.out.println("当前类是" + this.getClass() + "\n");
		System.out.println("parentPrivateMethod执行结束...\n");
	}

}
 

二,问题,如果有兴趣,不要运行此代码,自己猜想一下

1)以上代码中,Parent()构造内的parentMethod方法,是执行的Parent内的方法还是子类重载的方法

2)System.out.println("当前类是" + this.getClass() + "\n");打印的是哪个类?如果把以下代码注释后,打印的是哪个类呢?

 


 // /////////////////////测试注释方法,开始////////////////////////////////////////////////
	@Override
	public void parentMethod() {
		System.out.println("child重载的parentMethod\n");
		System.out.println("##当前类是" + this.getClass() + "\n");
	}

 

 

3,产生这个结果的原因,自己是否了解呢?

 

答案本页最后

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

----------------------------------不用动脑筋的答案-----------------------------------------------------

 

问题一,打印结果

 

调用... Parent()构造

猜猜下面调用的是谁的方法??Parent?

child重载的parentMethod

##当前类是class com.sunflower.lang.Child

parentMethod调用完毕,你猜对了吗?是不是很奇怪啊?

调用... Child()构造

 

 

 

问题二,答案,无论注释与不住时打印的当前类始终为Child类

 

注释后打印结果

 

 

调用... Parent()构造

猜猜下面调用的是谁的方法??Parent?

parent类中内调用的

当前类是class com.sunflower.lang.Child

parentMethod调用完毕,你猜对了吗?是不是很奇怪啊?

调用... Child()构造

 

 

 

 

问题三,首先从main函数开始

 

main(){

 

       new Child();

}

在Child构造内,执行的顺序是这样的,

因为在构造起始位置未写this(参数列表)或super(参数列表);编译器会自动插入默认空super();

执行父类初始化方法的调用,这个super();产生的作用是类似this.superInit()方法,就是说使用当前类的this调用自己的方法superInit()初始化父类,这个superInit的执行结果是导致父类构造代码体的执行,与实例方法一样,父类构造,java 编译器都会隐式插入this变量,因为this.superInit的这个this是属于child,所以对于父类构造代码体而言,this变量指针代表的是child,代码体内parentMethod的调用者当然也是这个this,打印结果永远是这个Child类

但是当上面的标识为//////////////////测试注释//////////////////的部分,注释以后,打印结果便是执行了父类内的parentMethod方法

这是因为,Child类内没有parentMethod,Parent,Child又是继承关系,所以jvm会去父类里找是否有该方法,parentMethod,是Child隐含继承Parent的方法,是属于Child的方法

 

 

 

0
0
分享到:
评论

相关推荐

    类继承的初始化顺序类,继承的初始化顺序

    本文详细介绍了类继承中的初始化顺序问题,包括初始化的基本概念、初始化过程中的关键步骤以及如何正确处理基类和子类之间的构造函数调用。理解这些概念对于编写高效、可维护的面向对象程序至关重要。希望通过对这些...

    java面试题-类的初始化顺序.doc

    在面试中,面试官可能会通过这种类型的题目来评估应聘者对Java内存模型的理解,以及他们在编写代码时是否能考虑到这些初始化规则,从而避免潜在的陷阱。因此,掌握类的初始化顺序是每个Java开发者必备的知识点。

    C++全局变量初始化的一点总结

    动态初始化则涉及运行时的动作,比如需要函数调用或类构造函数的初始化。这些变量的初始化在main函数执行之前进行,但晚于静态初始化。这意味着如果一个全局变量依赖于其他全局变量的初始化结果,必须确保这些依赖的...

    SIN初始化_混沌初始化_matlab_混沌映射_种群初始化_sin映射初始化粒子群_

    标题中的“SIN初始化_混沌初始化”指的是使用正弦混沌映射对粒子群进行初始位置的设置。混沌系统具有高度的敏感性,使得初始条件的微小差异可能导致显著不同的结果,这为种群的多样性和探索性提供了可能。SIN映射是...

    Java类继承初始化顺序

    静态初始化块用于初始化类级别的静态变量,它们只在类加载时执行一次。 2. **成员变量初始化**:接下来,初始化父类的非静态成员变量,这是通过调用父类的构造器实现的。Java规定每个子类实例在构造之前必须先调用...

    C++构造函数初始化列表

    构造函数初始化列表是C++中一个非常重要的特性,它允许程序员在对象创建时直接对类中的成员进行初始化,而不是先分配内存再赋值,这在效率和安全性上都有显著优势。 #### 构造函数初始化列表的作用与语法 构造函数...

    深入java虚拟机(三)——类的生命周期(下)类的初始化1

    5. **初始化类的子类**。 6. **JVM启动时作为主类的类**。 例如,如果我们有一个`Singleton`类,其中包含静态变量和静态初始化代码块,如下所示: ```java class Singleton { private static Singleton singleton...

    Java静态初始化块和对象初始化块

    在Java编程语言中,初始化块是程序执行时用于初始化对象或类的重要机制。这里我们将深入探讨两种类型的初始化块:静态初始化块(Static Initializer Block)和对象初始化块(Instance Initializer Block)。这两种...

    详解Spring 中如何控制2个bean中的初始化顺序

    我们可以在业务层自己控制 A 和 B 的初始化顺序,在 A 中设置一个“是否初始化的”标记,B 初始化前检测 A 是否得以初始化,如果没有则调用 A 的初始化方法,所谓的 check-and-act。 这种方法的优点是可以做到 lazy...

    PCI设备BAR空间的初始化

    ### PCI设备BAR空间的初始化详解 #### 一、引言 在现代计算机系统中,PCI(Peripheral Component Interconnect,外围部件互连)总线是一种重要的高速扩展总线标准,广泛应用于连接各种硬件设备,如显卡、声卡、...

    类初始化和实例初始化1

    在Java编程语言中,类和实例的初始化是程序运行中的重要环节,对于理解和优化代码的执行效率至关重要。这里我们将深入探讨这两个概念。 首先,我们来看类的初始化过程,也称为类加载与初始化。当Java虚拟机(JVM)...

    C++类成员和数据成员初始化总结

    在C++编程中,类成员和数据成员的初始化是一个至关重要的概念,因为它直接影响到对象的创建和使用。这里我们将深入探讨这些知识点。 首先,当创建一个C++类的对象时,对象的构造过程遵循一定的顺序。这包括两步:1)...

    SpringBoot项目启动时实现调用一次初始化方法.docx

    通过以上介绍,我们可以根据项目的需求选择合适的初始化方式,`@PostConstruct`适合简单的初始化,`CommandLineRunner`适合多个初始化步骤并控制执行顺序,而启动类中的初始化方法则更灵活,但应避免过度使用。...

    CSS样式初始化commonInitialize.css

    在"commonInitialize.css"中,通常会包含以下几类初始化内容: 1. **重置默认样式**:这一步是为了消除浏览器之间的样式差异,如设置`*{margin:0;padding:0;}`,这将清空所有元素的内外边距,确保元素布局的一致性...

    C语言的各种初始化(基础类)

    C语言的各种初始化(基础类)C语言的各种初始化(基础类)C语言的各种初始化(基础类)C语言的各种初始化(基础类)

    LS-DYNA3D中的应力初始化_lsdyna_应力初始化_

    标题中的“应力初始化”是指在进行LS-DYNA3D模拟时,如何设定初始条件中的应力状态。在进行复杂的工程问题模拟时,正确设置初始应力对于获取准确的计算结果至关重要。 应力初始化通常涉及到以下几个关键知识点: 1...

    比赛工程2,初始化上行至10层;电梯PLC;好像是六部十层;;

    比赛工程2,初始化上行至10层;电梯PLC;好像是六部十层;;比赛工程2,初始化上行至10层;电梯PLC;好像是六部十层;;比赛工程2,初始化上行至10层;电梯PLC;好像是六部十层;;比赛工程2,初始化上行至10层;电梯PLC...

    Revit+外部工具+无法初始化附加模块“CollaborateDB”,因为程序集C:\Prog+无法初始化附加模块的解决方法

    Revit外部工具无法初始化附加模块的解决方法 大家在安装完Revit或者卸载后重装Revit时是否遇到外部工具无法初始化附加模块的问题,每次打开不停的弹出对话框,烦得要死。 无法初始化附加模块“CollaborateDB”,...

    c++ 基本知识--类定义、初始化、析构(曹阳).ppt

    C++ 基本知识 - 类定义、初始化、析构 本文将对 C++ 中的类定义、初始化和析构进行详细的阐述。 1.1 类的定义 在 C++ 中,类是一种新的数据类型,而对象是具有这种类型的变量。类就是对同类对象的属性和行为进行...

    java代码的初始化顺序demo

    它用于初始化类级别的静态变量。在`init`目录下的文件可能包含了不同静态初始化的示例。 3. **实例化阶段**: 当我们创建一个新的对象时,Java会进行实例初始化。首先,分配内存空间,然后调用构造函数。实例初始...

Global site tag (gtag.js) - Google Analytics