Java构造器的实质作用
构造器的本质作用就是为对象初始化,即为实例变量初始化,赋初值; 而不是创建对象,创建对象时通过new关键字来完成的,当使用new 关键字时就会为该对象在堆内存中开辟一块内存,只等构造器来初始化这块内存,为实例变量赋初始值。在未赋初始值之前是默认值。看代码中的构造器和编译后构造器是不一样的,编译后的构造器包含了更多的内容。
非静态代码块一般是初始化实例变量的。编译后,非静态代码块中的代码会提取到构造器中,初始化实例变量的代码也提取到构造器中,他们在构造器中的排列顺序和他们在源码中的顺序一致,并且在构造器中原有代码的前面。
构造器负责初始化实例变量。
示例代码:
1package com.usoft7; 2 3/** 4 * Created with IntelliJ IDEA. 5 * User: ASUS 6 * Date: 14-3-29 7 * Time: 上午1:35 8 * To change this template use File | Settings | File Templates. 9 */ 10class User { 11 public String name; 12 13 { 14 System.out.println("非静态代码块---1"); 15 } 16 17 public int age; 18 19 User() { 20 System.out.println("User 无参构造"); 21 } 22 23 User(String name, int age) { 24 this.name = name; 25 System.out.println("name赋值完成"); 26 this.age = age; 27 System.out.println("age赋值完成"); 28 System.out.println("初始化完成----"); 29 } 30 31 { 32 System.out.println("非静态代码块---2"); 33 } 34 35 String getName() { 36 return name; 37 } 38 39 void setName(String name) { 40 this.name = name; 41 } 42 43 int getAge() { 44 return age; 45 } 46 47 void setAge(int age) { 48 this.age = age; 49 } 50} 51 52class Person { 53 public User u = new User(); 54 public User user = new User("helo", 12); 55 public String school; 56 57 Person() { 58 } 59 60 User getUser() { 61 return user; 62 } 63 64 void setUser(User user) { 65 this.user = user; 66 } 67 68 String getSchool() { 69 return school; 70 } 71 72 void setSchool(String school) { 73 this.school = school; 74 } 75} 76 77package com.usoft7; 78 79public class Test { 80 public static void main(String[] args) { 81 Person p = new Person(); 82 System.out.println("========" + p.u.getAge()); 83 System.out.println("========" + p.u.getName()); 84 System.out.println("-------------------------"); 85 System.out.println("========" + p.user.getAge()); 86 System.out.println("========" + p.user.getName()); 87 } 88}
打印结果,
1非静态代码块---1 2非静态代码块---2 3User 无参构造 4非静态代码块---1 5非静态代码块---2 6name赋值完成 7age赋值完成 8初始化完成---- 9========0 10========null 11------------------------- 12========12 13========helo
附:javac命令使用utf-8编码
E:\test-java\hh>javac -encoding utf-8 Test.java
总结:通过此实例可以很好的了解构造器的作用,静态块和非静态块。
理解实例变量的初始化(先分配内存再赋值)
====================END====================