【基础】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{ // 成员变量赋值第一个 ...
随机推荐
- Xianfeng轻量级Java中间件平台:功能管理
功能管理:从功能类型来看,不属于用户使用的功能,而属于系统维护使用的功能,因为对于用户来说,是不可见的.功能管理的作用是定义一套规则,用来处理权限等业务,比如常见的菜单权限控制.按钮权限控制等情景 在 ...
- gitlab的安装和基本维护
基本介绍 GitLab是一个自托管的Git项目仓库,可以自己搭建个人代码管理的仓库,功能与github类似. 安装 操作系统:CentOS6.5 gitlab官网下载安装地址:https://abou ...
- MySQL的varchar长度问题
From: http://blog.csdn.net/longyulu/article/details/7863737 http://dinglin.iteye.com/blog/914276 htt ...
- ubuntu16.04卸载tensorflow0.11版本,安装tensorflow1.1.0版本
卸载旧版本: pip uninstall tensorflow 安装新版本: sudo pip install --upgrade https://storage.googleapis.com/ten ...
- u3d资源打包只能打包场景材质,不能打包脚本
GameObject附带脚本打包进来以后,只有一个脚本名字,估计只是关联了脚本,内容却不在,所以后面打包资源的话,一定要把脚本,shader之类的,放到工程目录下
- 支持Android 的几款开源3D引擎调研
最近由于工作需要,对支持Android的一些开源3D引擎做了调研,结果如下: 1.Ogre 十分强大的一款3D引擎,号称工业级标准的开源项目,不仅可以用于游戏,还可以用于其他和3D相关的软件.大多数该 ...
- Android四大组件之——ContentProvider(二)
Content Resolver介绍: 开发者文档中这么定义的: This class provides applications access to the content model. 这个类为应 ...
- ubuntu 4.10~5.10 :古老的ubuntu上安装oracle10g的情况
64位的: 不用想了,安装不上,因为ubuntu库里没有提供编译环境:安装不上gcc-multilib库.也没有libc6-dev-i386库! 自己这点水平,真搞不定! 32位的: 很顺利.很顺利! ...
- 怎么解决BarTender因为未检测到IIS安装失败的问题
个别小伙伴在安装BarTender条码标签设计软件的时候,遇到“未检测到IIS,无法安装BarTender Web Print Server配套程序”导致安装失败的问题,本文小编给大家分享解决BarT ...
- oracle数据库中sql%notfound的用法
SQL%NOTFOUND 是一个布尔值.与最近的sql语句(update,insert,delete,select)发生交互,当最近的一条sql语句没有涉及任何行的时候,则返回true.否则返回fal ...