初始化块
class Person{
private String name;
private int age;
/* 初始化块 作用:给对象进行初始化 对象一建立就运行,而且优先于构造函数执行。 和构造函数的区别: 构造代码块是给所有对象进行统一初始化,而构造函数是给对应的对象初始化 构造代码块汇中定义的是不同对象共性的初始化内容。 */
{ //代码块
cry();
}
Person(){
System.out.println("A.name"+name+",,age="+age);
}
Person(String n){
name=n;
System.out.println("B.name="+name+",,age="+age);
}
public void cry(){
System.out.println("cry...............");
}
}
public class PersonDemo
{
public static void main(String[] args)
{
person P1=new Person();
person P2=new Person(Jack);
}
}
输出
cry…………..
name=null,,age=0
cry………..
name=Jack,,age=0
静态初始化块
如果定义初始化块的时候使用了static修饰符,则这个初始化块就变成了静态初始化块。也称为类初始化块。
class Root{
static{
System.out.println("Root的静态初始化块");
}
{
System.out.println("Root的普通初始化块");
}
public Root() {
System.out.println("Root的无参数构造器");
}
}
class Mid extends Root {
static{
System.out.println("Mid的静态初始化块");
}
{
System.out.println("Mid的普通初始化块");
}
public Mid() {
System.out.println("Mid的无参数构造器");
}
public Mid(String msg) {
this(); //通过this调用同一类中重载的构造器
System.out.println("Mid的带参数构造器"+msg);
}
}
class Leaf extends Mid{
static{
System.out.println("Leaf的静态初始化块");
}
{
System.out.println("Leaf的普通初始化块");
}
public Leaf(){
super("java学习"); //通过super调用父类中有一个字符串的构造器
System.out.println("执行Leaf的构造器");;
}
}
public class test{
public static void main(String[] args) {
new Leaf();
new Leaf();
}
}
输出结果
第一次创建一个Leaf对象时,因为系统中还不存在Leaf类,因此需要先加载并初始化Leaf类,初始化Leaf类时会先执行其顶层父亲的静态初始化块,在执行其直接父亲的静态初始化块,最后执行Leaf本身的静态初始化块。
一旦Leaf类初始化成功之后,Leaf类在该须立即里将一直存在,因此当第二次创建Leaf实例时无需再次对Leaf类进行初始化。
每次创建一个Leaf对象,都需要先执行最顶层的初始化块,构造器,然后执行其父亲的初始化块,构造器。。。。最后执行Leaf类的初始化块,构造器。