类的初始化顺序

使用一个简单的父子类例子来做示范,代码执行顺序在代码后有标注。

class Parent {

    public static String p_StaticField = "父类-静态变量";

    public String    p_Field = "父类-变量";
protected int i = 9;
protected int j = 0; static {
System.out.println( p_StaticField ); // 1.
System.out.println( "父类-静态初始化块" ); //2.
} {
System.out.println( p_Field ); // 7.
System.out.println( "父类-初始化块" ); // 8.
} public Parent()
{
System.out.println( "父类-构造器" ); // 9.
System.out.println( "i=" + i + ", j=" + j ); // 10.
j = 20;
}
} public class SubClass extends Parent { public static String s_StaticField = "子类-静态变量"; public String s_Field = "子类-变量"; static {
System.out.println( s_StaticField ); // 3.
System.out.println( "子类-静态初始化块" ); // 4.
} {
System.out.println( s_Field ); // 11.
System.out.println( "子类-初始化块" ); // 12.
} public SubClass()
{
System.out.println( "子类-构造器" ); // 13.
System.out.println( "i=" + i + ",j=" + j ); //14.
} public static void main( String[] args )
{
System.out.println( "子类main方法" ); // 5.
new SubClass(); // 6.
}
}
  • 静态初始化块位于类的第一次初始化最前端执行,先父类后子类,是类的初始化块。
  • 初始化块位于每次对象被构造器初始化前执行,是对象的初始化块。
  • 类的装载不论是否会被创建对象都会发生,装载会触发静态初始化块执行,扫描到了extends的类先被执行,构造时顺序相同
  • 总体顺序:new 子类() -> 父类静态初始化块 -> 子类静态初始化块 -> 子类main方法 -> 父类初始化块 -> 父类构造器 -> 子类初始化块 -> 子类构造器

继承关系方法执行顺序以及this作用域

public class ClassInitSequence {

    public static void main(String[] args) {
System.out.println(new B().getValue());
} static class A {
protected int value; public A(int v) {
setValue(v); // 若A的构造函数是子函数调用的则执行函数会先在子类里找同名函数执行
} public void setValue(int value) {
this.value = value;
} public int getValue() {
try {
value++;
return value;
} catch (Exception e) {
System.out.println(e.toString());
} finally {
this.setValue(value); // 若此方法起初为子类调用则this指向子类作用域
System.out.println(value);
}
return value;
}
} static class B extends A {
public B() {
super(5);
setValue(getValue() - 3);
} public void setValue(int value) {
super.setValue(2 * value);
}
}
}
  1. 子类方法调用父类方法,若父类方法调用方法,会先检查子类是否有重写的方法,先执行子类的重写方法
  2. 子类方法调用父类方法,this指向的作用域依然在子类
  3. try、catch、finally块中return后没有报错会继续执行finally块内代码而非直接返回,但此时函数返回值已为return的值
// 结果为
22
34
17

Java学习笔记 - 类方法与代码块的执行顺序的更多相关文章

  1. 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁

    什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...

  2. 0023 Java学习笔记-面向对象-初始化代码块

    初始化代码块 在18篇-类的基本要素中说到,类的三大成员:成员变量.构造方法.方法,初始化代码块是类的第4个成员 初始化块用于对类或者对象的初始化, 一个类的初始化块可以有0-多个,按先后顺序执行 跟 ...

  3. 《Java编程思想》学习笔记(二)——类加载及执行顺序

    <Java编程思想>学习笔记(二)--类加载及执行顺序 (这是很久之前写的,保存在印象笔记上,今天写在博客上.) 今天看Java编程思想,看到这样一道代码 //: OrderOfIniti ...

  4. Java 中(静态)变量、(静态)代码块的执行顺序

    Java 中(静态)变量.(静态)代码块的执行顺序 非原创 本文讨论 Java 中(静态)变量.(静态)代码块的执行顺序 首先创建 3 个类 1.Foo 类 public class Foo { pu ...

  5. Java(静态)变量和(静态)代码块的执行顺序

    本文讨论Java中(静态)变量.(静态)代码块的执行顺序 首先创建3个类: 1.Foo类,用于打印变量 public class Foo { public Foo(String word) { Sys ...

  6. 【JAVA】笔记(3)---封装;如何选择声明静态变量还是实例变量;如何选择声明静态方法还是实例方法;静态代码块与实例代码块的执行顺序与用途;

    封装: 1.目的:保证对象中的实例变量无法随意修改/访问,只能通过我们自己设定的入口,出口(set / get)来间接操作:屏蔽类中复杂的结构,使我们程序员在主方法中关联对象写代码时,思路/代码格式更 ...

  7. 夯实Java基础系列7:一文读懂Java 代码块和执行顺序

    目录 Java中的构造方法 构造方法简介 构造方法实例 例 1 例 2 Java中的几种构造方法详解 普通构造方法 默认构造方法 重载构造方法 java子类构造方法调用父类构造方法 Java中的代码块 ...

  8. 夯实Java基础系列7:Java 代码块和执行顺序

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  9. Java:构造器,构造代码块,静态代码块的执行顺序

    1.构造器:与类同名且没有返回值,用来初始化类属性: 构造器又分为无参构造器和有参构造器 1.1:无参构造器 public class Contruction{ ...属性... public Con ...

随机推荐

  1. winform的datagridview控件滚动更新数据

    范例源码下载地址:http://files.cnblogs.com/files/luoxiaozhao/PrintDemo.rar

  2. <数据分析>初级入门

    1.何为数据分析? 数据分析是指用适当的统计方法对收集来的大量数据进行分析,将它们加以汇总和理解消化,以求最大化地开发数据的功能,发挥数据的作用. 直接的理解:提炼杂乱无章的数据背后的信息,总结出研究 ...

  3. POJ 1584 /// 判断圆(点)在多边形内 判断凸包

    题目大意: 给定n,n边形 给定圆钉的 半径r 和圆心(x,y) 接下来n行是n边形的n个顶点(顺时针或逆时针给出) 判断n边形是否为凸包 若不是输出 HOLE IS ILL-FORMED 判断圆心和 ...

  4. 滑雪 矩阵中的最长上升路径 /// 记忆化DFS || DP oj22919

    大致题意: Description 难怪Michael喜欢滑雪,因为滑雪确实很刺激.为了获得加速度,滑雪道必须向下倾斜,而且当滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道在一 ...

  5. 2019 Multi-University Training Contest 6 Snowy Smile (最大字段和变形)

    题意: 求一个子矩阵要求其矩阵内的合最大. 题解: 正常的求最大子矩阵的复杂度是O(n^3) 对于这一题说复杂度过不去,注意到这个题总共只有2000个点关键点在与这里优化 最大子矩阵可以压缩矩阵变成最 ...

  6. java关于lombok(包括父类参数)

    java关于lombok对bean对象进行自动设置 使用说明 使用方式 注释类型 @NonNull @Data(常用) @NoArgsConstructor(常用)/@RequiredArgsCons ...

  7. 拦截器(Interceptor)与过滤器(Filter)的区别

    转自:https://www.jianshu.com/p/cf088baa9b04 过滤器,是在java web中将你传入的request.response提前过滤掉一些信息,或者提前设置一些参数.然 ...

  8. StringUtils工具

    ppublic class StringUtils { private StringUtils() { } /** * 文本左边补零 * * @param maxLength 文本长度 * @para ...

  9. 2018-8-10-win10-uwp-使用资源在后台创建控件

    title author date CreateTime categories win10 uwp 使用资源在后台创建控件 lindexi 2018-08-10 19:17:19 +0800 2018 ...

  10. 廖雪峰Java13网络编程-2Email编程-1发送email

    1.邮件发送 1.1传统邮件发送: 传统的邮件是通过邮局投递,从一个邮局到另一个邮局,最终到达用户的邮箱. 1.2电子邮件发送: 与传统邮件类似,它是从用户电脑的邮件软件(如outlook)发送到邮件 ...