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 ...
随机推荐
- NOIP 模拟 $32\; \rm Walker$
题解 \(by\;zj\varphi\) 发现当把 \(\rm scale×cos\theta,scale×sin\theta,dx,dy\) 当作变量时只有四个,两个方程就行. 当 \(\rm n\ ...
- webGis概念
参考:https://blog.csdn.net/qq_36375770/article/details/80077533 参考:https://blog.csdn.net/BuquTianya/ar ...
- C#中Finalize方法的问题
ninputer在关于"值类型的Finalize不会被调用"中(http://blog.joycode.com/lijianzhong/archive/2005/01/13/429 ...
- 解决Openstack Dashboard无法获取实例故障
在部署配置完openstack基础服务以及dashboard后.登录页面发现很多功能都不正常,无法获取实例,也无法获取镜像. 查看日志 [root@openstack-controller-dev ~ ...
- 一. Go微服务--隔离设计
1. 前言 隔离设计源于船舶行业,一般而言无论大船还是小船,都会有一些隔板,将船分为不同的空间,这样如果有船舱漏水一般只会影响这一小块空间,不至于把整个船都给搞沉了. 同样我们的软件服务也是一个道理, ...
- rabbitMq可靠性投递之手动ACK
#手动应答#spring.rabbitmq.listener.simple.acknowledge-mode=manual#spring.rabbitmq.listener.simple.acknow ...
- ajax无法返回视图
$.ajax({ url:"http://localhost:8080/wb/toUpLoad", type:"post", data:formData, pr ...
- servlet+Ajax开发web工程
前言 因为目前基本已经不会再用到servlet+jsp开发项目了,基本都是使用框架来开发:我们常用的框架都是基于servlet来封装的,该阶段只需要了解一下tomcat如何使用,servlet的生命周 ...
- Spring Boot +Vue 项目实战笔记(二):前后端结合测试(登录页面开发)
前言:关于开发环境 每位 Coder 都有自己偏好的开发工具,从大的方面划分主要有文本编辑器流和 IDE 流两种,我有一段时间也喜欢用编辑器(Sublime Text.Vim),但对我来说开发效率确实 ...
- JSTL标签报错-http://java.sun.com/jsp/jstl/core
考虑为tomcat缺少相关的包 导入就好了 导入jstl-api-1.2.jar 以及standard-1.1.2.jar 然后重启服务 更多java学习,请进本人小博客-https://zhangj ...