父子类的调用

packagecom.itheima.stu.exam;

classX{

Y b=newY();

X(){

System.out.println("X");

}

}

classY{

Y(){

System.out.println("Y");

}

}

publicclassZextendsX{

Y y=newY();

Z(){

super();

System.out.println("Z");

}

publicstaticvoidmain(String[]args){

newZ();

}

}

1.new Z();先要为Z开辟内存空间,创建属性Y y 此时y的值为null,

接着调用Z的构造方法,因为在构造方法内部有隐含的super(),所以先调用父类的

构造方法,因为父类中有属性Y b 初始时为null,所以先为b进行显示初始化,执行

new Y();此时调用Y的构造方法,打印Y

2.接着调用父类的构造方法X();输出X

上面说明父类:要先进行成员变量的显示初始化,在进行构造方法的初始化

3.为子类的成员变量y赋值,执行new Y();调用Y的构造方法,输出 Y

4.执行子类Z中调用super()语句后的语句,输出Z

所以答案为YXYZ

总结:不管是子类还是父类都要先执行成员变量的显示初始化,再执行构造方法初始化

=================================================================================

packagecom.itheima.stu.extend;

classFatherextendsObject{

publicFather(){

//super();

System.out.println("Father 的构造方法");

}

}

classSonextendsFather{

publicSon(){

super();//这是一条语句,如果不写,系统会默认加上,用来访问父类中的空参构造

System.out.println("Son 的构造方法");

}

}

publicclassDemo5_Extends{

publicstaticvoidmain(String[]args){

Sons=newSon();

}

}

随着知识难度加大,还请老师多费心基础差点的学生.

遇到稍微复杂点的问题后听起来还是有点吃力希望能够在讲的细一点

希望课间给我们一些,有功底的学员更多的解答些其它Java技术上的问题

以前没有基础,学到后面感觉吃力,班里学习能力也程差不齐,能多照顾一下基础薄弱的同学最

好了,当然自己也要多努力.

==================================================================================

packagecom.itheima.stu.exam;

/*

* 结果:Y1X1W1Z1

* */

classX1{

Y1 b=newY1();

X1(){

//System.out.println(this.getClass().getSimpleName()+"------------------");

System.out.println("X1");

}

static{

System.out.println("加载X1类");

}

}

classY1{

Y1(){

//System.out.println(this.getClass().getSimpleName()+"...............");

System.out.println("Y1");

}

}

classW1{

W1(){

//System.out.println(this.getClass().getSimpleName()+"...............");

System.out.println("W1");

}

}

publicclassZ1extendsX1{

W1 w1=newW1();

Z1(){

super();

System.out.println("Z1");

}

publicstaticvoidmain(String[]args){

newZ1();

}

static{

System.out.println("加载Z1类");

}

}

对上述代码通过debug的总结:

1.该代码保存的文件名为"Z1",我们编译时执行的是javac Z1.java,运行的是java Z1,

此时要加载Z1,但是发现Z1有父类X1,所以要先加载X1类,而X1类中有静态代码块,所以输出"加载X1类"

注意:类的加载是为以后的使用做准备的,并不是加载的时候就执行类中的所有内容,只有类中的静态代码块在加载的时候才被执行,而且只执行一次

2.父类X1加载完毕后要加载子类Z1,而子类Z1中也有静态代码块,所以要执行子类Z1的静态代码块,所以输出"加载Z1类"

3.父类和子类加载完毕后,找到Z1类中的main方法,然后main方法进栈内存要执行,而此时第一句话是new Z1();表示要创建子类的Z1对象,

此时不会先执行子类的成员变量赋值和构造代码块,而是先执行super();通知父类X1做初始化工作,而父类中如果有成员变量和构造代码块(它俩属于同一级别,按先后顺序执行)的话要先执行,

而这里有成员变量的初始化Y1 b = new Y1();所以要调用Y1的构造方法,输出"Y1",接着执行父类X1的构造方法输出"X1",此时父类初始化工作完成

4.给子类Z1的成员变量W1 w1 = new W1();初始化,执行new W1();所以调用W1的构造方法,输出"W1",接下来说明super执行完毕,执行super之后的语句输出"Z1"

==================================================================================

classW{

{

System.out.println("W的构造代码块......10");

}

static{

System.out.println("W的静态代码块......9");

}

W(){

System.out.println("W的空参构造函数....11");

}

}

classY{

{

System.out.println("Y的构造代码块.....4");

}

static{

System.out.println("Y的静态代码块.....3");

}

Y(){

System.out.println("Y的空参构造函数....5");

}

}

classX{

Y b=newY();

{

System.out.println("X的构造代码块.....6");

}

static{

System.out.println("X的静态代码块.....1");

}

X(){

System.out.println("X的空参构造函数....7");

}

}

publicclassZextendsX{

{

System.out.println("Z的构造代码块......8");

}

static{

System.out.println("Z的静态代码块......2");

}

Z(){

super();

System.out.println("Z的空参构造函数....12");

}

W w=newW();

publicstaticvoidmain(String[]args){

newZ();

}

}

关于上面的代码的运行流程:

1.此代码文件保存为"Z"(有main方法),而Z继承了X,所以首先加载X类,而在X类中有静态代码块,所以输出"X的静态代码块.....1"

2.加载类Z,因为Z中有静态代码块,所以输出"Z的静态代码块......2"

3.执行Z的空参构造函数中super()通知父类进行初始化操作,而在父类(X类)中有引用类型的成员变量、构造代码块(它们俩按照先后顺序执行)、构造方法

a.为X类中引用变量b执行初始化操作,b=new Y();此时要加载类Y

(1)加载类Y执行Y类中的静态代码块,所以输出"Y的静态代码块.....3"

(2)执行Y类中的构造代码块,所以输出"Y的构造代码块.....4"

(3)执行Y类中的空参构造函数,所以输出"Y的空参构造函数....5"

b.执行X类中的构造代码块,所以输出"X的构造代码块.....6"

c.执行X类中的构造函数,所以输出"X的空参构造函数....7"

4.父类初始化完毕(包括成员变量、构造代码块(它俩按照代码中的先后顺序执行)、构造函数)后,并不会直接执行super()后面的内容,而是要对子类Z按照上面的

顺序进行初始化(包括成员变量、构造代码块(它俩按照代码中的先后顺序执行)、构造函数)

a.子类X构造代码块在上面,所以先执行,输出"Z的构造代码块......8"

b.为Z类Z的成员变量w赋值w=new W(),所以要现加载W

(1)加载类W,执行其中的静态代码块,所以输出"W的静态代码块......9"

(2)创建W的对象,所以先执行W的构造代码块,输出"W的构造代码块......10"

(3)执行W的构造方法,所以输出"W的空参构造函数....11"

c.接着执行super()后面的内容,所以输出"Z的空参构造函数....12"

==================================================================================

案例:

classDemo5_Extends{

publicstaticvoidmain(String[]args){

Sons=newSon();

}

}

classFatherextendsObject{

A a=newA();

{

System.out.println("........6");

}

publicFather(){

super();

System.out.println("Father 的构造方法....7");

}

static{

System.out.println(".....1");

}

}

classSonextendsFather{

B b=newB();

{

System.out.println("..........11");

}

publicSon(){

super();

System.out.println("Son 的构造方法.....12");

}

static{

System.out.println(".....2");

}

}

classA{

static{

System.out.println("A.............3");

}

{

System.out.println("A构造代码块.........4");

}

publicA(){

System.out.println("A空参构造方法执行..........5");

}

}

classB{

static{

System.out.println("B.............8");

}

{

System.out.println("B构造代码块.........9");

}

publicB(){

System.out.println("B空参构造方法执行..........10");

}

}

1.加载class文件时,如果有继承关系,要先加载父类的class文件

2.子类初始化之前,要先完成父类的初始化

3.成员变量(引用型)的初始化和和构造代码块的初始化,谁在前谁先执行

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,013评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,205评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,370评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,168评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,153评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,954评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,271评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,916评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,382评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,877评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,989评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,624评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,209评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,199评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,418评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,401评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,700评论 2 345

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,581评论 18 399
  • SwiftDay011.MySwiftimport UIKitprintln("Hello Swift!")var...
    smile丽语阅读 3,826评论 0 6
  • 1 顺序语句 语句:使用分号分隔的代码称作为一个语句。 注意:没有写任何代码只是一个分号的时候,也是一条语句,...
    哈哈哎呦喂阅读 373评论 0 0
  • //Clojure入门教程: Clojure – Functional Programming for the J...
    葡萄喃喃呓语阅读 3,616评论 0 7
  • 从生下来的那一天你就知道你一生都在爬一座叫人生的大山这座山有无数条路线但只有一个终点无法回避的终点无法选择的终点令...
    冷榆阅读 198评论 9 11