对于前一篇文章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的方法
分享到:
相关推荐
类继承的初始化顺序类继承的初始化顺序类继承的初始化顺序类继承的初始化顺序
注意:本文所说的全局变量指的是 variables with static storage,措词来自 c++ 的语言标准文档。 什么时候初始化 ... static initialization: 静态初始化指的是用常量来对变量进行初始化,主要包括 zero init
混沌映射sin映射初始化种群,与标准pso求解sphere函数,精度更好
板初始化程序板初始化程序板初始化程序板初始化程序板初始化程序板初始化程序板初始化程序板初始化程序板初始化程序板初始化程序板初始化程序板初始化程序板初始化程序
vue初始化模板vue初始化模板vue初始化模板vue初始化模板vue初始化模板vue初始化模板vue初始化模板vue初始化模板vue初始化模板vue初始化模板vue初始化模板vue初始化模板vue初始化模板vue初始化模板vue初始化模板vue...
C语言的各种初始化(基础类)C语言的各种初始化(基础类)C语言的各种初始化(基础类)C语言的各种初始化(基础类)
主要介绍了C#中结构(struct)的部分初始化和完全初始化,通过实例分析了结构初始化中常见的错误及技巧,有助于加深对C#结构(struct)的认识,需要的朋友可以参考下
matlab初始化数组
java 数组初始化 详解 doc
Revit外部工具无法初始化附加模块的解决方法 大家在安装完Revit或者卸载后重装Revit时是否遇到外部工具无法初始化附加模块的问题,每次打开不停的弹出对话框,烦得要死。 无法初始化附加模块“CollaborateDB”,...
比赛工程2,初始化上行至10层;电梯PLC;好像是六部十层;;比赛工程2,初始化上行至10层;电梯PLC;好像是六部十层;;比赛工程2,初始化上行至10层;电梯PLC;好像是六部十层;;比赛工程2,初始化上行至10层;电梯PLC...
C++中,全局变量只能声明、初始化,而不能赋值 也就是说,下面这样是不被允许的: #include using namespace std; int a; a = 2; int main() { return 0; } 错误提示是: C++ requires a type specifier for all...
8251 端口初始化 包含定义13个输入端口和9个输出端口
cuda初始化代码cuda初始化代码cuda初始化代码cuda初始化代码cuda初始化代码cuda初始化代码cuda初始化代码cuda初始化代码cuda初始化代码
详细讲解java类中静态变量,普通标量,对象、基本类型的初始化顺序。
Nacos 2.1.2 数据库初始化脚本
fortran编写的logistic映射的混沌程序,用于一般智能优化算法的初始化种群。
对象初始化流程梳理对象初始化流程梳理对象初始化流程梳理对象初始化流程梳理对象初始化流程梳理对象初始化流程梳理对象初始化流程梳理对象初始化流程梳理
初始化样式文件,天哪,竟然要50字,CSS初始化是指重设浏览器的样式。不同的浏览器默认的样式可能不尽相同,所以开发时的第一件事可能就是如何把它们统一。如果没对CSS初始化往往会出现浏览器之间的页面差异。每次新...
对java类初始化以及顺序,详解,由于转载仅供大家参考!