package extend;

public class X {
 Y y=new Y();
 static{
  System.out.println("tttt");
 }
 X(){
  System.out.println("X");
 }
 
 public static void main(String[] args) {
    new Z();

}
}

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

class Z extends X{
 Y y=new Y();
 static{
  System.out.println("tt");
 }
 Z(){
  System.out.println("Z");
 } 
}

先不告诉最后结果,我们先来分析下。一步一步推出结果。

1.首先分析一段程序的执行后的结果,我们得先找到程序的入口,然后才能着手分析。

也就是main()方法。

2.我们发现main()方法在X类中,要执行main()方法,还得先将X类加载到内存中。

3.X类加载完成后,会做什么事情呢?别急,先来看看static的作用,不知道吧。告诉你:static就是在类被第一次加载的时候执行,以后就不再执行。

4.知道了static的作用,那么X类被加载,那么就会先执行X类的静态属性和静态语句块(static),执行先后顺序看谁在前面就先执行谁。只在此时执行,以后都不会。

5.所以一个输出结果为tttt,没问题了吧。

6.X类的static语句块执行完了,就该执行main()方法啦。

7.new Z();此方法被执行。

8.既然new Z();那么Z类就要被加载。因为Z类继承X类。所以必须先加载X类才行。因为X类已经被加载。所以此时不用再加载X类了。Z类加载好了就要执行Z类的static语句块

9.那么就会打印出tt了吧。

10.都加在完后就要实例化对象了。

11.实例化Z之前,还得先实例化X对吧。因为子类的构造方法都会调用父类的构造方法。

12.那就先实例化X类吧。

13.执行X方法前还得先初始化对不。也就是获取所有属性。那么X类的属性Y就会获取。

14.即X类的Y y=new Y();要被执行。也就是会打印Y。

15.接着执行System.out.println("X");
16.然后就是执行Z的构造方法

17.同样先获取Z的属性Y y=new Y();打印Y。

18.再执行System.out.println("Z");

整个过程就是这样了。现在知道结果了吧:

tttt
tt
Y
X
Y
Z

Java中的继承与静态static等的执行先后顺序的更多相关文章

  1. java中的继承与oc中的继承的区别

    为什么要使用继承? 继承的好处: (1)抽取出了重复的代码,使代码更加灵活 (2)建立了类和类之间的联系 继承的缺点: 耦合性太强 OC中的继承 1.OC中不允许子类和父类拥有相同名称的成员变量名:( ...

  2. Java中的继承、封装、多态的理解

    Java中的继承.封装.多态 继承的理解: 1.继承是面向对象的三大特征之一,也是实现代码复用的重要手段.Java的继承具有单继承的特点,每个子类只有一个直接父类. 2.Java的继承通过extend ...

  3. java中子类继承父类程序执行顺序

    java中子类继承父类程序执行顺序 FatherTest.java public class FatherTest { private String name; public FatherTest() ...

  4. <Java中的继承和组合之间的联系和区别>

    //Java中的继承和组合之间的联系和区别 //本例是继承 class Animal { private void beat() { System.out.println("心胀跳动...& ...

  5. 关于java中的继承

    我们都知道Java中的继承是复用代码.扩展子类的一种方式,继承使得Java中重复的代码能够被提取出来供子类共用,对于Java程序的性能以及修改和扩展有很大的意义,所以这是一个非常重要的知识点. 那么对 ...

  6. 浅析 Java 中的继承和重写

    浅析 Java 中的继承和重写 Java 中的构造方法不能被继承. Java 中 static 修饰的方法可以被继承,但不能被子类重写. Java 中 final 修饰方法不允许被子类重写,但是可以被 ...

  7. java中的继承 和多态。

    package com.aaa.zxf.ajax.test; /** *一. java 中的继承和多态. * * 继承的特性? * 1.实现继承的方式 * A 如何建立继承关系(一个类继承于 另一个类 ...

  8. 关于Java中的继承和组合的一个错误使用的例子

    [TOC] 关于Java中的继承和组合的一个错误使用的例子 相信绝大多数人都比较熟悉Java中的「继承」和「组合」这两个东西,本篇文章就主要就这两个话题谈论一下.如果我某些地方写的不对,或者比较幼稚, ...

  9. Java中的继承

    我们在以前的学习中,我们会了C#中的继承,今天我们来了解了解Java中的继承,其实都大同小异啦! 1.语法 修饰符 SubClass extends SuperClass(){ //类定义部分 } e ...

随机推荐

  1. flash开发几个问题

    1.跨域请求xml或txt 问题,使用URLLoader,不能跨域使用 2.js和swf交互问题,尽量使用swfobject.js动态创建

  2. ubuntu用apt安装apache2时,出现E:未发现软件包 apache2

    解决方法:使用sudo apt-get update更新软件包 更新软件包失败,多半使用因为源文件不干净,在/etc/apt下重新自己新写一份源文件 然后执行 sudo apt-get update

  3. 新博客地址: kuangbin.org

    RT. 买了新域名,原来的kuangbin.net已经废了,数据已经移动到了kuangbin.org

  4. Oracle中的sql操作符 和分析函数

    Oracle中的操作符算术操作符:无论是在sqlserver,或者是java中,每种语言它都有算术操作符,大同小异. Oracle中算术操作符(+)(-)(*)(/) 值得注意的是:/ 在oracle ...

  5. H5表单中placeholder属性的字体颜色问题

    最近做项目的时候遇到的一些小样式问题,有关表单.并且在接下来几天的面试人中五个人都没有回答上来,改变placeholder属性的默认字体颜色,感觉有必要总结一下. 如何改变默认字体的颜色? @blue ...

  6. MVC 微信扫码支付

    微信扫码支付有两种模式, 模式一和模式二, 两者具体的区别可参考官网文档:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_4 微 ...

  7. EasyUI中Treegrid节点的删除

    // 删除function removes() {    var rows = ruletreegrid.treegrid('getSelections');    if (rows &&am ...

  8. java多线程详解(7)-线程池的使用

    在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, 这样频繁创建线程就会大大降低系 ...

  9. KinectV2+Ubuntu 14.04+Ros 安装教程

    前言 个人理解错误的地方还请不吝赐教,转载请标明出处,内容如有改动更新,请看原博:http://www.cnblogs.com/hitcm/ 如有任何问题,feel free to contact m ...

  10. Android 动画详解

    这次主要就介绍android动画,android动画目前分为三种形式,Tween Animation 这个只能应用于view对象上面的,Drawable Animation这个是帧动画,就是类似我们有 ...