2 li 13579 li li_13579_li 于 2017.01.12 08:12 提问

Java-继承:(如图)程序这样执行的顺序为什么是错误的

图片说明

3个回答

u010528826
u010528826   2017.01.12 11:29
已采纳

首先要知道构造方法执行时会首先隐式调用super(),然后隐式的将非静态成员变量进行初始化,最后才是执行构造块里面的代码。
由此分析上面代码。当你在main里面实例化Z的时候,发现Z extends X,所以会调用X的构造方法,实例化X。
实例化X的时候发现有非静态成员变量Y,则初始化Y,所以会调用Y的构造方法,实例化Y,则打印"Y",Y里面没其他东西所以所以没有其他输出,至此X里面的Y实例化完成。
然后继续实例化X,执行X构造方法里面的代码,则打印“X”,至此X实例化完成。
然后继续实例化Z,发现有非静态成员变量Y,则初始化Y,所以会调用Y的构造方法,实例化Y,则打印"Y",Y里面没其他东西所以所以没有其他输出,至此Z里面的Y实例化完成。
然后继续实例化Z,执行Z构造方法里面的代码,则打印“Z”,至此Z实例化完成。
所以你上面代码的打印应该是:YXYZ。说的有些啰嗦,将上面代码稍微改了下,验证上述过程:

 class X {
    Y y = new Y(1);

    X() {
        System.out.println("X");
    }

}

class Y {
    Y(int i) {
        System.out.println("Y" + i);
    }

}

class Z extends X {
    Y y = new Y(2);

    Z() {
        System.out.println("Z");
    }

    public static void main(String[] args) {
        new Z();
    }
}

输出结果:Y1 X Y2 Z

u010528826
u010528826 这篇博客将类加载过程和对象的创建过程总结了,你看看参考一下:http://blog.csdn.net/u014338577/article/details/49968253
一年多之前 回复
li_13579_li
li_13579_li 谢谢:这体现的知识点是:类的初始化过程:成员变量->构造函数->成员方法 吗?
一年多之前 回复
yy8093
yy8093   2017.01.12 09:04

X类里面的 Y b = new Y()也会执行

danielinbiti
danielinbiti   Ds   Rxr 2017.01.12 09:58
 成员变量在构造函数内部代码执行前初始化。也就是Y y = new Y()都比自身所在类的构造删除输出前执行。
 所在在按照父类构造函数先执行,子类构造函数后执行的时候,在每个构造函数执行时,把上面这点意外加进去就行了。
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Java学习之继承中的执行顺序详解
代码块(理解) (1)用{}括起来的代码。 (2)分类: A:局部代码块 用于限定变量的生命周期,及早释放,提高内存利用率。 B:构造代码块 把多个构造方法中相同的代码可以放到这里,每个构造方法执行前,首先执行构造代码块。 C:静态代码块 static{}对类的数据进行初始化,仅仅只执行一次。 (3)静态代码块,构造代码块,构造方法的顺序问题?
什么是顺序执行以及其特点
顺序执行是程序的一种执行方式。是把一个具有独立功能的程序独占处理机直至最终结束的过程称为程序的顺序执行 顺序执行的特点: 顺序性: 程序顺序执行时,其执行过程可看作一系列严格按程序规定的状态转移过程,也即是每执行一条指令,系统将从上一个执行状态转移到下一个执行状态,且上一条指令的执行结束是下一条指令执行开始的充分必要条件。 封闭性: 程序执行得到的最终
java中子类继承父类程序执行顺序
我们经常在项目中使用继承,但是往往不太明白,程序运行的顺序以及原理,尤其是使用上转型对象的时候,以及父类子类中都有static变量和方法时,不知道先运行谁。 下面是一个简单的继承,来查看代码的执行顺序: package test; class Person{ static{ System.out.println("父类的静态块"); } Person(){ Syste
java 子类继承父类运行顺序
java 子类继承父类运行顺序
继承--抽象类--接口--子类构造方法代码执行顺序
继承--抽象类--接口--子类构造方法代码执行顺序
子类继承父类时实例化子类的执行顺序
  一个类继承一个父类时,当实例化子类的时候,子类的初始化顺序是这样的:     1、如果子类中有字段,则先初始化子类的字段。     2、初始化基类,基类如果存在字段,则先初始化字段,再执行构造方法。     3、执行子类的构造方法。说白了就是: 先子类字段初始化 然后父类字段初始化 再执行父类构造函数 最后执行子类构造函数   例如以下的程序:using System;
java中子类继承父类程序执行顺序问题
Java中,new一个类的对象,类里面的静态代码块、非静态代码、无参构造方法、有参构造方法、类的一般方法等部分,它们的执行顺序相对来说比较简单,用程序也很容易验证。比如新建一个测试父类。 public class FatherTest { private String name; FatherTest(){ System.out.println("--父类的无
python中继承的作用以及多重继承的执行顺序
1.继承只会继承父类的方法,不能继承父类的变量 2.要想继承父类的变量,需要执行父类的__init__(self)方法 3.下划线开头的变量或方法,会被认为是受保护的,不能直接点出来,但如果强制打出来的话也一样能用,只是会有警告 4.静态方法中不能使用self,用@staticmethod声明这是一个静态方法 5.关于python中的getter和setter,比较规范的用法是class T
Java子类继承父类,构造方法的执行顺序问题
在Java中,子类实例化时会调用父类构造方法,子类父类方法中会有一个函数生成表,执行时实现动态链接,子类重写父类方法时执行顺序也是这样    对于执行父类构造方法的问题。可以归纳为两种情况 1,如果父类有无参构造方法,子类会默认调用此方法(除非super显示调用父类有参)为隐式调用。 2,在子类中使用super显示调用父类有参了,或者this调用自身其他构造方法,则调用父类有
Java继承时的构造函数(详细执行情况)3
在类的一般方法里都有默认:this 用于指向当前对象在构造函数中都有隐式的:super 用于指向父类构造函数:class 类名{类名(){super();对象的显式初始化}}在调用构造函数时,会先执行super  进入父类的构造函数初始化父类,再返回子类的构造函数,将子类的对象显示初始化class Fu{ int num=3; Fu(){//构造函数 System....