构造器的执行顺序

上一篇 / 下一篇  2012-05-18 08:44:22 / 个人分类:Java

 1、在没有静态块的情况下,子类的对象创建时,父类的无参构造器-->子类的构造器(产生对象的构造器,如果是无参则执行的是无参构造器,如果执行的是有参则执行的有参构造器)。现在的父类中只有两个构造器:

  1. Father.java  
  2.  Father {  
  3.     public Father(){  
  4.         System.out.println("我是父类的无参构造器");  
  5.     }  
  6.        
  7.     public Father(String username){  
  8.         System.out.println("我是父类有参构造器,传过来的参数是+"+username);  
  9.     }  
  10. public class SonDemo extends Father{  
  11.    
  12.     public SonDemo(){  
  13.         System.out.println("我是--子类--的无参构造器");  
  14.     }  
  15.     public SonDemo(String username){  
  16.         System.out.println("我是子类的有参构造器,参数是"+username);  
  17.     }  
  18.        
  19.     public void sys(){  
  20.         System.out.println("我是子类的sys方法");  
  21.     }  
  22.        
  23.     public static void main(String[] args) {  
  24.         //里面的内容在下面有说明 
  25.     }  
  26.        
  27.        
  28.        
  29. }
51Testing软件测试网q!d n:|A1x S1?$C6d

  ① 子类使用无参构造器创建对象:

:B,A7cwl4w ]7OBJ0

L;N9n#G@n]6~0  在SonDemo 的main方法中加入创建对象的代码:

k'[$m_d#GPC0
  1. SonDemo son = new SonDemo();  
  2.        
  3. }

2W'Wo)d`a0  我是父类的无参构造器

O,W#O0T3Ci0

`8{#itLG0  我是--子类--的无参构造器

7\JjLET(`5q,\051Testing软件测试网A8?Q fI2Q"Fi&Y

  ② 子类使用有参构造器创建对象:51Testing软件测试网Z)Gz x+typ{K

j5Q6igecDJ!CZ3_K0  SonDemo的main方法中加入

L0g k7[ ^U-S)L0
SonDemo son = new SonDemo("than you ma");

4|3v ju&h]+v0  那么控制台打印的结果是:

8b T] vlb051Testing软件测试网MaVa.P;B

  我是父类的无参构造器51Testing软件测试网(] ph7H ~

51Testing软件测试网MO$l;t bucW6f

  我是子类的有参构造器,参数是than you ma

aX9Y(S?4_#Ot3E0

,ISEg"z0  也就是说在子类调用无参构造器创建对象的时候,在执行它自己的有参构造器之前首先执行父类的无参构造器。51Testing软件测试网@6P6n|,A

{x+kTZ~"V0  ③ 在子类中创建父类的对象,使用无参51Testing软件测试网,^&iY)h`d

  1. SonDemo son = new SonDemo("than you ma");  
  2. Father ff = new Father();

c+~!T{o8gi0  SonDemo的main方法中加入

#a7P7}0B*~z0

d{&o)\\#X$P OW0  我是父类的无参构造器51Testing软件测试网~#A7q a%V_E

51Testing软件测试网%n W&W]"r

  我是--子类--的无参构造器51Testing软件测试网HV,En n(l/s |

51Testing软件测试网R4[d*RIa

  我是父类的无参构造器51Testing软件测试网6[DnEW W E

51Testing软件测试网z;S:z-MyR d^

  调用了父类的无参构造器,有参的创建对象调用的是有参构造器。

CU7N6O!c:@%w051Testing软件测试网'n3e@k?D6QH.l

  总结:在创建子类对象的时候,首先会调用父类的构造器,让后在调用子类相应的构造器创建对象,在子类创建父类对象时,就是直接调用父类自己相应的构造器。

X2z6wj$Q2he P0 2、如果在子类和父类中存在静态块;执行顺序有会是怎么样的了?

U^Pi8Et j+PM0  答,静态块会在构造器之前运行。不管是子类还是父类。创建一个对象的时候,会首先加载它的静态块。

^-kc!U d@8S%kG051Testing软件测试网;W `;x,t{ i \

a}'P9YC+L0
  1. Father.java  
  2. public class Father {  
  3.    
  4.     //静态块 
  5.     static{  
  6.         System.out.println("father  static ");  
  7.     }  
  8.        
  9.     public Father(){  
  10.         System.out.println("我是父类的无参构造器");  
  11.     }  
  12.        
  13.     public Father(String username){  
  14.         System.out.println("我是父类有参构造器,传过来的参数是+"+username);  
  15.     }  
  16. }  
  17.    
  18. SonDemo.java  
  19. public class SonDemo extends Father{  
  20.     //静态块 
  21.     static{  
  22.         System.out.println("sonDemo static ");  
  23.     }  
  24.        
  25.     public SonDemo(){  
  26.         System.out.println("我是--子类--的无参构造器");  
  27.     }  
  28.     public SonDemo(String username){  
  29.         System.out.println("我是子类的有参构造器,参数是"+username);  
  30.     }  
  31.        
  32.     public void sys(){  
  33.         System.out.println("我是子类的sys方法");  
  34.     }  
  35.        
  36.     public static void main(String[] args) {  
  37.         SonDemo son = new SonDemo();  
  38.     }  
  39. }

e?QrS"z](x"U0  ① 程序的结果:

7x,^"f#Y9dq'\jg0

ePo6AG5J"^$f)E051Testing软件测试网%_ C6sq0Mut+Y|7qy

father static51Testing软件测试网(EB2X9BS0s9|}
sonDemo static
y\UpB`0我是父类的无参构造器51Testing软件测试网m%Y4~j&FSf$R$de
我是--子类--的无参构造器
51Testing软件测试网:Y A7lVm1]8[r!]

  因为在创建子类对象之前:会创建父类的一个对象,而静态块会在main之前被加载,所以两个类的静态块首先执行。51Testing软件测试网MEd"dLIXq

51Testing软件测试网 L Q3w2PDX(DZ4lc:Y

  然后执行构造器。

6\w&F9P9u A:r @`k051Testing软件测试网6E2}u(x(UM]1Y4K

  ② 如果在子类中的main中只创建父类的对象结果是怎么样的呢?51Testing软件测试网8?ux/i0u#X{ro K

51Testing软件测试网o*Rs|Q*K.e3[D1b

  打印结果:51Testing软件测试网~T"]@#c%Wt

iYa6k`i0

w Gc\ s0
father static51Testing软件测试网rBmW(}sH
sonDemo static
X)Y9P v6\1Mz*P![0我是父类的无参构造器

{ r5{Y.r$Q0  为什么子类的静态块会被加载了?是因为我们是在SonDemo中测试,如果在其他类中测试就不会打印。

#}4@0h4^,` Oev%a Z051Testing软件测试网g%kYwE Ydp"F

  总结:我们说了这么多就是重要的一点。静态块会在构造器器之前执行。

'MQvBlA)G7QxC0

TAG:

 

评分:0

我来说两句

Open Toolbar