JAVA类的初始化顺序

上一篇 / 下一篇  2013-05-11 09:38:06 / 个人分类:JAVA学习

     近来学习了JAVA,原以为对JAVA的基础掌握的还算马马虎虎,但是做了一些练习题后,觉得无从下手,特别是类的初始化顺序一块,经常想错了,只好将这块的知识借助书上以及网络上的知识再学习下 
     JAVA程序的中的入口是main函数,而当一个对象被new出来的时候,首先初始化静态变量,静态代码块,变量,初始化代码块,构造函数。
静态代码块就是在类中以static{}形态出现
初始化代码块 {}
构造函数,也就是和类同名,但不能有返回类型修饰
    举个栗子先
class Habi
{
private static String s= "静态变量";
private String a = "常量";

 Habi(){
  System.out.println("构造函数s="+s);
  System.out.println("构造函数a="+a);
  
  }
 static{
  System.out.println("静态代码块s="+s);
 }

{
  
  System.out.println( "代码块a="+a);
}
 
}

public class Habitest
{
public static void main(String args[]){
Habi H1 = new Habi();
}
}
编译执行后结果如下

静态代码块s=静态变量
代码块a=常量
构造函数s=静态变量
构造函数a=常量

因为在静态代码块中无法引用非静态变量,但是此时对于常量a的未进行赋值,String类型默认初始化为0
其实在程序初始化时,常量已经存在了,只是未进行赋值操作

对于存在继承关系的初始化,其实也相当类似,按照先父后子的顺序
上栗子
class Habi
{
private static String s= "父类静态变量";
private String a = "父类常量";

 Habi(){
  System.out.println("父类构造函数s="+s);
  System.out.println("父类构造函数a="+a);
  
  }
 static{
  System.out.println("父类静态代码块s="+s);
 }

{
  
  System.out.println( "父类代码块a="+a);
}
 
}

class Hali extends Habi
{

private static String s= "子类静态变量";
private String a = "子类常量";

 Hali(){
  System.out.println("子类构造函数s="+s);
  System.out.println("子类构造函数a="+a);
  
  }
 static{
  System.out.println("子类静态代码块s="+s);
 }

{
  
  System.out.println( "子类代码块a="+a);
}
}

public class Habitest
{
public static void main(String args[]){
Habi H1 = new Hali();
}
}

打印结果
父类静态代码块s=父类静态变量
子类静态代码块s=子类静态变量
父类代码块a=父类常量
父类构造函数s=父类静态变量
父类构造函数a=父类常量
子类代码块a=子类常量
子类构造函数s=子类静态变量
子类构造函数a=子类常量

父类静态变量赋值,静态代码块初始化
子类静态变量赋值,静态代码块初始化
父类成员常量赋值,代码块执行,构造函数执行
子类成员常量赋值,代码块执行,构造函数执行

因为子类的构造函数会默认通过super方法调用父类的构造函数,故父类需要先执行
在这里,经常会碰见,父类的构造函数调用了父类中的方法,但是此方法子类也进行覆盖重写了,因为多态和继承的原因,会调用子类的方法,但是此时子类的成员常量并没有赋值,切记


TAG:

 

评分:0

我来说两句

日历

« 2024-04-10  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 9975
  • 日志数: 20
  • 建立时间: 2013-03-24
  • 更新时间: 2014-03-22

RSS订阅

Open Toolbar