Java中初始化顺序

原创 2016年05月30日 21:44:31

一、无继承情况时的初始化顺序

1、静态代码块和静态成员初始化(按照他们在程序中的先后顺序执行)

2、普通成员变量初始化

3、构造函数

 class A
	 {
	    public A()
	    {
	 	   System.out.println("A的无参构造方法被调用");
	    }
	    public A (String s)
	   {
	 	System.out.println(s);
	   }
	 }
	 public class Test
	  {
	 	 static{
	          System.out.println("静态块1被执行");
	            }
	    static A A1=new A("静态成员A1初始化");
	    A t1=new A("实例变量a1初始化");
	    static A staticA2 =new A("静态成员A2初始化");
	    static{
	          System.out.println("静态块2被执行");
	          }
	    Test()
	    {
	          System.out.println("Test默认构造函数被调用");
	    }
	   A a2=new A("实例变量a2初始化");
	   public static void main(String[] args)
	   {
	 	Test t = new Test();
	   }
	   }

执行结果:
静态块1被执行
静态成员A1初始化
静态成员A2初始化
静态块2被执行


实例变量a1初始化
实例变量a2初始化


Test默认构造函数被调用

二、有继承的情况时的初始化顺序

1 、父类静态成员和静态块

2、子类静态成员和静态块

3父类初始化(普通成员的初始化-->构造函数的调用)

4子类初始化(普通成员-->构造函数)

class A
	 {
	   
	    public A (String s)
	   {
	 	System.out.println(s);
	   }
	 }
class B
	  {
	 	
	    A b1=new A("父类实例变量b1初始化");
	    static{
	          System.out.println("父类静态块被执行");
	            }
	    static A B1=new A("父类静态成员b1初始化");
	    public B()
	    {
	 	   System.out.println("父类B的无参构造方法被调用");
	    }

	   }
public class C extends B
{
	 public static void main(String[] args)
	   {
	 	 C c = new C();
	   }
	
   A c1=new A("子类的实例变量c1初始化");
   static{
       System.out.println("子类静态块被执行");
         }
   static A C1=new A("子类静态成员C1初始化");
   public C()
   {
	   System.out.println("子类C的无参构造方法被调用");
   }

  }
执行结果:

父类静态块被执行
父类静态成员b1初始化


子类静态块被执行
子类静态成员C1初始化


父类实例变量b1初始化
父类B的无参构造方法被调用


子类的实例变量c1初始化
子类C的无参构造方法被调用



三、经典面试笔试题

class Singleton 
{     
    
    public static Singleton singleton = new Singleton();    //1 
    public static int a;   
    public static int b = 0;    
    private Singleton() {     
        super();     
        a++;     
        b++;     
    }      
    public static Singleton GetInstence() {     
        return singleton;     
    }     
    
}     
    
public class Test1 {     
      
    public static void main(String[] args) {     
        Singleton mysingleton = Singleton.GetInstence();     
        System.out.println("a="+mysingleton.a);     
        System.out.println("b="+mysingleton.b);     
    }     
    
}    

输出结果:

a=1

b=0

分析:

(1)加载连接时,对Singleton的所有的静态变量分配空间,赋默认的值,所以在这个时候,singleton=null、a=0、b=0。注意b的0是默认值。

 (2Singleton mysingleton = Singleton.GetInstence(); 调用 Singleton类的静态方法是对 Singleton类的主动使用,初始化 Singleton类。

 (3 Singleton类中的1语句是生成一个 Singleton对象,需要调用其构造方法,调用结束时a=1,b=1

 (4 public static int a; 没有为a赋初值,a依然为1

 (5  public static int b = 0; 为b赋初值 此时b变为0.

一定要分清在加载时是为静态变量赋予默认的初始值,在初始化时才为静态变量赋予真正的表达式的值。

若代码顺序由

public static Singleton singleton = new Singleton();  
    public static int a;  
public static int b = 0;

变为

 

   public static int a;
public static int b = 0;
public static Singleton singleton = new Singleton();

则结果为:

a=1

b=1

版权声明:转载请标明出处 https://blog.csdn.net/snow_7/article/details/51541422

JAVA中继承时的初始化顺序

我们都知道继承是JAVA面向对象中的一个很重要的特性。那么你有没有思考过当我们使用继承这个特性的时候,程序是如何执行的呢?也就是说,继承的初始化顺序到底是怎么样的。接下来我就要用eclipse来试验一...
  • baidu_28312631
  • baidu_28312631
  • 2015-05-23 15:23:49
  • 1343

Java中class的初始化顺序

(static对象和static代码块,依据他们的顺序进行初始化)>成员变量>构造函数 class的装载在讲class的初始化之前,我们来讲解下class的装载顺序。以下摘自《Thinking in ...
  • u014717036
  • u014717036
  • 2016-08-15 15:14:21
  • 544

多重继承关系的初始化顺序

多重继承关系的初始化顺序 父类属性---》父类构造方法---》子类属性---》子类构造方法                  说明:创建对象时,子类构造方法会自动调用父类的构...
  • zpwangshisuifeng
  • zpwangshisuifeng
  • 2017-06-26 21:12:51
  • 1058

【深入理解JVM】:Java类继承关系中的初始化顺序

Java类初始化的顺序经常让人犯迷糊,现在本文尝试着从JVM的角度,对Java非继承和继承关系中类的初始化顺序进行试验,尝试给出JVM角度的解释。非继承关系中的初始化顺序对于非继承关系,主类Initi...
  • u011080472
  • u011080472
  • 2016-05-06 11:19:38
  • 6468

java继承 初始化顺序

package Study.Initialization; class Base{ private String str1=init("str1"); private String str2=i...
  • yunzhongguwu005
  • yunzhongguwu005
  • 2013-08-01 10:13:26
  • 2647

Java 对象初始化顺序 执行顺序

先看一道Java面试题: 求这段程序的输出。   解答此题关键在于理解和掌握类的加载过程以及子类继承父类后,重写方法的调用问题:   从程序的执行顺序去解答: 1.编译;当这个类被编译...
  • Zhangxichao100
  • Zhangxichao100
  • 2015-10-14 22:59:53
  • 1740

Java基础总结之类与对象的初始化顺序

Java
  • crazyf2015
  • crazyf2015
  • 2015-06-27 21:51:27
  • 2620

Java子类父类初始化顺序

今天复习了一下Java基础知识,发现一个挺有趣的问题: Father类:package p2; public class Father { public Father() { // TODO...
  • lc0817
  • lc0817
  • 2015-11-06 10:10:46
  • 2488

java继承中初始化的顺序

java中子类继承了父类,其初始化的顺序是: 首先去看父类里面有没有静态代码块,如果有,它先去执行父类里面的静态代码块里面的内容;当父类的静态代码块里面的内容执行完毕后,接着去执行子类里面的静态代码块...
  • long636
  • long636
  • 2015-11-28 21:18:21
  • 1133

Java类的各种成员初始化顺序如:父子类继承时的静态代码块,普通代码块,静态方法,构造方法,等先后顺序

class B extends A ,然后A类也就是父类里面有静态代码块,普通代码块,静态方法,静态成员变量,普通成员变量,普通方法。 子类也是这样,然后继承之后,关于程序打印输出的结果。 涉及到...
  • qq_27093465
  • qq_27093465
  • 2017-04-20 19:30:32
  • 2269
收藏助手
不良信息举报
您举报文章:Java中初始化顺序
举报原因:
原因补充:

(最多只允许输入30个字)