您的位置:首页 > 编程语言 > Java开发

Java中的构造函数、构造代码块、静态代码块

2014-10-24 09:56 337 查看
构造函数:

定义:一种用来在创建对象时初始化对象的一种特殊方法。

作用:用于在创建对象时,给对象初始化。

构造函数的特点:

1. 构造函数的函数名必须和类名完全相同,无返回值,也不能使用 void 修饰;在java中普通函数可以和构造函数同名,但是必须带有返回值。

2. 构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用;而一般的方法是在程序执行到它的时候被调用的。

3. 构造函数可以重载,一个类中可以有多个构造函数,在创建对象时,系统可以根据传递参数的不同来自动调用对应参数的构造函数。

4. 当定义一个类的时候,通常情况下都会显示该类的构造函数,并在函数中指定初始化的工作;但有时也不写构造函数,此时Java编译器会提供一个默认的构造函数,此默认构造函数是不带参数的;而一般的方法不存在这一特点。

5. 构造函数也可以被 private 修饰。但要注意,由于Java允许在类中创建本类对象,所以如果A类的构造函数被私有化,则可以在A类中new一个A类的对象;但如果B类将无法通过new关键字来创建A类对象,此时A类需要提供一个 public(或非私有化)的获取方法,创建并返回A类对象以供B类使用(单例设计模式就是用了这一特性)。

class B
{
	//在B类中定义一个私有的构造函数
	private B(){}

	//在B类中提供一个获取B类对象方法
	public static B getInstanceB()
	{
		B b = new B();
		return  b;
	}
}

class A 
{
	//在A类中定义一个私有的构造函数
	private A(){}

	public static void main(String[] args) 
	{
		A a = new A();//创建A类对象,系统自动调用A的构造函数
		//B b = new B();//错误:此时无法通过 new 创建B类对象
		B b = B.getInstanceB();
	}
}


构造代码块:

作用:同样也是给对象初始化。对象一建立就被执行,而且优先于构造函数执行。

和构造函数的区别:构造代码块是给所有对象进行统一初始化的,而构造函数是给对应的对应对象初始化。

格式:

{
	//构造代码块代码
}



静态代码块:

作用:用于给类初始化。

特点:随着类的加载而执行,只执行一次,并优先于主函数。

格式:

static
{
	//静态代码块代码
}


总结:

静态代码块、构造代码块和构造函数的区别

静态代码块:用于给类初始化,类加载时就会被加载执行,只加载一次。

构造代码块:用于给对象初始化的。只要建立对象该部分就会被执行,且优先于构造函数。

构造函数:给对应对象初始化的,建立对象时,选择相应的构造函数初始化对象。

创建对象时,三者被加载执行顺序:静态代码块--->构造代码块--->构造函数



通过以下代码来说明问题

class Person
{
	private String name = null;
	private int age = 0;
	private static String country="cn";
	
	Person(String name,int age)
	{//构造函数
		this.name=name;
		this.age=age;
		System.out.println("我是构造函数");
	}
	static
	{
		System.out.println("我是Person类静态代码块");	
	}
	
	{//构造代码块
		System.out.println("我是构造代码块:"+name+"..."+age);
	}

	public void setName(String name)
	{
		this.name=name;	
	}

	public void speak()
	{
		System.out.println(this.name+"..."+this.age);	
	}

	public static void showCountry()
	{//静态方法
		System.out.println("country="+country);	
	}
}
class StaticDemo
{
	static
	{
		System.out.println("我是StaticDemo类main() 前 的静态代码块");	
	}

	public static void main(String[] args)
	{
		System.out.println("我是main()函数");	
		Person p=new Person("zhangsan",100);
		p.setName("lisi");
		p.speak();
		Person.showCountry();
	}

	static
	{
		System.out.println("我是StaticDemo类main() 后 的静态代码块");	
	}	
}

/*
执行结果如下:

我是StaticDemo类main() 前 的静态代码块
我是StaticDemo类main() 后 的静态代码块
我是main()函数
我是Person类静态代码块
我是构造代码块:null...0
我是构造函数
lisi...100
country=cn
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐