关于对象构造的一些认识。

默认域初始化

如果在构造器中没有显示地给域赋予初值,那么就会被自动地赋予默认值:数值为0,布尔值为false,对象引用为null。然而,这显然是不安全的,在一个null引用上调用方法结果是不可预期的。

class Employee{
private String name;
private double salary;
}

无参数构造器

每个类都包含一个无参数构造函数,对象由无参数构造函数创建时,其状态会设置为适当的默认值。如果程序没有编写构造器,则这个构造器会将所有实例域设置为默认值:数值为0,布尔值为false,对象引用为null。

如果类中提供了至少一个构造器,但是没有提供无参数构造器,那么在构造对象时没有提供参数将视为不合法。也就是说:仅当类没有提供任何构造器时,系统才会提供一个默认的构造器。

class Employee{
private String name;
private double salary;
public Employee(){  //相当于系统提供的默认构造函数
this.name = null;
this.salary = 0;
}
}

显示域初始化

显示地设置类的实例域的初始状态,确保不管调用任何构造器,每个实例域都可以设置为一个有意义的值,这是一种良好的设计习惯。

class Employee{
private String name="张三";
private double salary=30000;
public Employee(){  
   this.name = "张三";
   this.salary = "30000"  
}

构造器方法重载

如果多个方法有相同的名字,不同的参数,便产生了重载。构造器方法也支持重载。编译器通过用各个方法给出的参数类型和特定方法调用所使用值的类型进行匹配来执行相应的方法。若无匹配则会产生编译错误。

class Employee{
private String name;
private double salary;
public Employee(){  //构造器一
  this.name = "张三";
    this.salary = "30000"  
}
public Employee(string name){  //构造器二  
this.name = name;
this.salary = "20000";
}
}

调用另一个构造器

如果构造器第一个语句形如this(...),这个构造器将调用同一个类的另一个构造函数。

class Employee{
private String name;
private double salary;
public Employee(double salary){  //构造器一
this("李四",salary);  //将调用构造器二 
}
public Employee(String name,double salary){  //构造器二
this.name = name;
this.salary = "20000";
}
}

初始化块和初始化语句

在一个类的声明中,可以包含多个代码块,只要构造对象,这些块就会被执行。

class Employee{
private String name="李四"; //初始化语句
private double salary; 
  { //初始化块
salary = "10000";
}
public Employee(){
this.name = "张三";
  this.salary = "30000"  
}
}

调用构造器的具体步骤

1)所有数据域被初始化为默认值

2)按照在类声明中出现的次序,依次执行所有域初始化语句和初始化块。

3)如果被调用的构造器第一行调用了另一个构造器,则执行那个构造器主体。

4)执行这个构造器主体。

实例:

 1 import java.util.Random;
2
3
4 public class ConstructorTest{
5 public static void main(String[] args){
6 Employee[] staff = new Employee[3];
7
8 staff[0] = new Employee("Harry",40000);//调用构造器一
9 System.out.println("name=" + staff[0].getName() +",id=" + staff[0].getId() + ",salary=" + staff[0].getSalary());
10 staff[1] = new Employee(60000);//调用构造器二
11 System.out.println("name=" + staff[1].getName() +",id=" + staff[1].getId() + ",salary=" + staff[1].getSalary());
12 staff[2] = new Employee();//调用构造器三,与不提供构造器时系统的默认构造器相同
13 System.out.println("name=" + staff[2].getName() +",id=" + staff[2].getId() + ",salary=" + staff[2].getSalary());
14 }
15 }
16
17
18 class Employee {
19 private static int nextID;
20 private int id;
21 private String name="";//初始化语句
22 private double salary;
23
24 static { //静态初始化块
25 System.out.println("静态块初始化");
26 Random generator = new Random();
27 nextID = generator.nextInt(10000);
28 }
29 { //初始化块
30 System.out.println("普通初始化块");
31 id = nextID;
32 nextID++;
33 }
34
35 public Employee(String name,double salary){//构造器一
36 this.name = name;
37 this.salary = salary;
38 }
39
40 public Employee(double salary){//构造器二
41 this("Emploee #" + nextID, salary);
42 }
43
44 public Employee(){//构造器三
45
46 }
47
48 public String getName() {
49 return name;
50 }
51
52 public double getSalary() {
53 return salary;
54 }
55
56 public int getId() {
57 return id;
58 }
59 }

运行结果:

静态块初始化
普通初始化块
name=Harry,id=5376,salary=40000.0
普通初始化块
name=Emploee #5377,id=5377,salary=60000.0
普通初始化块
name=,id=5378,salary=0.0

静态块只运行了一次的原因时因为静态块在类加载时运行的,而不是在创建对象时运行的。在程序的整个生命期值也只运行一次。详情可看java类加载过程。

Java对象构造的更多相关文章

  1. Java基础(一)对象构造

    由于Java对象构造非常重要,所以Java提供了多种编写构造器的机制. 1.重载 如果多个方法有相同的名字.不同的参数,便产生了重载.编译器必须挑选出具体执行哪个方法,它通过用各个方法给出的参数类型与 ...

  2. Java中对象构造

    构造函数 作用:在构造对象的同时初始化对象.java强制要求对象 诞生同时被初始化,保证数据安全. 调用过程和机制:①申请内存,②执行构造函数的函数体,③返回对象的引用. 特点:与类同名,无返回类型, ...

  3. Java内存结构、类的初始化、及对象构造过程

    概述 网上关于该题目的文章已经很多,我觉得把它们几个关联起来讲可能更好理解一下.与其它语言一样,它在执行我们写的程序前要先分配内存空间,以便于存放代码.数据:程序的执行过程其实依然是代码的执行及数据的 ...

  4. Java对象的强、软、弱和虚引用原理+结合ReferenceQueue对象构造Java对象的高速缓存器

    //转 http://blog.csdn.net/lyfi01/article/details/6415726 1.Java对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变 ...

  5. Java之对象构造过程

    先来运行一段代码 class A { public A() { init(); } public void init() { } public static void main(String[] ar ...

  6. 零基础学Java(14)对象构造

    对象构造 之前学习了编写简单的构造器,可以定义对象的初始状态.但是,由于对象构造非常重要,所以Java提供了多种编写构造器的机制. 重载 有些类有多个构造器.例如,可以如下构造一个空的StringBu ...

  7. XML解析---利用XStream解析xml数据及反构造Java对象

    XStream 是一个轻量级的.简单易用的开放源代码 Java库,用于将 Java 对象序列化为 XML 或者再转换回来.而且XStream还能将java对象转成其它格式,比如JSon. 需要用到的包 ...

  8. Java对象序列化剖析

    对象序列化的目的 1)希望将Java对象持久化在文件中 2)将Java对象用于网络传输 实现方式 如果希望一个类的对象可以被序列化/反序列化,那该类必须实现java.io.Serializable接口 ...

  9. json相关类库,java对象与json相互转换

    有效选择七个关于Java的JSON开源类库 转自:http://www.open-open.com/lib/view/open1397870197828.html 翻译: (英语原文:http://w ...

随机推荐

  1. Pytest-Allure报告的Logo的完美定制

    --本次需求:如何把生成的pytest-allure报告的logo修改成自定义的logo? --步骤如下: --1.找到本地电脑安装的allure-2.13.2路径E:\allure-2.13.2\p ...

  2. NOIP 模拟 $34\; \rm Rectangle$

    题解 \(by\;zj\varphi\) 对于没有在同一行或同一列的情况,直接枚举右边界,左边界从大到小,用树状数组维护上下边界即可. 而对于有多个在一列或一行的情况,这些点将左右分成了几个区间,枚举 ...

  3. 题解—P2511 [HAOI2008]木棍分割

    这道题第一眼直接一个二分板子把第一问解决掉,然后主要是统计方案. 其实这个方程还不算难推,只要推出来朴素 \(dp\) ,之后的一步一步也很顺理成章,所以这种题主要看能不能静下心来慢慢做. solut ...

  4. [总结&搬运]用户测试101

    原文地址:User Testing 101 可用性测试是什么? 可用性测试是一种非常流行的用户研究方式.在可用性测试环节中,通常由主持人.参与者和测试任务三部分组成.主持人会发布测试任务,要求参与者使 ...

  5. C++ template模板编程

    模板是C++泛型编程的基础,一个模板就是一个创建类或者函数的蓝图或者公式.当使用一个vector这样的泛型类型,我们提供足够的信息,就可以将蓝图转换成特定的类或者函数. 假设我们编写一个函数来比较两个 ...

  6. 集合的打印、列表List、迭代器Iterators

    集合的打印 必须使用 Arrays.toString() 来生成数组的可打印形式. 但是打印集合无需任何帮助. /** * 集合的打印 * @author myf */ public class Pr ...

  7. 基于mysql和Java Swing的简单课程设计

    摘要 现代化的酒店组织庞大.服务项目多.信息量大.要想提高效率.降低成本.提高服务质量和管理水平,进而促进经济效益,必须利用电脑网络技术处理宾馆酒店经营数据,实现酒店现代化的信息管理.本次课程设计运用 ...

  8. idea项目在maven projects中显示灰色的解决办法。建新建module src变成标准的文件夹

    在使用idea的过程中,有时会遇到其中一个maven模块变成灰色(可以通过view - tool windows -> maven projects 现实),如下所示: 造成这个的原因可能是忽略 ...

  9. Helm on K8S

    前言 容器的出现,标志着云原生的到来,Docker 基于 Linux 隔离.虚拟化等能力封装了应用:Kubernetes 的出现,建立了云原生时代的技术基础设施,它基于对容器的编排封装了集群:Kube ...

  10. 前端 | 页面触底自动加载 Vue 组件

    不管是 web 端还是移动端,信息流都是现在很流行的信息展示方式.信息流经常搭配自动加载一起使用以获得更好的使用体验. 最近在使用 Vue 开发过程中也遇到了首页信息流自动加载的需求.大致了解了一下几 ...