java基础之——类的初始化顺序
由浅入深,首先,我们来看一下,一个类初始化有关的都有些啥米:
静态成员变量、静态代码块、普通成员变量、普通代码块、构造器。(成员方法?貌似跟初始化没有啥关系)
现在我们来看看她们的初始化顺序,
从性质上来说,静态的代表的是一个类的属性,普通的是一个对象的属性,“皮之不存,毛将焉附”,没有类,就没法谈对象,所以静态的必须先初始化。
那么静态成员变量与静态代码块之间又是什么关系呢?
做了个实验,发现静态成员变量与静态代码块谁放前面谁先执行,但是!!!!注意!!!!这里说的是“执行”是指的把sx=10,这个10赋给sx,而不是sx的初始化,在实验2里在代码块中打断点,可以发现这个时候sx已经被初始化为0,这里我是这样理解的:既然在初始化这个类(或对象)的成员了,那说明已经给它分配好内存了,int分配好内存后默认值为0(基础类型的默认值有false,0,null),不知道这么理解对不对。所以最终的结论是,先初始化成员变量为默认值,然后根据成员变量与代码块的先后顺序进一步初始化。
实验代码如下:
//实验1
private static int sx = 10;
static{
System.out.println("execute static block");
} 与
//实验2
static{
System.out.println("execute static block");
}
private static int sx = 10;
接着说,普通成员变量与普通代码块和静态的一个道理,就不累述了。
那么构造器与普通成员变量和普通代码块的关系呢?
这个我是通过实验得了这么个结论,是成员变量的"=xxx"(和成员变量初始化为默认值区分)和代码块先执行,然后再执行构造器中的。(实验代码最后一并贴出)
ok到这里为止,一个类的我们简单的说完了,那么类还有继承呢,子类和父类结合到一起的时候又是什么一个顺序呢?
其实挺简单的,子类继承自父类,可以使用父类的非private成员,所以,在在初始化子类之前肯定是要先初始化父类。
最终的顺序是:
父类静态成员变量初始化为默认值—>
子类静态成员变量初始化为默认值—>
父类按出现的先后顺序执行静态成员变量的“=xxx”和静态代码块—>
子类的按出现的先后顺序执行静态成员变量的“=xxx”和静态代码块—>
父类普通成员变量初始化为默认值—>
子类普通成员变量初始化为默认值—>
父类按出现的先后顺序执行普通成员变量的“=xxx”和静态代码块—>
父类执行构造函数—>
子类的按出现的先后顺序执行普通成员变量的“=xxx”和静态代码块—>
子类执行构造函数—>end
实验代码:
package abstractClass;
@SuppressWarnings("unused")
abstract class AbstractDemo {
{
System.out.println("execute super block,this.x="+this.x);
}
static{
System.out.println("execute static super block,this.sx="+AbstractDemo.sx);
}
public static int SuperPS = 1;
private static int sx = 1;
private int x = 1;
public AbstractDemo(){
super();
System.out.println("execute super constractor");
// this.print();
}
public abstract void print();
}
@SuppressWarnings("unused")
class DemoImpl extends AbstractDemo{
public static int PS = 10;
private static int sx = 10;
private int x = 10; //从调试的结果来看,此处是在执行完super()之后执行,然后再接着执行构造器
{
System.out.println("execute block,this.x="+this.x);
}
static{
System.out.println("execute static block,this.sx="+DemoImpl.sx);
}
public DemoImpl(int x){
super(); //断点
System.out.println("execute constractor");
System.out.println("before init in constractor this.x="+this.x);
this.x = x;
}
@Override
public void print(){
System.out.println("this.x="+x);
}
}
public class TestAbstractDemo{
public static void main(String[] args) {
new DemoImpl(100);
}
}
实验结果:
execute static super block,this.sx=0
execute static block,this.sx=10
execute super block,this.x=0
execute super constractor
execute block,this.x=10
execute constractor
before init in constractor this.x=10
java基础之——类的初始化顺序的更多相关文章
- Java笔记 #04# 类的初始化顺序补充
参考java中的类的初始化顺序详解 package org.sample; class Bread { Bread() { System.out.println("Bread()" ...
- JAVA基础2——类初始化相关执行顺序
类初始化相关执行顺序 几个概念说明 代码块的含义与作用 static静态代码块: 一般用于初始化类中的静态变量.比如:给静态的数组或者list变量赋初值.使用static静态代码块进行初始化与直接在定 ...
- java类的初始化顺序
在java中,当我们new一个对象时,对象中的成员,初始化块以及构造方法的加载是有一定的顺序的,看下面一副图: 一.单类(无基类)下的初始化顺序: public class Parent { stat ...
- 图示Java类的初始化顺序
Java类的初始化顺序 在开发中,知道Java类的初始化顺序才能让我们更加清楚地掌握程序的执行流程.先把结论贴出来,Java里,从图里的1~6,分别按顺序执行. 以下为代码验证阶段,一共三个类 ...
- Java类的初始化顺序 (静态变量、静态初始化块、变量、初始...
很有意思的一篇文章 1.没有继承 静态变量->静态初始化块->变量->变量初始化块->构造方法 2.有继承的情况 父类静态变量->父类静态初始化块->子类静态变量- ...
- 第二十九节:Java基础知识-类,多态,Object,数组和字符串
前言 Java基础知识-类,多态,Object,数组和字符串,回顾,继承,类的多态性,多态,向上转型和向下转型,Object,数组,多维数组,字符串,字符串比较. 回顾 类的定义格式: [类的修饰符] ...
- Java基础-Calendar类常用方法介绍
Java基础-Calendar类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Calendar类概念 Calendar 类是一个抽象类,它为特定瞬间与一组诸如 Y ...
- Java&&(面试题)初始化顺序总结
1 无继承情况下的Java初始化顺序: class Sample { Sample(String s) { System.out.println(s) ...
- C#多态;父类引用指向子类对象;new和override的区别;new、abstract、virtual、override,sealed关键字区别和使用代码示例;c#类的初始化顺序
关于父类引用指向子类对象 例如: 有以下2个类 public class Father { public int age = 70; public static string name = " ...
随机推荐
- METEOR 及ANGULARJS
最近学习:METEOR 及ANGULARJS,收藏相关资源: 1.METEOR 中文书:http://zh.discovermeteor.com/ 2.METEOR 及ANGULARJS 联合开发:h ...
- 【leetcode】N-Queens II
N-Queens II Follow up for N-Queens problem. Now, instead outputting board configurations, return the ...
- poj 3984
http://poj.org/problem?id=3984 题目很简单,就是简单的BFS吧,主要的难点在于坐标的问题 这个呢,可以反其道而行之,就是你从(1,1)到(5,5),你肯定走过一次 走过一 ...
- selenium处理rich text(富文本框)
WordPress 的 rich text 采用js,先让selenium切换到iframe中 driver.switchTo().frame("content_ifr"); 然 ...
- 去掉mysql数据库字段中的个别字符
update 表名 set 列名 = REPLACE (mcategory,"要去掉的字符","") where 列名 like "%要去掉的字符% ...
- iOS基础框架的搭建/国际化操作
1.基础框架的搭建 1.1 pod引入常用的第三方类库 1.2 创建基础文件夹结构/目录结构 Resource———存放声音/图片/xib/storyboard 等资源文件 Define——宏定义, ...
- 【leetcode】Reverse Linked List(easy)
Reverse a singly linked list. 思路:没啥好说的.秒... ListNode* reverseList(ListNode* head) { ListNode * rList ...
- ios cell左滑删除
iOS项目开发小技能 (三) -UITableView实现Cell左划删除等自定义功能 www.MyException.Cn 网友分享于:2015-06-05 浏览:0次 iOS项目开发小技巧 ...
- 如何激活webstorm 11
以前使用webstorm 10,可以在网上搜个注册码进行激活.后来升级了webstorm 11,发现原来的注册码和注册机已经不能激活了.查询后,才知道WebStorm 11改变了注册方法,可以在Lic ...
- 解决window删除文件时提示: 源文件名长度大于系统支持的长度
import java.io.File; /** */ public class DeleteFiles { public static void deleteFiles( File file ){ ...