博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深入构造器
阅读量:5143 次
发布时间:2019-06-13

本文共 4100 字,大约阅读时间需要 13 分钟。

分类:

构造器是一个特殊的方法,这个特殊方法用于创建实例时执行初始化。构造器是创建对象的重要途径(即使使用工厂模式、反射灯方式创建对象,其实质依赖于构造器),因此,Java 类必须包含一个或一个以上的构造器。

1,使用构造器执行初始化

构造器最大的用处就是在创建对象时执行初始化。前面已经介绍过了,当创建一个对象时,系统为这个队的 Field 进行默认初始化,这种默认的初始化把所有基本类型的 Field 设为0 (对数值型 Field)或 false (对布尔型 Field),把所有引用类型的 Field 设为 null。

如果想改变这个默认的初始化,想让系统创建队形时就为该对象的 Field 显示指定初始值,就可以通过构造器来实现。

(如果程序员没有为 Java 类提供任何构造器,则系统会为这个类提供一个无参数的构造器,这个构造器的执行体为空,不做任何事情。无论如何,Java 类至少包含一个构造器。)

 

[java]
  1. package com.sym.test;  
  2.   
  3. public class ConstructorTest {  
  4.     public String name;  
  5.     public int count;  
  6.     //提供自定义的构造器,该构造器包含两个参数   
  7.     public ConstructorTest(String name, int count){  
  8.         //构造器里的this 代表它进行初始化的对象   
  9.         //下面两行代码将传入的2个参数赋给this代表对象   
  10.         this.name = name;  
  11.         this.count = count;  
  12.     }  
  13.     public static void main(String[] args) {  
  14.         //使用自定义的构造器来创建对象   
  15.         //系统将会对该对象执行自定义的初始化   
  16.         ConstructorTest to = new ConstructorTest("Java", 9000);  
  17.         //输出ConstructorTest对象的name 和 count 两个 Field   
  18.         System.out.println(to.name);  
  19.         System.out.println(to.count);  
  20.     }  
  21. }  
package com.sym.test;public class ConstructorTest {	public String name;	public int count;	//提供自定义的构造器,该构造器包含两个参数	public ConstructorTest(String name, int count){		//构造器里的this 代表它进行初始化的对象		//下面两行代码将传入的2个参数赋给this代表对象		this.name = name;		this.count = count;	}	public static void main(String[] args) {		//使用自定义的构造器来创建对象		//系统将会对该对象执行自定义的初始化		ConstructorTest to = new ConstructorTest("Java", 9000);		//输出ConstructorTest对象的name 和 count 两个 Field		System.out.println(to.name);		System.out.println(to.count);	}}
运行上面程序,将看到输出 ConstructorTest 对象时, 它的 name 实例 Field 不再是 null,而且 count 实例 Field 也不再是0,这就是提供自定义构造器的作用。

 

一旦程序员提供了自定义的构造器,系统就不再提供默认的构造器,因此上面的 ConstructorTest类不能再通过 new ConstrutorTest() 代码来创建实例,因为该类不再包含无参数的构造器。

2,构造器重载

同一个类里具有多个构造器,多个构造器的形参列表不同,即被称为构造器重载。

[java]
  1. package com.sym.test;  
  2.   
  3. public class ConstructorOverload {  
  4.     public String name;  
  5.     public int count;  
  6.     //提供无参数的构造器   
  7.     public ConstructorOverload(){}  
  8.     //提供带两个参数的构造器   
  9.     //对该构造器返回的对象执行初始化   
  10.     public ConstructorOverload(String name, int count){  
  11.         this.name = name;  
  12.         this.count = count;  
  13.     }  
  14.       
  15.     public ConstructorOverload(String name){  
  16.         this.name = name;  
  17.     }  
  18.     public static void main(String[] args) {  
  19.         //通过无参数构造器创建 ConstructorOverload 对象   
  20.         ConstructorOverload oc1 = new ConstructorOverload();  
  21.         //通过有参数构造器创建 ConstructorOverload 对象   
  22.         ConstructorOverload oc2 = new ConstructorOverload("Java", 1000);  
  23.           
  24.         System.out.println(oc1.name + "   " + oc1.count);  
  25.         System.out.println(oc2.name + "   " + oc2.count);  
  26.     }  
  27. }  
package com.sym.test;public class ConstructorOverload {	public String name;	public int count;	//提供无参数的构造器	public ConstructorOverload(){}	//提供带两个参数的构造器	//对该构造器返回的对象执行初始化	public ConstructorOverload(String name, int count){		this.name = name;		this.count = count;	}		public ConstructorOverload(String name){		this.name = name;	}	public static void main(String[] args) {		//通过无参数构造器创建 ConstructorOverload 对象		ConstructorOverload oc1 = new ConstructorOverload();		//通过有参数构造器创建 ConstructorOverload 对象		ConstructorOverload oc2 = new ConstructorOverload("Java", 1000);				System.out.println(oc1.name + "   " + oc1.count);		System.out.println(oc2.name + "   " + oc2.count);	}}

 

下面代码实现了在一个构造器中直接使用另一个构造器的初始化代码。

 

[java]
  1. package com.sym.test;  
  2.   
  3. public class Apple {  
  4.     public String name;  
  5.     public String color;  
  6.     public double weight;  
  7.     public Apple(){}  
  8.       
  9.     //两个参数的构造器   
  10.     public Apple(String name, String color){  
  11.         this.name = name;  
  12.         this.color = color;  
  13.     }  
  14.     //三个参数的构造器   
  15.     public Apple(String name, String color, double weight){  
  16.         //通过 this 调用另一个重载的构造器的初始化代码   
  17.         this(name, color);  
  18.         //下面 this 引用该构造器正在初始化的 Java 对象   
  19.         this.weight = weight;  
  20.     }  
  21. }  
package com.sym.test;public class Apple {	public String name;	public String color;	public double weight;	public Apple(){}		//两个参数的构造器	public Apple(String name, String color){		this.name = name;		this.color = color;	}	//三个参数的构造器	public Apple(String name, String color, double weight){		//通过 this 调用另一个重载的构造器的初始化代码		this(name, color);		//下面 this 引用该构造器正在初始化的 Java 对象		this.weight = weight;	}}

 

上面的 Apple 类里包含了三个构造器,其中第三个构造器通过this来调用另一个重载构造器的初始化代码。程序中this(name, color): 调用表名调用该类另一个有两个字符串参数的构造器。

使用this 调用另一个重载的构造器只能在构造器中使用,而且必须作为构造器执行体的第一条语句。使用this 调用重载的构造器时,系统会根据 this 后括号里的实参来调用形参列表与之对应的构造器。(好处是,代码好维护,不需要更改大量代码。)

转载于:https://www.cnblogs.com/ling2/p/4325310.html

你可能感兴趣的文章
oracle 创建暂时表
查看>>
201421410014蒋佳奇
查看>>
Xcode5和ObjC新特性
查看>>
LibSVM for Python 使用
查看>>
Centos 7.0 安装Mono 3.4 和 Jexus 5.6
查看>>
CSS属性值currentColor
查看>>
java可重入锁reentrantlock
查看>>
浅谈卷积神经网络及matlab实现
查看>>
解决ajax请求cors跨域问题
查看>>
《收获,不止Oracle》pdf
查看>>
LinkedList<E>源码分析
查看>>
Real-Time Rendering 笔记
查看>>
如何理解HTML结构的语义化
查看>>
Activity之间的跳转:
查看>>
实验四2
查看>>
Android现学现用第十一天
查看>>
多路复用
查看>>
Python数据可视化之Pygal(雷达图)
查看>>
Java学习笔记--字符串和文件IO
查看>>
转 Silverlight开发历程—(画刷与着色之线性渐变画刷)
查看>>