有一段时间没有看编程方面的书了,今天复习了一下java方面的知识,发现很多知识之前都了解甚浅,今天就先总结一下关于java构造器方面的知识深入了解。
首先讲一下什么是构造器:
构造器是一个和类名相同但是无返回值的方法,它在一个类中的作用是创建实例时执行初始化,是创建对象的重要途径。注:如果程序员没有为java类提供任何的构造器,系统会自动为这个类提供无参数的构造器,相反,如果有自定义的构造器,系统就不再提供默认的构造器
1 创建实例时执行初始化
创建一个对象时,系统会对这个对象的Field进行默认初始化,把所有的基本类型的Field设为0或false,所有引用类型的Filed设为null,使用构造器可以显示的改变Filed的初始值,,如:
public class ConstructorTest{ public String name; public int count; public ContructorTest(String name,int count) { this.name = name; this.count = count; } public static void main(String[] args) { ContructorTest ct = new ContructorTest("book",123333) System.out.printIn(ct.name); System.out.printIn(ct.count); } }
2 构造器是创建java对象的重要途径,但不是全部途径
实际上,当程序员调用构造器时,系统会先为该对象分配内存空间,并为这个对象执行默认初始化,此时这个对象已经产生了,而且这些操作都是在构造器执行之前就完成了,也就是说在系统执行构造器的执行体之前,系统已经创建了一个对象,只是这个对象还没被外部程序访问,只能在该构造器中通过this来引用
再来说一下构造器的重载问题:
一个类中可以有多个构造器,如果用户希望该类保留无参数的构造器,或者希望有多个初始化过程,则可以为该类提供多个构造器,一个类有多个构造器就形成了构造器的重载,,如:
public class ConstructorTest{ public String name; public int count; public ContructorTest() { } public ContructorTest(String name,int count) { this.name = name; this.count = count; } public static void main(String[] args) { ContructorTest ct1 = new ContructorTest(); ContructorTest ct2 = new ContructorTest("book",123333) System.out.printIn(ct1.name + "" +ct1.count); System.out.printIn(ct2.count + "" +ct2.count); } }
系统通过new调用构造器时,会根据传入的实例列表来决定调用哪个构造器。
当有多个构造器时,其中一个构造器A的执行体可能包含另一个构造器B的执行体B,当存在这种情况时,可在方法A中调用方法B,构造器不能被直接调用,必须使用new关键字来调用,但是在这里如果使用new关键字就会重新创建一个对象,在这种情况下,可以使用this关键字来调用相应的构造器,,如:
public class ConstructorTest{ public String name; public int count; public double weight; public ContructorTest() { } public ContructorTest(String name,int count) { this.name = name; this.count = count; } public ContructorTest(String name,int count,double weight) { this(name,count); //通过this直接调用上一个构造器的初始化代码 this.weight = weight; } }
注意:使用this调用另一个重载的构造器只能在构造器中使用,而且必须作为构造器执行体的第一条语句