由于Java对象构造非常重要,所以Java提供了多种编写构造器的机制。

  1.重载

  如果多个方法有相同的名字、不同的参数,便产生了重载。编译器必须挑选出具体执行哪个方法,它通过用各个方法给出的参数类型与特定方法调用所使用的值类型进行匹配来挑选出相应的方法。例如在下面的示例程序中,在创建第一位员工对象时执行第一个Empoyee构造器,在创建第二位员工对象时执行第二个Empoyee构造器,在创建第三位员工对象时执行第三个Empoyee构造器。

  2.默认域初始化

  如果在构造器中没有显式地给域赋值,那么就会被自动地赋为默认值:数值为0、布尔值为false、对象引用为null。如果不明确地对域进行初始化,就会影响程序代码的可读性。

  3.无参数的构造器

  对象由无参数构造函数创建时,其状态会设置为适当的默认值。如示例代码中,第三种重构方法Empoyee()就是无参数的构造函数。如果在编写一个类时没有编写构造函数,那么系统就会提供一个无参数构造器,这个构造器将所有的实例域设置为默认值。

  4.显示域初始化

  在执行构造器之前,先执行赋值操作。当一个类的所有构造器都希望把相同的值赋予某个特定的实例域是,这种方式特别有用。初始值不一定是常量值,可以调用方法对域进行初始化。如示例程序中的private String name = ""; // 实例域初始化,就是在每一个重载构造器初始化的时候都将name设置为""。

  5.参数名

  在参数命名上有两种方法。

  通常是这种方法,但是只有阅读代码才能够了解参数n和参数s的含义。

    public Employee(String n, double s)
{
name = n;
salary = s;
}

  于是第一种常用方法是这种,在每个参数前面加上一个前缀“a”。

   public Employee(String aName, double aSalary)
{
name = aName;
salary = aSalary;
}

  第二种方法是为了让参数变量用相同的名字将实例域屏蔽起来。但是,如果将参数命名为salary,则salary将引用这个参数,而不是实例域。因此,可以采用this.salary的形式来访问实例域。之前的知识中介绍过,this指示隐式参数,也就是所构造的对象。

   public Employee(String name , double salary )
{
this.name = name ;
this.salary = salary ;
}

  6.调用另一个构造器

  如示例程序所示,当调用new Employee(60000)时,Employee(double)构造器将调用Employee(String, double)构造器。采用这种方式可以对公共构造器代码部分只编写一次即可。

  7.初始化块

  如果无论使用哪个构造器构造对象,域都在对象初始化块中被初始化时可以使用对象初始化块。先运行初始化块,再运行构造器主题部分。示例中的id域即为对象初始化块。  

  如果对类的静态域进行初始化的代码比较复杂,那么可以使用静态的初始化块。也就是将代码放在一个块中,并标记关键字static。示例中的nextId即为静态代码块初始化。

  下面先给一段程序来说明构造器的多种特性应用。

 package BigJunOba.bjtu.ConstructorTest;

 import java.util.*;

 public class ConstructorTest
{
public static void main(String[] args)
{
Employee[] staff = new Employee[3]; staff[0] = new Employee("Harry", 40000);
staff[1] = new Employee(60000);
staff[2] = new Employee(); for (Employee e : staff)
System.out.println("name=" + e.getName() + ",id=" + e.getId() + ",salary="
+ e.getSalary());
}
} class Employee
{
private static int nextId; private int id;
private String name = ""; // 实例域初始化
private double salary; // 静态初始化块
static
{
Random generator = new Random();
// 设置nextId为0到9999的随机数
nextId = generator.nextInt(10000);
} // 对象初始化块
{
id = nextId;
nextId++;
} // 重载构造器第一种Employee(String, double)
public Employee(String n, double s)
{
name = n;
salary = s;
} // 重载构造器第二种Employee(double)
public Employee(double s)
{
// 用this调用另一个构造器,即调用Employee(String, double)构造器
this("Employee #" + nextId, s);
} // 重载构造器第三种,即默认构造器Employee()
// 也是无参数构造器,其状态会设置为适当的默认值
public Employee()
{
// name在实例域初始化中被设置为""
// salary没有被显示设置,因此初始化为默认值0
// id在对象初始化块中被设置为nextId
} public String getName()
{
return name;
} public double getSalary()
{
return salary;
} public int getId()
{
return id;
}
}

  输出结果:

name=Harry,id=6611,salary=40000.0
name=Employee #6612,id=6612,salary=60000.0
name=,id=6613,salary=0.0

Java基础(一)对象构造的更多相关文章

  1. java基础(二) -对象和类

    Java 对象和类 Java作为一种面向对象语言.支持以下基本概念: 多态 继承 封装 抽象 类 对象 实例 方法 重载 对象:对象是类的一个实例(对象不是找个女朋友),有状态和行为.例如,一条狗是一 ...

  2. JAVA基础之对象的初始化

    本文主要记录JAVA中对象的初始化过程,包括实例变量的初始化和类变量的初始化以及 final 关键字对初始化的影响.另外,还讨论了由于继承原因,探讨了引用变量的编译时类型和运行时类型 一,实例变量的初 ...

  3. Java基础03-12_对象比较

    对象比较 如果说现在有两个数字要判断是否相等,可以使用"=="完成 如果是字符串要判断是否相等使用"equals()" 但是如果说现在有一个自定义的类,要想判断 ...

  4. java 输入输出 函数对象构造

    /*********************输入输出*******************/   //输入字符串 不包括最后的换行符'\n'     import java.io.BufferedRe ...

  5. java基础(一)对象

    对象的创建 Test test = new Test(); Test test = new Test("a"); 其实,对象被创建出来时,对象就是一个对象的引用,这个引用在内存中为 ...

  6. Java基础---其他对象

    第一讲     System类 一.概述 1.System是描述系统一些信息的类,类中的属性和方法都是静态的.不能被实例化,没有提供构造函数. 2.字段摘要 out:标准输出流.默认是控制台. in: ...

  7. Java基础 -- 持有对象(容器)

    一 容器的用途 如果对象的数量与生命周期都是固定的,自然我们也就不需要很复杂的数据结构. 我们可以通过创建引用来持有对象,如 Class clazz; 也可以通过数组来持有多个对象,如 Class[] ...

  8. Java 基础之一对象导论

    对象导论 1.1 抽象过程 所有编程语言都提供抽象机制.人们所能解决的问题的复杂性直接取决于抽象的类型和质量. 汇编语言是对底层机器的轻微抽象. 我们将问题空间中的元素及其再解空间中的表示称为对象.这 ...

  9. Java基础之对象序列化

    1. 什么是Java对象序列化 Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长.但在现 ...

  10. Java基础 ----- 判断对象的类型

    1. 判断对象的类型:instanceOf 和 isInstance 或者直接将对象强转给任意一个类型,如果转换成功,则可以确定,如果不成功,在异常提示中可以确定类型 public static vo ...

随机推荐

  1. Unity项目 - DeathtrapDungeon死亡地牢

    目录 游戏原型 项目演示 绘图资源 代码实现 注意事项 技术探讨 参考来源 游戏原型 死亡地牢是一款 2D-Roguelike 的地牢冒险游戏.手握利刃,斩杀怪物,在凶险的地牢内生存下去.但注意,敌人 ...

  2. HashMap和Hashtable的联系和区别

    实现原理相同,功能相同,底层都是哈希表结构,查询速度快,在很多情况下可以互用,早期的版本一般都是安全的. HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分 ...

  3. mysql 对返回字段进行拼接

    使用concat函数进行拼接:示例如下: select id,username,concat( id, '-' , username) as idName from user;

  4. JavaScript系列:函数式编程(开篇)

    前言: 上一篇介绍了 函数回调,高阶函数以及函数柯里化等高级函数应用,同时,因为正在学习JavaScript·函数式编程,想整理一下函数式编程中,对于我们日常比较有用的部分. 为什么函数式编程很重要? ...

  5. Spark 学习笔记之 共享变量

    共享变量: 共享变量通常情况下,当向Spark操作(如map,reduce)传递一个函数时,它会在一个远程集群节点上执行,它会使用函数中所有变量的副本.这些变量被复制到所有的机器上,远程机器上并没有被 ...

  6. ECMAScript6 VS TypeScript

    如果你真正使用过Typescript你会发现他其实是javascript的超集, 这是一个非常简洁的描述 ,之所以称之为Typescript,正是Type一词的表述(强类型),可不仅仅是有一个Clas ...

  7. mysql配置默认字符集为UTF8mb4

    [client] default-character-set=utf8mb4 [mysqld] character-set-server = utf8mb4 collation-server = ut ...

  8. MySQL 视图(合并多表数据)引发的严重性能问题

    问题背景: 一.客户环境连续多次出现性能问题,系统登入异常,数据库CPU告警. 处理过程: 1>协助排查数据库性能问题时发现如下两个较频繁的SQL导致严重的性能问题(均使用了视图合并多表数据): ...

  9. Unreal Engine 4 系列教程 Part 2:蓝图教程

    .katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...

  10. django渲染高阶

    08.16自我总结 django渲染高阶 一.利用母版渲染 1.创建母版文件 如:stamper.html <!DOCTYPE html> <html lang="en&q ...