【基础】java类的各种成员初始化顺序
父子类继承时的静态代码块,普通代码块,静态方法,构造方法,等先后顺序
前言:
普通代码块:
在方法或语句中出现的{}就称为普通代码块。
普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--“先出现先执行”
静态代码块:
在java中使用static关键字声明的代码块。
静态块用于初始化类,为类的属性初始化。每个静态代码块只会执行一次。
由于JVM在加载类时会执行静态代码块,所以静态代码块先于主方法执行。
如果类中包含多个静态代码块,那么将按照"先定义的代码先执行,后定义的代码后执行"。
注意:
1 静态代码块不能存在于任何方法体内。
2 静态代码块不能直接访问静态实例变量和实例方法,需要通过类的实例对象来访问。
构造代码块:
直接在类中定义且没有加static关键字的代码块称为{}构造代码块。
构造代码块在创建对象时被调用,每次创建对象都会被调用,并且构造代码块的执行次序优先于类构造函数。
一、Class B extends A,然后A类也就是父类里面有静态代码块,普通代码块,静态方法,静态成员变量,普通成员变量,普通方法。
子类也是这样,然后继承之后,根据打印结果观察java类的各种成员的初始化顺序。
1.父类【静态成员】和【静态代码块】,按在代码中出现的顺序依次执行。
2.子类【静态成员】和【静态代码块】,按在代码中出现的顺序依次执行。
3.父类的【普通成员变量被普通成员方法赋值】和【普通代码块】,按在代码中出现的顺序依次执行。
4.执行父类的构造方法。
5.子类的【普通成员变量被普通成员方法赋值】和【普通代码块】,按在代码中出现的顺序依次执行。
6.执行子类的构造方法。
父类:
package com.slp.ClassInitTest; /**
* 父类
* <p>
* Created by slp on 2018/6/1
*/
public class Parent {
static {
System.out.println("父类:静态代码块");
} {
System.out.println("父类:普通代码块");
} private static String staticStringInParent = initStaticStringInParent(); private String stringInParent = initStringInParent(); public Parent() {
System.out.println("父类:构造方法");
} private static String initStaticStringInParent() {
System.out.println("父类:静态方法,被静态成员变量赋值调用。");
return "initStaticStringInParent";
}
private String initStringInParent() {
System.out.println("父类:普通成员方法,被普通成员变量赋值调用。");
return "initStringInParent";
} }
子类:
package com.slp.ClassInitTest; /**
* 子类
* <p>
* Created by slp on 2018/6/1
*/
public class Child extends Parent { private String stringInChild = initStringInChild();
private static String staticStringInChild = initStaticStringInChild(); {
System.out.println("子类:普通代码块");
} static {
System.out.println("子类:静态代码块");
} public Child() {
System.out.println("子类:构造方法");
} private static String initStaticStringInChild() {
System.out.println("子类:静态方法,被静态成员变量赋值调用。");
return "initStaticStringInChild";
} private String initStringInChild() {
System.out.println("子类:普通成员方法,被普通成员变量赋值调用。");
return "initStringInChild";
}
}
主方法:
package com.slp.ClassInitTest; /**
* 测试Java类的成员和初始化块(代码块)初始化顺序
* <p>
* Created by slp on 2018/6/1
*/
public class ClassInitTest {
public static void main(String[] args) {
System.out.println("测试代码开始");
new Child();
System.out.println("测试代码结束");
}
}
执行结果:
测试代码开始
父类:静态代码块
父类:静态方法,被静态成员变量赋值调用
子类:静态方法,被静态成员变量赋值调用
子类:静态代码块
父类:普通代码块
父类:普通成员方法,被普通成员变量赋值调用
父类:构造方法
子类:普通成员方法,被普通成员变量赋值使用
子类:普通代码块
子类:构造方法
测试代码结束
注:
1、静态代码块随着类的加载而加载 (堆内存中)
2、代码块在每次创建对象前加载执行
3、子类在其构造函数中实现对父类(构造函数)的初始化
4、先有父后有子(在运行时,父类先加载进内存,子类才能加载)
【基础】java类的各种成员初始化顺序的更多相关文章
- Java类、实例的初始化顺序
今晚是阿里巴巴 2013 校园招聘的杭州站笔试.下午匆忙看了两张历年试卷,去现场打了瓶酱油. 题目总体考察点偏基础,倒数第二题(Java 附加题)比较有趣,考察了 Java 初始化机制的细节,在此摘录 ...
- Java类(继承)初始化顺序
/** * Created by xfyou on 2016/11/2. * Java继承的初始化 */ public class Beetle extends Insect { int k = pr ...
- 浅谈Java类中的变量初始化顺序
一.变量与构造器的初始化顺序 我们知道一个类中具有类变量.类方法和构造器(方法中的局部变量不讨论,他们是在方法调用时才被初始化),当我们初始化创建一个类对象时,其初始化的顺序为:先初始化类变量,再执行 ...
- Java类的成员初始化顺序
Java类的成员初始化顺序 2017-06-01 代码: public class InitializeSequence { public static void main(String[] args ...
- java类的成员初始化顺序和初始化块知识
java类的成员初始化顺序和初始化块知识 转自:http://blog.csdn.net/lgfeng218/article/details/7606735 属性.方法.构造方法和自由块都是类中的成员 ...
- Java 类的实例变量初始化的过程 静态块、非静态块、构造函数的加载顺序
先看一道Java面试题: public class Baset { private String baseName = "base"; // 构造方法 public Baset() ...
- Java中的成员初始化顺序和内存分配过程
Java中的成员初始化顺序和内存分配过程 原帖是这样描述的: http://java.dzone.com/articles/java-object-initialization?utm_source= ...
- Java中静态数据的初始化顺序
Java的类中的数据成员中包含有静态成员(static)时,静态数据成员的初始化顺序是怎样的呢? [程序实例1] import java.util.*; import java.lang.*; imp ...
- java类中,成员变量赋值第一个进行,其次是静态构造函数,再次是构造函数
如题是结论,如果有人问你Java类的成员初始化顺序和初始化块知识就这样回答他.下面是代码: package com.test; public class TestClass{ // 成员变量赋值第一个 ...
随机推荐
- 某软件大赛C#版考题整理——【编程题】
三.编程题(4小题共40.0分)程序及结果写入对应文框内 1. 孪生素数查找程序. 所谓孪生素数指的是间隔为2 的相邻素数,就像孪生兄弟.最小的孪生素数是(3, 5),在100 以内的孪生素数还有 ( ...
- SqlServer 数据库引擎优化顾问优化数据库
现在一直在做的项目,数据量相对也不小,开始的时候没有觉得,因为是刚开始,数据量还很小,在程序使用过程中速度还挺快,但是随着数据量的不停的增长,发现程序越来越慢,甚至出现了超时的问题,因此要对程序和数据 ...
- Linux系统教程:设置GRUB菜单密码
1.认识启动配置选项 [root@server5 ~]# cat /boot/grub/grub.conf # grub.conf generated by anaconda # # Note ...
- 前端不容错过的jQuery图片滑块插件
作为前端开发者,我们会碰到很到各种各样的jQuery插件,但老实说,很少有自己写的.今天要分享的几款jQuery图片滑块插件,也就是jQuery焦点图插件,基本上会在每个网站都有应用,可以下载看看,也 ...
- Idea配置CheckStyle
1.安装CheckStyle 2.配置idea_checks.xml 3.启用CheckStyle idea_checks.xml: <?xml version="1.0"? ...
- 学习TensorFlow的tf.concat使用
https://www.tensorflow.org/api_docs/python/tf/concat
- 树莓派获取ip地址发送到邮箱
公网 ip.sh curl http://members.3322.org/dyndns/getip >>/email/ip.log python /email/mail.py ##### ...
- 转 linux 权限
发布系统架构图简化如下: 管理员通过Jenkins调用“发布程序(代号varian,以下简称varian)”,发布程序会进行一系列的初始化操作,完成后生成Docker镜像上传到Docker仓库,容器集 ...
- thinkphp 3.2 多表查询 group
分析一 $res = M('member') ->table('__MEMBER__ as a') ->join('__ORDER__ as b') ->field('a.id,b. ...
- idea中mybatis generator自动生成代码配置 数据库是sqlserver
好长时间没有写博客了,最近公司要用java语言,开始学习java,属于初学者,今天主要记录一下mybatis generator自动生成代码,首先在如下图的目录中新建两个文件,如下图 generato ...