`
DavidIsOK
  • 浏览: 75706 次
社区版块
存档分类
最新评论

关于java初始化,动静态初始化块,动静态变量执行顺序的memo

    博客分类:
  • java
阅读更多
package com.hxw.T2;

public class ExtendsMemo {

	public static void main(String[] args) {
		/*
		 * 几大原则
		 * 一、静态成员变量(Static)
		 * 	1、静态成员变量为类变量,所有对象共享同一内存空间
		 * 	2、静态成员变量的声明和定义仅在首次加载类时执行一次
		 * 	3、首次加载类时首先对所有静态成员变量根据类型默认赋初值,然后再对有右值的附右值
		 * 二、静态初始块
		 * 	1、静态初始化块仅在首次加载类时执行一次
		 * ······多个静态成员变量与静态始化快参照出现顺序先后执行······
		 * 三、动态成员变量
		 * 	1、动态成员变量定义在每次实例化对象时在构造函数之前执行
		 * 四、动态初始化块
		 * 	1、动态初始化块在每次实例化对象时在构造函数之前执行
		 * ······多个动态成员变量与动态初始化块参照出现顺序先后执行······
		 * 总结:总的来说,在不涉及继承的前提下,当首次加载类时,按照如下顺序执行
		 * 	1、按照出现顺序先后执行静态成员变量定义与静态初始化块
		 * 	2、按照出现顺序先后执行动态成员变量定义与动态初始化块
		 * 	3、执行构造函数
		 * 	再次实例化对象时只执行第2、3步即可
		 * 
		 * ············成员变量与定义与初始化块先于构造函数执行·········
		 * 五、当涉及到继承时,按照如下顺序执行
		 * 	1、执行父类的静态成员变量定义与静态初始化块,执行子类的静态成员变量定义与静态初始化块
		 * 	2、执行父类的非静态成员变量定义与动态初始化块,执行父类构造方法
		 * 	3、执行子类的非静态成员变量定义与动态初始化块,执行子类构造方法
		 * 另:父类构造方法中用到的方法如果已被子类重写,那么在构造子类对象时在调用父类构造函数中使用子类重写的方法
		 */	
		int i = 0;
		switch(i) {
		case 0:
			
			new A();
			new A();
			
			break;
		case 1:
			
			A ab = new B();
			
			break;
		case 2 :
			
			C c1 = new C();
			System.out.println("c.i1 = " + c1.i1);//2
			System.out.println("c.i2 = " + c1.i2);//3
			
			break;
		} 
        /* 对i=2时的解释
         * 为什么是2和3呢?
         * 其实代码的执行顺序是这样的:在初始化c1的时候首先加载类
         * 定义静态变量t1,i1,i2并赋初值null,0,0
         * 然后计算右值表达式new C(),准备将此对象赋给静态成员变量c
         * 		然而上步中静态成员变量已定义,直接执行c的构造函数即可
         * 		这样i1++,i2++被执行,i1,i2都变为1
         * 继续执行到int i1;没有赋值语句, i1,i2的值仍然是1
         * 继续执行到int i2 = 2时i2被赋值2,即i1 = 1,i2 = 2
         * 继续执行到c1的构造函数,i1,i2再执行++,此时i1 = 2,i2 = 3
         * 输出i1,i2,结果就是:c1.i1 = 2,c1.i2 = 3
         * 通过上面的代码我们可以认为系统默认值的给予比通过等号的赋予先执行。
         */
	}
}

class A {
	public A() {
		System.out.println("construct A");
		m();
		System.out.println();
	}
	
	private int ai = getAI();
	
	{
		System.out.println("dynamic block in A");
	}

	static {
		System.out.println("static block in A");
	}
	
	private static int asi = getASI();
	
	static int getASI() {
		System.out.println("initial static int asi");
		System.out.println();
		return 5;
	}
	
	static int getAI() {
		System.out.println("initial int ai");
		return 10;
	}
	
	public void m() {
		System.out.println("A.m()");
	}
}

class B extends A{
	public B() {
		System.out.println("construct B");
		super.m();
		m();
	}
	
	{
		System.out.println("dynamic block in B");	
	}
	private int bi = getBI();
	private static int bsi = getBSI();

	
	static {
		System.out.println("static block in B");
		System.out.println();
	}
	
	static int getBSI() {
		System.out.println("initial static int bsi");
		return 5;
	}
	
	static int getBI() {
		System.out.println("initial int bi");
		return 10;
	}
	
	public void m() {
		System.out.println("B.m() bi=" + bi);
	}
}

class C{
    private static C c = new C();
    public static int i1;
    public static int i2 = 2;
    
    public C(){
        i1++;
        i2++;
    }
}

 转自:http://blog.csdn.net/shijinupc/article/details/7692315

分享到:
评论

相关推荐

    Delphi中静态二维数组的使用

    通过这个简单的例子,我们不仅学习了Delphi中静态二维数组的声明、初始化和操作,还复习了循环控制和字符串处理的基本技巧。 总之,Delphi的静态二维数组提供了一种高效且灵活的方式来处理矩阵或表格形式的数据。...

    2021-2022计算机二级等级考试试题及答案No.12483.docx

    2. Java 静态变量与静态初始化器:Java代码中,4行与8行可以编译通过,静态初始化器(即静态代码块)可以有多个。执行结果为x=5,因为静态变量x被静态初始化器重新赋值为5。 3. 数据库访问接口:CallableStatement...

    2021-2022计算机二级等级考试试题及答案No.15913.docx

    17. **Java程序分析**:该Java程序定义了一个Person类,并在main方法中尝试访问静态数组arr的第0个元素。由于数组未初始化,程序编译时不会出错,但在运行时会产生`NullPointerException`。 这些知识点涵盖了计算机...

    2021-2022计算机二级等级考试试题及答案No.1567.docx

    10. **静态变量**:静态变量在过程调用之间保留其值,当过程再次执行时,它的初始值是上一次调用后的值。 11. **while循环**:在给出的C语言程序段中,while循环会无限次执行,因为赋值运算符`=`将1赋给了k,导致...

    Android-使用kotlin开发的仿EMUI备忘录使用ObjectBox框架

    2. **数据库初始化**:在应用启动时,我们需要创建ObjectBox的数据库实例。这通常在Application或单例中完成,通过`BoxStore.builder()`创建并获取BoxStore对象,然后根据实体类创建对应的Box对象,如`Box<Memo>`。 ...

    2021-2022计算机二级等级考试试题及答案No.15940.docx

    这是因为C语言中可以通过直接赋值的方式初始化指向字符串的指针变量。而其他选项均存在语法错误或不当之处:选项A中的`*sp`应当是指向字符的指针而非指向字符串的指针;选项B和C试图将一个字符串赋值给数组变量`s`,...

    2021-2022计算机二级等级考试试题及答案No.12333.docx

    ` 这里使用了初始化列表来指定数组的某些元素值。 ### 17. Visual Basic 语言特性 - **非过程式语言**:Visual Basic 是一种非过程式的程序设计语言,它强调对象和事件驱动编程。 ### 18. 中文搜索引擎 - **最...

    有赞(24问).pdf

    初始化两个指针,都指向链表的头节点,快指针每次移动两个节点,慢指针每次移动一个节点。如果链表有环,快慢指针最终会相遇;如果没有环,则快指针会到达链表尾部。 介绍二叉搜索树的特点: 二叉搜索树是一种特殊...

    点击右侧我的Tag可快速添加

    23. **constructor**: 构造函数,用于初始化对象的特殊方法。 24. **encapsulate**: 封装,面向对象编程中的一个重要概念,通过隐藏对象的内部状态来保护数据。 25. **sealed**: 密封,通常用于限制类的继承,...

    pizza-react-

    2. **创建React应用**:使用`create-react-app`工具初始化项目,它提供了一套开箱即用的配置,简化了项目的搭建过程。 3. **路由管理**:使用`react-router-dom`库来实现页面间的导航,例如定义`BrowserRouter`, `...

    ts-template::memo:| 预先配置了带有ESLint,Jest,Prettier和Github Actions for CI的Typescript模板

    - Jest的安装与初始化:如何配置`package.json`文件,以及运行`jest --init`命令创建配置文件`jest.config.js`。 - 编写测试用例:理解`describe`、`it`、`expect`等关键字,编写测试用例。 - 断言库:熟悉Jest内置...

    一份关于React框架的框架教程!!!!!

    - **componentDidMount**:组件挂载后调用,常用于初始化操作。 - **componentDidUpdate**:组件更新后调用,可以用来响应props或state的变化。 - **componentWillUnmount**:组件卸载前调用,用于清理操作。 ##...

    现场React

    9. **Gatsby**:`react-gatsby-site-master`中的“Gatsby”是一个基于React的静态站点生成器,它结合了React的组件化开发和GraphQL的数据查询能力,能快速构建高性能的静态网站。 10. **GraphQL**:Gatsby使用...

    React项目

    在实际开发中,我们通常会使用Create React App(CRA)这样的脚手架工具来初始化项目,它会提供一个预配置的开发环境,包括Webpack、Babel等工具,以便我们专注于编写业务逻辑,而不是配置构建流程。 关于"CSS"标签...

    真值表:使用React和Typescript构建的真值表生成器。 (我做作业的重点是什么?)

    你需要理解React组件的概念,如何创建和管理状态,以及如何使用生命周期方法来处理组件的初始化、更新和销毁。 2. **TypeScript**:TypeScript是JavaScript的超集,提供了静态类型检查和更丰富的语法特性。在你的...

    BootCamp-ReactJS:PI类ReactJS训练营

    4. **生命周期方法**:React组件有特定的生命周期方法,如`componentDidMount`、`componentDidUpdate`和`componentWillUnmount`,用于在组件的不同阶段执行特定任务,如初始化数据、更新后的处理或清理资源。...

    react-rerendering-test

    `componentDidMount`是在组件首次挂载到DOM后调用,适合在此处初始化数据加载。`componentDidUpdate`则在组件完成更新后调用,可以用来处理更新后的副作用,比如更新外部DOM元素或再次获取数据。而`...

    MyReactProject:去做

    在这里,开发者可能会找到项目的设置,如路由配置,全局样式,以及初始化的React组件。 在React项目中,以下是一些常见的知识点: 1. **React组件**:React应用是由可重用的组件构成的,每个组件都有自己的状态和...

    react-app3759019589630401

    创建React应用时,通常会使用Create React App工具,这是一个官方推荐的脚手架,可以快速初始化一个新的React项目,包括必要的配置和依赖。在"react-app3759019589630401"项目中,很可能也是使用Create React App...

    react-app8154549248277117

    2. **创建React App**:通常,创建React应用会使用`create-react-app`工具,这是一个官方提供的脚手架,可以快速初始化一个包含所有必要配置和依赖的React项目。不过,"react-app8154549248277117"的命名方式并不...

Global site tag (gtag.js) - Google Analytics