`

类初始化陷阱(续)

    博客分类:
  • 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
分享到:
评论

相关推荐

    JavaSE024static与final使用陷阱续..pdf

    在类中声明的`final`成员变量必须在声明时或构造方法中被初始化。这是因为在Java中,`final`变量一旦被赋值,就不能再改变。以下是一些关于`final`变量使用的规则: 1. **声明时赋值**:可以直接在声明`final`变量...

    SU20-中级Python

    项目包括各种游戏:太空侵略者,乒乓球,陷阱,包括: 创建自定义模块,类和方法使用实时数据来修改行为密码保护高分课程细目:向类添加对象将类特征添加为函数函数调用函数初始化对象课堂练习/挑战: 创建一个程序...

    高质量C++编程指南

    - **构造函数的初始化表**:介绍构造函数初始化表的使用方法,提高对象创建过程的安全性和效率。 - **构造和析构的次序**:说明构造和析构过程中的对象成员初始化和销毁的顺序。 - **拷贝构造函数与赋值函数的重要性...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第二阶段47讲、ClassLoader初始化阶段详细介绍clinit.mp4 │ 高并发编程第二阶段48讲、JVM内置三大类加载器的详细介绍.mp4 │ 高并发编程第二阶段49讲、自定义类加载器ClassLoader顺便问候了一下...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第二阶段47讲、ClassLoader初始化阶段详细介绍clinit.mp4 │ 高并发编程第二阶段48讲、JVM内置三大类加载器的详细介绍.mp4 │ 高并发编程第二阶段49讲、自定义类加载器ClassLoader顺便问候了一下...

Global site tag (gtag.js) - Google Analytics