由于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. 推荐5款自学手机APP,请低调收藏,让你变得越来越优秀

    现在的手机APP真的是太多了,但里面的功能同类性又非常大,很难找到实用并且符合要求的APP.接下来就为小伙伴们推荐5款非常实用的APP软件,保证你会爱不释手,轻松秒变手机达人. 1.清爽视频编辑器 一 ...

  2. 深度汉化GCompris-qt,免费的幼儿识字软件

    1 需求 因为有个小孩上幼儿园了,想开始教他一些汉语拼音和基本的汉字,但通过一书本和卡片又有些枯燥乏味,于上就上网搜索一些辅助认字的应用,还购买了悟空识字APP,在用的过程中发现他设置了很严格的关卡, ...

  3. Vue Element 导航子路由不选中问题

    首先说下遇到的问题 1.进入嵌套路由,当前父导航无法高亮显示 2.页面刷新后导航重置问题 3.在嵌套路由刷新页面也会导致导航重置问题 接下来是解决方案: elementUI 里面有个属性 defaul ...

  4. Spring Security 梳理 - session

    Spring Security默认的行为是每个登录成功的用户会新建一个Session.这也就是下面的配置的效果: <http create-session="ifRequired&qu ...

  5. Spring框架(三)

    对象依赖关系 Spring中,如何给对象的属性赋值?  [DI, 依赖注入] 1) 通过构造函数 2) 通过set方法给属性注入值 3) p名称空间 4)自动装配(了解) 5) 注解 代码示例: &l ...

  6. Kafka 学习笔记之 ZooKeeper作用

    Kafka使用ZooKeeper 配置管理 Leader Election 服务发现 首先进入ZooKeeper客户端: ls / 可以看到有以下节点: 查看Topic 配置信息:体现了ZooKeep ...

  7. 确认自己所用的python版本

    总结: 目前有两个版本的python处于活跃状态:python2,python3 有多种流行的python运行环境:cpython(应用最广泛的python解释器,如无对解释器有要求,一般用这个,默认 ...

  8. else块的用途

    除了在if...else...中使用,else块还可以在for循环.while循环以及try...except中使用. 在for循环中使用: my_list = ['a','b','c','d'] f ...

  9. [MVC]自定义模型绑定器,从表单对模型进行赋值

    一.奇葩的问题 之前自己造轮子的时候,遇到一个很奇怪的问题,虽然需求很奇葩,但是还是尝试解决了一下 当提交的表单里包含多个重复名称的字段的时候,例如 <form action="/Te ...

  10. 编译 lame for iOS

    网上找了许多编译lame的教程,结果都是编译失败,多次尝试后发现是编译脚本放错路径了,记录下编译的过程,把编译脚本放到源码文件夹中和修改编译脚本中的目录是关键: 一.首先去Lame官网 http:// ...