[javase学习笔记]-8.8 构造代码块

Posted llguanli

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[javase学习笔记]-8.8 构造代码块相关的知识,希望对你有一定的参考价值。

这一节我们再看一个特殊的代码块。那就是构造代码块。


这里我们简单的通过样例来说明一下:

class Person
{
	private String name;
	{
		System.out.println("Person类的第一个代码块被运行");
	}

	Person()
	{
		System.out.println("无參数构造函数被运行");
		this.name = "小宝宝";
	}
	Person(String name)
	{
		System.out.println("有name參数构造函数被运行");
		this.name = name;
	}
	public void speak()
	{
		System.out.println("名字:"+name);
	}
}

class ConBlockTest
{
	public static void main(String[] args) 
	{
		Person p1 = new Person();
		p1.speak();
		Person p2 = new Person("小科比");
		p2.speak();
	}
}
我们在这个样例中看到了Person类中有一个代码块,它没有被statickeyword修饰,这就是我们这一节所说的构造代码块,为什么这么说呢,我们看运行结果:

技术分享图片

我们非常显然就看到了在我们创建两个对象时,该代码块都被运行了。而构造函数仅仅是当创建相应对象时被调用。

所以构造代码块的作用就是:给全部对象进行同样部分的初始化。

而我们的构造方法是对相应的对象进行有针对性的独特的初始化。


那么构造代码块的构造函数哪个先运行呢?我们看代码:

class Person
{
	private String name;

	{//第一个构造代码块
		System.out.println("Person类的第1个代码块被运行");
	}

	Person()
	{
		System.out.println("无參数构造函数被运行");
		this.name = "小宝宝";
	}
	Person(String name)
	{
		System.out.println("有name參数构造函数被运行");
		this.name = name;
	}
	public void speak()
	{
		System.out.println("名字:"+name);
	}

	{//第二个构造代码块
		System.out.println("Person类的第2个代码块被运行");
	}
}
我们看结果:

技术分享图片

我们看到两个不同位置的构造代码块都在构造函数被运行之前就已经运行了。所以说构造代码块优先于构造函数运行。


所以,当我们须要把全部对象都有同样的初始化时,我们能够使用构造代码块来实现。比方上面的样例中,人一出生都会哭,那么我们就能够用构造代码块来初始哭这个功能:

class Person
{
	private String name;

	{
		cry();
	}

	Person()
	{
		this.name = "小宝宝";
	}
	Person(String name)
	{
		this.name = name;
	}
	public void cry()
	{
		System.out.println("哇哇");
	}
	public void speak()
	{
		System.out.println("名字:"+name);
	}
}
这样我们就把全部对象哭的功能封装到了一个构造代码块中。在创新对象是会优先运行,非常好的实现了我们想要的功能。

技术分享图片

以上是关于[javase学习笔记]-8.8 构造代码块的主要内容,如果未能解决你的问题,请参考以下文章

JavaSE8基础 构造代码块简单示例

[javase学习笔记]-7.5 构造函数须要注意的几个细节

JavaSE知识-08(面向对象_继承&方法&final)

JavaSE8基础 父子类中都有静态代码块与构造代码块,执行顺序的简单示例

JavaSE8基础 在构造代码块中给final类型的成员变量赋值

JAVA-代码块(自己学习当笔记而已)