Java基础—对象构造
1.重载
有些类有多个构造器。例如,可以如下构造一个空的StringBuilder对象:
StringBuilder message = new StringBuilder();
或者,可以指定一个初始字符串:
StringBuilder message = new StringBuilder("Hello World!");
这种特征叫做重载(overloading)。如果多个方法(比如,StringBuilder构造器方法)有相同的名字、不同的参数,便产生了重载。编译器必须挑选出具体执行哪个方法,它通过用各个方法给出的参数类型与特定方法调用所使用的值类型进行匹配来挑选出相应的方法。如果编译器找不到匹配的参数,就会产生编译时错误,因为根本不存在匹配,或者没有一个比其他更好(这个过程被称为重载解析(overloading resolution))。值得注意的是,Java允许重载任何方法,而不只是构造器方法。
2.默认域初始化
如果在构造器中没有显式的给域赋予初值,那么就会被自动的赋予为默认值:数值为0、布尔值为false、对象应用为null。然而,只有缺少程序设计经验的人才会这么做。确实,如果不明确的对域进行初始化,就会影响程序代码的可读性。就比如说上篇的Employee类,假定没有在构造器中对某些域进行初始化,就会默认的将name和sex域初始化为null,将age域初始化为0。但是这不是一个良好的编程习惯。如果此时,我们调用getName方法或者getSex方法,将会得到一个null值的引用,这应该不是我们所希望的结果。
3.无参构造器
很多类都包含一个无参的构造函数,对象由无参构造函数创建时,其状态会设置为适当的默认值。如果编写一个类时没有编写构造器,那么系统就会提供一个无参的构造器。这个构造器将所有的实力域设置为默认值。
注意:如果类中提供了至少一个构造器,但是没有提供无参数的构造器,则在构造对象时如果没有提供参数就会被视为不合法。例如Employee类只提供了一个构造方法:
package jackWe;
public class Employee {
private String name;
private int age;
private String sex;
public Employee(String name, int age, String sex) {
super();
this.name = name;
this.age = age;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public void getOneHeight() {
System.out.println("姓名:"+ this.name + ";");
System.out.println("年龄:"+ this.age + ";");
System.out.println("性别:"+ this.sex + ";");
System.out.println("身高:"+ (int)(Math.random() * 200) + "cm。");
}
}
对于这个类,构造默认的雇员就会是不合法的。也就是,调用
Employee employee = new Employee(); // 创建将会产生错误
将会产生错误。
警告:请记住,仅当类没有提供任何构造器的时候,系统才会提供一个默认的构造器。如果在编写类的时候,给出了一个构造器,哪怕是很简单的,要想让这个类的用户能够按照下列方式构造实例:
new className()
就必须提供一个默认的构造器(即不带参数的构造器)。当然,如果希望所有域被赋予默认值,可以采用下列格式:
public Employee() {
// 默认构造器
}
4.调用另一个构造器
关键字this引用方法的隐式参数。然而,这个关键字还有另外一个含义。如果构造器的第一个语句如同this(...),那么,这个构造器将调用同一类中的另外一个构造器,下面给个例子:
public Employee() {
this("Jack",18,"男"); //调用另外一个构造器
}
5.初始化块
前面已经说过了两种初始化数据域的方法:
①、构造器中设置值;
②、在声明中赋值。
实际上,Java还有第三种机制,成为初始化块。在一个类的声明中,可以包含多个代码块。只要构造类的对象,这些块就会被执行。
由于初始化数据域有多种途径,所以列出构造过程的所有路径可能相当混乱。下面是调用构造器的具体处理步骤:
①、所有数据域被初始化为默认值(0,false,null);
②、按照在类声明中出现的次序,依次执行所有域初始化语句和初始化块;
③、如果构造器第一行调用了第二个构造器,则执行第二个构造器主体;
④、执行这个构造器的主体。
当然,我们应该精心的组织好初始化代码,这样有利于其他程序员的理解。例如,如果让类构造器行为依赖于数据域声明的顺序,那就会显得很奇怪并且容易引起错误。
可以通过提供一个初始化值,或者使用一个静态的初始化块来对静态域进行初始化:
private static int nextId = 1;
如果对类的静态域进行初始化的代码比较复杂,那么可以使用静态的初始化块。
将代码放在一个块中,并标记关键字 static 。例如:
// static initialization block
static {
Employee employee = new Employee();
int age = (int) (Math.random() * 100);
employee.setAge(age);
}
在类第一次加载的时候,将会进行静态域的初始化。与实力域不一样,除非将它们显式的设置成其他值,否则默认的初始值为0、false或null。所有的静态初始化语句以及静态初始化块都将依照类定义的顺序执行。
6.对象析构域finalize方法
由于Java有自动的垃圾回收器,不需要人工回收内存,所以Java不支持析构器。当然,某些对象使用了内存之外的其他资源,例如,文件或使用了系统资源的另一个对象的句柄。在这种情况下,当资源不在需要时,将其回收再利用将显得十分重要。
可以为任何一个类添加finalize方法。finalize方法将在垃圾回收器清除对象之前调用。在实际应用中,不要依赖于使用finalize方法回收任何短缺的资源,这是因为很难知道这个方法什么时候才能够调用。
如果某个资源需要在使用完毕后立刻被关闭,那么就需要人工来管理。对象用完时,可以应用一个close方法来完成相应的清理操作。
Java基础—对象构造的更多相关文章
- 《java基础——对象的拷贝》
java基础--对象的拷贝 一.浅拷贝: 规则: 1. 浅拷贝只是拷贝了源对象的地址,所以源对象的值发生变化时,拷贝对象的值也会发生变化. 2. 浅拷贝相当于两个对象共用一套实例. 格式: 类名 对象 ...
- Java中对象构造
构造函数 作用:在构造对象的同时初始化对象.java强制要求对象 诞生同时被初始化,保证数据安全. 调用过程和机制:①申请内存,②执行构造函数的函数体,③返回对象的引用. 特点:与类同名,无返回类型, ...
- Java基础-对象与类
面向对象程序设计概述 面向对象的程序设计(简称OOP)时当今主流的程序设计范型,已经取代了"结构化"过程化程序设计开发技术,Java是完全面向对象的. 类 类设计构造对象的模板或蓝 ...
- Java基础--对象的克隆
文章转载自https://www.cnblogs.com/Qian123/p/5710533.html 阅读目录 为什么要克隆? 如何实现克隆 浅克隆和深克隆 解决多层克隆问题 总结 假如说你想复制一 ...
- Java之对象构造过程
先来运行一段代码 class A { public A() { init(); } public void init() { } public static void main(String[] ar ...
- java基础-对象的初始化
一 前言 本节内容将会提到方法重载,对象的初始化,对象的构造器,和this关键字的使用,以及会简要的概括一下java中对象回收机制.觉得文章不错的读者可以关注一下作者的博客和公众号(同博客名称) 二 ...
- 一天一个Java基础——对象和类
1.在Java中你所做的全部工作就是定义类,产生那些类的对象,以及发送消息给这些对象 2.可以在类中设置两种类型的元素:字段(也被称作数据成员)和方法(也被称作成员函数) 3.字段可以是任何类型的对象 ...
- Java基础——对象容器(顺序、集合、Hash)
扩展: For-each循环 for (String s: str) { System.out.println(s); } 等同于for (int i = 0; i < str.length; ...
- Java基础-对象的内存分配与初始化(一定要明白的干货)
首先,什么是类的加载?类的加载由类加载器执行.该步骤将查找字节码(classpath指定目录),并从这些字节码中创建一个Class对象.Java虚拟机为每种类型管理一个独一无二的Class对象.也就是 ...
随机推荐
- Python面向对象02/类的空间问题、类与对象之间的关系、类与类之间的关系
Python面向对象02/类的空间问题.类与对象之间的关系.类与类之间的关系 目录 Python面向对象02/类的空间问题.类与对象之间的关系.类与类之间的关系 1. 类的空间问题 2. 类与对象之间 ...
- POJ 1063 Flip and Shift 最详细的解题报告
题目来源:Flip and Shift 题目大意:一个椭圆形的环形容器中有黑色和白色两种盘子,问你是否可以将黑色的盘子连续的放在一起.你可以有以下两种操作: 1.顺时针旋转所有的盘子 2.顺时针旋转3 ...
- Vue中使用websocket
<template> <div class="test">websocket demo</div></template> < ...
- CSS背景处理
CSS背景处理 背景样式 背景颜色 如果想让一个区域具有纯色的背景,可以使用background-color进行设置,背景颜色可以是rgb,rgba,#16网页色. <!DOCTYPE html ...
- 软件测试工程师入门——Linux【使用说明书】
先来说一下linux是什么? linux 是一个开源.免费的操作系统,其稳定性.安全性.处理多并发已经得到业界的认可,目前很多中性,大型甚至是巨型项目都在使用linux. linux 内核:redha ...
- 干货分享:Python Web 部署方式大全
不要让服务器裸奔 学过PHP的都了解,php的正式环境部署非常简单,改几个文件就OK,用FastCgi方式也是分分钟的事情.相比起来,Python在web应用上的部署就繁杂的多,主要是工具繁多,主流服 ...
- websphere8.5配置db2数据源
websphere8.5配置db2数据源 1. 打开websphere控制台 2.进入websphere变量页面 3. 进入DB2UNIVERSAL_JDBC_DRIVER_NATIVEPATH变 ...
- Spring Boot使用AOP的正确姿势
一.为什么需要面向切面编程? 面向对象编程(OOP)的好处是显而易见的,缺点也同样明显.当需要为多个不具有继承关系的对象添加一个公共的方法的时候,例如日志记录.性能监控等,如果采用面向对象编程的方法, ...
- js读取其他网页内容(同源)
通过xss第一次取得网页内容,然后获取到管理员账号页面进行二次盲打.js需要保留script部分其余去除. <html><p id='d1'></p> <sc ...
- ~~网络编程(八):UDP~~
进击のpython ***** 网络编程--UDP 那现在看到这里的 这就是网络编程的最后一讲了 上面讲的都是关于TCP的编程方法 还记得TCP和UDP传输的区别吗? UDP简单就简单到它可以不借助管 ...