初学Java,初始化块(十三)

news/2024/7/4 0:46:47 标签: java, class, string, struts, 虚拟机, c#
class="baidu_pl">
class="article_content clearfix">
class="htmledit_views">

初始化块是什么?在Java中就是在构造器之前执行的一段代码,它的用处是,如果一段初始化处理代码对所有对象完全相同,且无须接受任何参数,就可以把这段提取到初始化块中.在C#中,没有初始化块

class="language-class="tags" href="/tags/JAVA.html" title=java>java">public class  Person
{
	//定义一个初始化块
	{
		int a = 6;
		//在初始化块中
		if (a >4)
		{
			System.out.println("Person 初始化块:局部变量a的值大于4");
		}
	}
	//定义第二个初始化块
	{
		System.out.println("Person的第二个初始化块");
	}
	//定义无参数的构造器
	public Person()
	{
		System.out.println("Person的无参数构造器");
	}
	public static void main(String[] args) 
	{
		new Person();
	}
}

输出

Person 初始化块:局部变量a的值大于4

Person的第二个初始化块

Person的无参数构造器


初始化块的执行顺序是按定义的顺序执行,最后才轮到构造器

初始化块又分为非静态初使化块和静态初始化块,静态初始化块必须要用static进行修饰,静态初始化块是对类而言,非静态初始化块是对对象而言,但静态初始化块的执行顺序在前,非静态在后.

class="language-class="tags" href="/tags/JAVA.html" title=java>java">public class Root
{
	static{
	    System.out.println("Root 的静态初始化块");
	}
	{
		System.out.println("Root 的普通初始化块");
	}
    public Root()
	{
		System.out.println("Root 的无参数的构造器");
	}
}

public class Mid extends Root
{
	static{
		System.out.println("Mid 的静态初始化块");
	}
	public Mid()
	{
		System.out.println("Mid 的无参数的构造器");
	}
	public Mid(String msg)
	{
		//通过this调用同一类中重载的构造器
		this();
		System.out.println("Mid的带参构造器,其参数值:" + msg);
	}
}

public class Leaf extends Mid
{
	static{
		System.out.println("Leaf 的静态初始化块");
	}
	{
		System.out.println("Leaf 的普通初始化块");
	}
	public Leaf()
	{
		//通过surper 调用父类中有一个字符串参数的构造器
		super("Struts 2权威指南");
		System.out.println("执行Leaf的构造器");
	}
}

public class Test
{
	public static void main(String[] args)
	{
		new Leaf();
		new Leaf();
	}
}

从上面的执行结果可以看出,类初始化阶段,先执行最顶层父类的静态初始化块,依次向下,最后执行当前类静态初始化块,对象初始化阶段,先执行最顶层父类的初始化块,构造器,依次向下,最后执行当前类初始化块,构造器

分析上面的例子,主程序两次执行new Leaf(); ,创建2个Leaf对象,第一次创建Leaf对象时,系统中还不存在Leaf类,因此需要先加载并初始化Leaf类,初始化Leaf类时会先执行其顶层父类的静态初始化块,最后才执行Leaf本身的静态初始化块.

 一旦Leaf类初始化成功后,Leaf类在该虚拟机里将一直存在,因此当第二次创建Leaf实例时无须再次对Leaf类进行初始化.

所以这个执行的优先级为 : 所有类的静态初始化块(从父类自顶向下) -> 所有类的普通初始化块然后接着类的构选器(从父类自顶向下)

如果再实例化一个对象,那么就没有类初始化这个步骤了,因为已经发生在第一次实例化了,类初始化只会发生一次!且在该类的所有对象实例化之前


http://www.niftyadmin.cn/n/1411550.html

相关文章

Go -- runtime.Gosched()的作用分析

runtime.Gosched()用于让出CPU时间片。这就像跑接力赛,A跑了一会碰到代码runtime.Gosched()就把接力棒交给B了,A歇着了,B继续跑。看代码: 123456789101112131415161718package mainimport ( "fmt" "runtime&…

微信jssdk签名代码

代码片段$url $request->get(url); $url urldecode($url);####注意这里url一定要是转义前的url。url地址是#去掉前面的那一窜。例如http://test.com?a1#ffgg,则需要签名的url地址为http://test.com?a1$ticket Wechat::getJsApiTicket(); $pool 0123456789abcdefghijkl…

初学Java,toString(十四)

C#里面也有个ToString,注意大小写的不同 Java的toString的和C#的ToString完全不是同一概念,首先toString是一个"自我描述"的方法,然后它可以被重写public class Person {private String name;public Person(String name){this.name name;}public void info(){Syst…

【闭包概念】关于闭包概念不同解读——你可以自己理解。

写在前面: 闭包是被讲烂的内容,但是当我不了解的情况下,看过很多教程,听过很多道理,还是无法完全理解闭包这个东西。所以想要写一篇比较详细,前端小白也能够真正理解闭包概念的干货文章,本文参考…

React-Native中关于样式的良好实践

react-native中的样式 react-native中,所有的代码文件都是由一个个的js(x)文件构成,样式也是一样,也是js代码来描述,准确的来说,是StyleSheet模块。 写样式,必须引入StyleSheet模块。 import { StyleShe…

初学Java,单例模式(十五)

下面的代码是使用Java实现设计模式中的单例模式public class Singleton {//使用一个变量来缓存曾经创建的实例private static Singleton instance;//将构造器使用private修饰,隐藏该构造器private Singleton(){}//提供一个静态方法,用于返回Singleton实例//该方法可以加入自定…

苹果电脑MacbookPro 使用NTFS磁盘读写配置手动配置免费

苹果电脑MacbookPro 使用NTFS磁盘读写配置手动配置免费 背景介绍 由于在苹果电脑上使用的NTFS格式的硬盘,没有写入硬盘的权限,不能将电脑上的文件拷贝到磁盘里。一种解决方案是将硬盘格式化成ext3 格式,就能直接使用mac电脑写文件。但是我的…

如何在react中封装服务

引言 最近半年,所做的项目都是集中在react以及react-native上,对于react的一些基本用法,渐渐形成了自己的一些见解,而服务则是这些见解中比较重要的一部分。 引言为什么要封装服务服务的概念服务封装的优势 服务封装的基本原则基…