构造函数:
定义:一种用来在创建对象时初始化对象的一种特殊方法。
作用:用于在创建对象时,给对象初始化。
构造函数的特点:
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
*/