Java语法专题2: 类变量的初始化顺序
- 合集目录
- Java语法专题2: 类变量的初始化顺序
问题
这也是Java面试中出镜率很高的基础概念问题
- 描述一下多级继承中字段初始化顺序
- 描述一下多级继承中类变量初始化顺序
- 写出运行以下代码时的控制台输出
public class Base {
public static int v1 = method(1);
private static int v2 = method(2);
private int v3;
private int v4 = method(3);
public Base() {
v3 = method(4);
}
public static int method(int i) {
System.out.println(i);
return i;
}
public static void main(String args[]) {
method(5);
Base b2 = new Base();
}
}
分析
正确回答这些问题, 需要对以下的概念有了解:
static关键字, 静态变量和静态方法- 静态变量和普通成员变量初始化的区别
- 类初始化中父类和子类变量的初始化顺序
以下通过具体场景说明
场景一: 单个类的初始化顺序
先看单个类的初始化顺序, 静态和普通变量都根据public和private区分, 交替声明.
Base.java
public class Base {
public static int pub_s = method(1);
private static int pri_s = method(2);
public static int pub_s2 = method(3);
private static int pri_s2 = method(4);
private int pri1;
private int pri2 = method(5);
private int pri3;
private int pri4 = method(6);
public Base() {
pri1 = method(7);
pri3 = method(8);
}
public static int method(int i) {
System.out.println(i);
return i;
}
public static void main(String args[]) {
method(0);
Base b2 = new Base();
}
}
输出结果为
1
2
3
4
0
5
6
7
8
可以得到以下信息
- 静态成员变量初始化最早
- 与实例初始化无关, 在载入类时完成初始化
- 初始化顺序与代码顺序一致, 与public还是private无关
- 静态成员变量初始化在执行main()函数之前完成, 因为在执行main()函数前, 静态成员初始化就伴随类的载入完成了
- 普通成员变量初始化在执行构造函数之前
场景二: 带继承关系的类初始化顺序
保持Base.java不变, 增加Sub.java作为子类
Sub.java
public class Sub extends Base {
public static int sub_pub_s = method(11);
private static int sub_pri_s = method(12);
public static int sub_pub_s2 = method(13);
private static int sub_pri_s2 = method(14);
private int sub_pri1;
private int sub_pri2 = method(15);
private int sub_pri3;
private int sub_pri4 = method(16);
public Sub() {
sub_pri1 = method(17);
sub_pri3 = method(18);
}
public static void main(String args[]) {
method(10);
Sub b2 = new Sub();
}
}
运行Sub.java, 输出结果为
1
2
3
4
11
12
13
14
10
5
6
7
8
15
16
17
18
可以得到以下信息
- 在任何情况下, 静态成员变量都会最先初始化
- 在存在继承关系的类中, 父类的静态成员变量先初始化, 然后是子类的静态成员变量
- 所有静态成员变量初始化之后, 才开始main函数的执行
- 在类实例初始化过程中, 先初始化父类, 再初始化子类, 每一层都是先成员变量, 然后执行构造函数, 所以顺序就是: 父类成员变量, 父类构造函数, 子类成员变量, 最后是子类构造函数
总结
类的构造顺序为
- 父类静态成员变量, 其顺序与代码顺序一致, 与public还是private无关
- 子类静态成员变量, 其顺序与代码顺序一致, 与public还是private无关
- 如果执行类的静态函数(包括main函数), 这个时间点就会开始执行函数
- 如果创建了类的实例, 注意这个前提, 下面就会开始普通成员变量的初始化
- 父类的普通成员变量
- 父类的构造函数
- 子类的普通成员变量
- 子类的构造函数
Java语法专题2: 类变量的初始化顺序的更多相关文章
- Java语法专题1: 类的构造顺序
合集目录 Java语法专题1: 类的构造顺序 问题 下面的第二个问题来源于Oracle的笔试题, 非常经典的一个问题, 我从07年开始用了十几年. 看似简单, 做对的比例不到2/10. 描述一下多级继 ...
- Java类继承关系中的初始化顺序
Java类初始化的顺序经常让人犯迷糊,现在本文尝试着从JVM的角度,对Java非继承和继承关系中类的初始化顺序进行试验,尝试给出JVM角度的解释. 非继承关系中的初始化顺序 对于非继承关系,主类Ini ...
- Java杂谈3——类加载机制与初始化顺序
Java语言的哲学:一切都是对象.对于Java虚拟机而言,一个普通的Java类同样是一个对象,那如果是对象,必然有它的初始化过程.一个类在JVM中被实例化成一个对象,需要经历三个过程:加载.链接和初始 ...
- IT兄弟连 Java语法教程 数组 数组的初始化
Java语言中数组必须先初始化,然后才可以使用.所谓初始化,就是为数组的数组元素分配内存空间,并为每个数组元素赋初始值. 这时有人会问,能不能只分配内存空间,不赋初始值呢?答案是肯定不行的,一旦为数组 ...
- Java中类的数据成员的初始化顺序
对于单一类: 属性初始化 ---> 按顺序执行静态初始化块(只能操作静态属性) ---> 按顺序执行初始化块 ---> 构造方法 对于存在继承关系的类: 父类属性初始化 ---> ...
- java类的加载以及初始化顺序
类的加载和初始化的了解对于我们对编程的理解有很大帮助,最近在看类的记载方面的问题.从网上查阅了若干文章,现总结如下: 我们通过一段代码来了解类加载和初始化的顺序: package com.classl ...
- Java中含有静态成员的的初始化顺序
class Bowl{ Bowl(int marker){ System.out.println("Bowl(" + marker + ")" ); } voi ...
- java对象中继承和变量初始化顺序浅析
先上例子代码 public class F { int age = 5; public F() { print(); } public void print() { System.out.printl ...
- 【深入理解JVM】:Java类继承关系中的初始化顺序
尝试着仔细阅读thinking in java 看到一篇很好的文章http://blog.csdn.net/u011080472/article/details/51330114
随机推荐
- 【LeetCode】113. Path Sum II 解题报告(Python)
[LeetCode]113. Path Sum II 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fu ...
- [C++]C++ STL库函数大全
#include <assert.h> //设定插入点 #include <ctype.h> //字符处理 #include <errno.h> //定义错误码 # ...
- Java程序设计基础笔记 • 【第2章 变量与数据类型】
全部章节 >>>> 本章目录 2.1 变量 2.1.1 变量的概念 2.1.2 变量的使用 2.1.3 实践练习 2.2 数据类型 2.2.1 数据类型的种类 2.2.2 ...
- HTML5 +Java基础 大一结业认证考试试题 - 云南农业职业技术学院 - 互联网技术学院 - 美和易思校企合作专业
第1题 [单选题][0.33分][概念理解] 关于java中的逻辑运算符,下列说法正确的是 逻辑运算符||.&&.!都是用于连接两个关系表达式</p> 当&&am ...
- nignx-防盗链
环境 主机 IP 角色 centos6.5-1 192.168.3.10 源主机 centos6.5-2 19 ...
- css 文本基础 实战 小米官方卡片案例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 《Python核心编程第3版中文版》(高清).PDF,免费无需任何解压密码
链接:https://pan.baidu.com/s/18d3xinNX1oH5q8zpB10ABA 提取码:dx7h
- 初识python: xml 操作
导入模块: import xml.etree.ElementTree as ET 创建xml文件: new_xml = ET.Element("namelist") # 创建根节点 ...
- Echart可视化学习(九)
文档的源代码地址,需要的下载就可以了(访问密码:7567) https://url56.ctfile.com/f/34653256-527823386-04154f 官网找到类似实例, 适当分析,并且 ...
- 小程序云开发请求第三方http或https接口
1.新建http云函数,选中http云函数,右键,打开终端,安装依赖: npm install request-promise 2.http.js引入request-promise用于做网络请求 va ...