`
poyunri
  • 浏览: 29660 次
文章分类
社区版块
存档分类
最新评论

4.6 对象构造

 
阅读更多
4.6.1 重载
多个构造器或多个方法采用相同的名字唯一区别是每个构造器或方法指定的参数类型或参数个数不同。这种特征就叫做重载。

4.6.2 默认域初始化
在构造器中没有给域赋初值,则会自动被赋值:数值为0、布尔值为flase、引用值为null。

4.6.3 默认构造器
当且仅当类中没有提供任何一个构造器时,才会自动生成一个默认的构造器。

4.6.4 显示域初始化
1、在类定义中直接将一个值赋给任何域。例如:
class Employee {
....
private String name = "..."
}
这种方法适用于当一个类中所有构造器都希望把相同的值赋给某个特定实例域。

2、初始值不一定是常量。可以调用方法对域进行初始化。例如:
class Employee {
...
static int assignId() {
int r = nextId;
nextId++;
return r;
}
...
private int id = assingnId();
}

6.6.5 参数名
有三种常见命名法:
1、用单个字符命名:
public Employee(String n, double s) {
name = n;
salary = s;
}
缺陷:只有阅读代码通过上下文才能理解参数n和s的含义。

2、每个参数前加a:
public Employee(String aName, double aSalary) {
name = aName;
salary = aSalary;
}
推荐使用这种命名法,每个读者一眼就知道每个参数的含义。

3、使用this指示隐式参数,也就是被构造的对象:
public Employee(String name, double salary) {
this.name = name;
this.salary = salary;
}

4.6.6 调用另一个构造器
关键字this除了引用方法的隐式参数外,还有另一个含义:
构造器的第一个语句形如this(...),这个构造器将调用同类的另一个构造器。
public Employee(double aSalary) {
//调用Employee(String,double)
this("Employee #" + nextId, aSalary);
nextId++;
}
解读:当调用new Employee(6000)时,Employee(double)构造器将调用Employee(String double)构造器。

4.6.7 初始化块
之前已经学了两种初始化数据域的方法:
1)在构造器中赋值
2)在声明中赋值
第三种是初始化块,这种机制不是必须的也不常用,所以略过。常用的是第一种:在构造器中初始化数据域。

总结调用构造器的处理步骤:
1)所有数据域被初始化为默认值;
2)按照声明中的顺序依次执行域初始化语句和初始化快;
3)如果构造器的第一句调用了第二个构造器,则执行第二个构造器主体;
4)执行构造器主体

本节源代码展示:例4-5
1)重载构造器
2)用this(...)调用另一个构造器
3)默认构造器
4)对象初始化块
5)静态域初始化块
6)实例域初始化

ConstructorTest.java
package com.vincent.javacore.constructortest;

public class ConstructorTest {
	public static void main(String[] args) {
		Employee[] staff = new Employee[3];
		staff[0] = new Employee("Harry", 4000);
		staff[1] = new Employee(6000);
		staff[2] = new Employee();
		
		for (Employee e : staff) 
			System.out.println("name: " + e.getName() 
					+ ", id: " + e.getId()
					+ ", salary: " + e.getSalary());
	}

}

Employee.java
package com.vincent.javacore.constructortest;

import java.util.Random;

public class Employee {
	
	private static int nextId;
	private int id;
	private String name = "";
	private double salary;

	//三个重载构造器
	public Employee(String aName, double aSalary) {
		name = aName;
		salary = aSalary;
	}
	
	public Employee(double aSalary) {
		//调用Employee(String, double)构造器
		this("Employee #" + nextId, aSalary);
	}
	
	//不会执行的构造器
	public Employee() {
		//初始化为默认值
	}
	
	public String getName() {
		return name;
	}
	
	public double getSalary() {
		return salary;
	}
	
	public int getId() {
		return id;
	}
	
	static {
		//构造一个新的随机数生成器
		Random generator = new Random();
		//nextId在0~9999中随机产生
		nextId = generator.nextInt(10000);
	}
	//初始化域块
	{
		id = nextId;
		nextId++;
	}
}

运行结果:
name: Harry, id: 4070, salary: 4000.0
name: Employee #4071, id: 4071, salary: 6000.0
name: , id: 4072, salary: 0.0
分享到:
评论

相关推荐

    JAVA_《JAVA面向对象程序设计》实验报告_drawing_

    测试二要求如下:(1)利用构造方法创建一个具有长宽高分别为2.5、6.8和8.0的长方体对象cuboidB,然后利用setLength()方法修改length为4.6;(2)调用getArea()方法计算表面积;(3)调用getCubage计算该长方体的体积。

    写给大家看的面向对象编程书(第3版).[美]Matt Weisfeld(带详细书签).pdf

    4.6 公共接口方法 63 4.7 私有实现方法 64 4.8 小结 64 4.9 参考书目 64 4.10 本章使用的示例代码 65 4.10.1 TestCab示例:C#.NET 65 4.10.2 TestCab示例:VB.NET 66 第5章 类设计指导原则 68 5.1 真实世界...

    设计模式:可复用面向对象软件的基础--详细书签版

    4.6 flyweight(享元)—对象结构型 模式 128 4.7 proxy(代理)—对象结构型 模式 137 4.8 结构型模式的讨论 144 4.8.1 adapter与bridge 144 4.8.2 composite、decorator与proxy 145 第5章 行为模式 147 ...

    C++ 面向对象教程 21 courses#

    4.6 集合初始化 65 4.7 缺省构造函数 67 4.8 小结 68 4.9 练习 68 第5章 函数重载与缺省参数 69 5.1 范围分解 69 5.1.1 用返回值重载 70 5.1.2 安全类型连接 70 5.2 重载的例子 71 5.3 缺省参数 74 5.4 小结 81 5.5 ...

    JavaPD-Ch04mao 类与对象 线下班1

    4.1 面向对象编程 4.2 类声明和类体 4.3 类体的构成 4.4 构造方法与对象的创建 4.5 对象的引用与实体 4.6 成员变量 4.7 方法 4.8

    第4章-Java面向对象程序设计-Java语言GUI程序设计-赵满来-清华大学出版社.pptx

    4.1 类的方法 4.2 类封装与访问控制 4.3 类的继承 4.4 多态性 4.5 接口 4.6 Java的内部类 4.7 Lambda表达式初步 第4章-Java面向对象程序设计-Java语言GUI程序设计-赵满来-清华大学出版社全文共51页,当前为第2页。...

    C++和面向对象数值计算

    4.6 流标准函数库 4.6.1 整数格式化输出 4.6.2 浮点数格式化输出 4.6.3 输出宽度 4.6.4 文件的输入输出 4.6.5 字符的输入输出 4.6.6 字符串流 4.7 非线性方程的迭代解法 4.7.1 二分法 ...

    JavaScript基础和实例代码

    6.7.2 使用Function对象构造函数 6.7.3 常见属性和方法汇总 6.8 Object对象 6.8.1 创建Object对象的实例 6.8.2 常见属性和方法列表 6.9 本章小结 第7章 Window及相关顶级对象 7.1 顶级对象模型参考 7.2 Window对象 ...

    编写类MyDate

    2.1 无参数构造方法public MyDate(),以当前的系统时间构造MyDate对象 2.2 public MyDate(int year, int month, int day), 以指定的年月日构造MyDate对象 3.该类有如下属性 3.1 private int year ;//年 3.2 private ...

    源文件程序天下JAVASCRIPT实例自学手册

    6.7.2 使用Function对象构造函数 6.7.3 常见属性和方法汇总 6.8 Object对象 6.8.1 创建Object对象的实例 6.8.2 常见属性和方法列表 6.9 本章小结 第7章 Window及相关顶级对象 7.1 顶级对象模型参考 7.2 Window对象 ...

    AutoCAD 2016视频课程2-二维课程

    5.4构造对象.flv 5.5使用夹点编辑对象.flv 5.6通过双击编辑对象.flv 5.7 对象编组.flv 5.8综合实战——绘制古典窗户立面图.flv 5.9高手私房菜.flv 6.1绘制多线.avi 6.2绘制多段线.avi 6.3绘制样条曲线.avi 6.4绘制面...

    JavaScript权威指南(第6版)(附源码)

    4.6 对象创建表达式 4.7 运算符概述 4.8 算术表达式 4.9 关系表达式 4.10 逻辑表达式 4.11 赋值表达式 4.12 表达式计算 4.13 其他运算符 第5章 语句 5.1 表达式语句 5.2 复合语句和空语句 5.3 声明语句 5.4 条件...

    JavaScript 权威指南(第四版).pdf

     4.6 对象创建表达式64  4.7 运算符概述65  4.8 算术表达式69  4.9 关系表达式74  4.10 逻辑表达式79  4.11 赋值表达式81  4.12 表达式计算83  4.13 其他运算符86  第5章 语句91  5.1 表达式语句92  5.2 ...

    JavaScript权威指南(第6版)中文版pdf+源代码

     4.6 对象创建表达式64  4.7 运算符概述65  4.8 算术表达式69  4.9 关系表达式74  4.10 逻辑表达式79  4.11 赋值表达式81  4.12 表达式计算83  4.13 其他运算符86  第5章 语句91  5.1 表达式语句92  5.2 ...

    C# 基础教程

    4.6 对象的清除和资源管理 43 4.7 继承 43 4.7.1 多接口 45 4.7.2 封装类 45 4.8 本章小结 46 4.9 实战演练 47 第五章 方法 48 5.1方法参数“REF”和“OUT” 48 5.2 方法重载 51 5.3虚拟方法 53 5.3.1方法覆盖 53 ...

    零起点学通C++多媒体范例教学代码

    11.10.2 通过构造函数将变量转换为一个对象的成员变量 11.10.3 通过operator关键字进行转换 11.11什么可以重载,什么不可以重载 第12章 继承 12.1 什么是继承和派生 12.1.1 复杂的继承和派生 12.1.2 继承和派生如何...

    零起点学通C++学习_多媒体范例教学代码

    11.10.2 通过构造函数将变量转换为一个对象的成员变量 11.10.3 通过operator关键字进行转换 11.11什么可以重载,什么不可以重载 第12章 继承 12.1 什么是继承和派生 12.1.1 复杂的继承和派生 12.1.2 继承和...

Global site tag (gtag.js) - Google Analytics