Java对象构造
关于对象构造的一些认识。
默认域初始化
如果在构造器中没有显示地给域赋予初值,那么就会被自动地赋予默认值:数值为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对象构造的更多相关文章
- Java基础(一)对象构造
由于Java对象构造非常重要,所以Java提供了多种编写构造器的机制. 1.重载 如果多个方法有相同的名字.不同的参数,便产生了重载.编译器必须挑选出具体执行哪个方法,它通过用各个方法给出的参数类型与 ...
- Java中对象构造
构造函数 作用:在构造对象的同时初始化对象.java强制要求对象 诞生同时被初始化,保证数据安全. 调用过程和机制:①申请内存,②执行构造函数的函数体,③返回对象的引用. 特点:与类同名,无返回类型, ...
- Java内存结构、类的初始化、及对象构造过程
概述 网上关于该题目的文章已经很多,我觉得把它们几个关联起来讲可能更好理解一下.与其它语言一样,它在执行我们写的程序前要先分配内存空间,以便于存放代码.数据:程序的执行过程其实依然是代码的执行及数据的 ...
- Java对象的强、软、弱和虚引用原理+结合ReferenceQueue对象构造Java对象的高速缓存器
//转 http://blog.csdn.net/lyfi01/article/details/6415726 1.Java对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变 ...
- Java之对象构造过程
先来运行一段代码 class A { public A() { init(); } public void init() { } public static void main(String[] ar ...
- 零基础学Java(14)对象构造
对象构造 之前学习了编写简单的构造器,可以定义对象的初始状态.但是,由于对象构造非常重要,所以Java提供了多种编写构造器的机制. 重载 有些类有多个构造器.例如,可以如下构造一个空的StringBu ...
- XML解析---利用XStream解析xml数据及反构造Java对象
XStream 是一个轻量级的.简单易用的开放源代码 Java库,用于将 Java 对象序列化为 XML 或者再转换回来.而且XStream还能将java对象转成其它格式,比如JSon. 需要用到的包 ...
- Java对象序列化剖析
对象序列化的目的 1)希望将Java对象持久化在文件中 2)将Java对象用于网络传输 实现方式 如果希望一个类的对象可以被序列化/反序列化,那该类必须实现java.io.Serializable接口 ...
- json相关类库,java对象与json相互转换
有效选择七个关于Java的JSON开源类库 转自:http://www.open-open.com/lib/view/open1397870197828.html 翻译: (英语原文:http://w ...
随机推荐
- noip30
T1 一眼看,觉得是个状压,然而又觉得不太行,去打暴力了,然而暴力都打挂的我biss. 正解: 还是暴力,考虑 \(meet \; in \; the \; middle\) 显然对于每个数,只有三种 ...
- 题解 Hunter
传送门 一看这题subtasks就觉得最后能直接推个柿子出来--然而没推出来 首先状压的部分分:发现只需要统计猎人1还没死的状态的贡献,其它情况可以continue掉,有45pts 至于正解--发现我 ...
- 容器平台(kubernetes)架构设计
一眨眼距离上次发文好几年过去了,今天翻未读邮件看到博客有文章回复,猛然想起将博客遗忘在角落好几年了,赶紧访问博客.找回密码.翻翻文章,想写点什么但是又不知道从哪下手,N年前的第一篇文章是一个crm设计 ...
- 带有附件及图片正文的JavaMail邮件发送
1 package javamail; 2 3 import java.io.UnsupportedEncodingException; 4 import java.util.Properties; ...
- 转:C语言自增自減问题总结
C语言自增自減问题总结 在程序设计中,经常遇到"i=i+1"和"i=i-1"这两种极为常用的操作.C语言为这种操作提供了两个更为简洁的运算符,即++和--,分别 ...
- Mysql 日期格式化 复杂日期区间查询
前言 最近在做项目涉及到Mysql的复杂日期查询,日期查询其实在数据库中查询其实还是用的挺多的,比如查询开始日期到结束日期的区间信息,查询日期小于有效日期的信息,查询当天的日期,明天的日期,做比较等. ...
- dpkg:处理 xxx (--configure)时出错解决办法,也可用于卸载软件出错的情况
dpkg:处理 xxx (--configure)时出错解决办法今早安装nfs时出现问题,找到该文,备份留用.然后在网上找到了这片文章,按步骤走就解决了,中间会提示自动卸载一下,执行那个命令就好了,我 ...
- CodeReview杂谈
豆皮粉儿们,大家好,又见面啦,今天由字节跳动的"躬冯"带来一个 code review 的故事. 作者:躬冯 2020年元旦假期到来的时候,孙总攒了个局,又把当年一起创造过屎山的咱 ...
- Jenkins(8)- CentOS 7.x 通过yum安装jenkins
如果想从头学起Jenkins的话,可以看看这一系列的文章哦 https://www.cnblogs.com/poloyy/category/1645399.html 下载rpm包 sudo wget ...
- K8S 简介
K8S架构与组件 kubectl: 是一个客户端管理工具,直接管理API server,提供请求给API server,中间有auth认证.用户使用kubectl命令来请求API Server接口完成 ...