java构造方法的签名_如何在 Java 中构造对象(学习 Java 编程语言 034)

1. 构造器

Java 对象都是在堆中构造的。

先看看 Employee 类的构造器:

public class Employee {

private String name;

private double salary;

private LocalDate hireDay;

public Employee(String name, double salary, int year, int month, int day) {

this.name = name;

this.salary = salary;

hireDay = LocalDate.of(year, month, day);

}

...

}

构造器与类同名。在构造 Employee 类的对象时,构造器会运行并初始化实例字段。

当使用下面这条代码创建 Employee 类的实例时:

new Employee("James Bond", 100000, 1950, 1, 1);

将会把实例字段设置为:

name = "James Bond";

salary = 100000;

hireDay = LocalDate.of(1950, 1, 1); // 1950-01-01

有关构造方法,需要记住:

构造器与类同名

每个类可以有一个以上的构造器。

构造器可以有 0 个、1 个或多个参数。

构造器没有返回值。

构造器总是伴随着 new 操作符一起调用。

注意,不要在构造器中定义与实例字段同名的局部变量。例如:

public Employee(String n, double s, int y, int m, int d) {

String name = n; // 错误

double salary = s; // 错误

...

}

这个构造器声明了局部变量 name 和 salary。这些变量只能在构造器内部访问。这些变量会遮蔽同名的实例字段。有些程序员偶尔会不假思索地写出这类代码,因为它们的手指会不自觉地增加数据类型。这种错误很难检查出来,因此,必须注意在所有方法中都不要使用与实例字段同名的变量。

2. 重载

有些类有多个构造器。

new StringBuilder();

new StringBuilder("String");

这种功能叫做重载(overloading)。如果多个方法有相同的名字、不同的参数,便出现了重载。

Java 允许重载任何方法,而不只是构造器方法。

编译器必须挑选出具体调用哪个方法,它用各个方法首部的参数类型与特定方法调用中所使用的值类型进行匹配,来选出正确的方法。如果编译器找不到匹配的参数,就会产生编译时错误,因为根本不存在匹配,或者没有一个比其他的更好。这个查找匹配的过程被称为重载解析(overloading resolution)。

要完整地描述一个方法,需要指出方法名以及参数类型。这叫做方法的签名(signature)。例如,String 类有 4 个名为 indexOf 的公共方法。它们的签名是:

indexOf(int)

indexOf(int, int)

indexOf(String)

indexOf(String, int)

返回类型不是方法签名的一部分。也就是说,不能有两个名字相同、参数类型也相同却有不同返回类型的方法。

3. 无参数的构造器

很多类都包含一个无参数的构造器,由无参数构造函数创建对象时,其状态会设置为适当的默认值。例如,以下是无参数构造器:

public class Employee {

private String name;

private double salary;

protected LocalDate hireDay;

public Employee() {

name = "";

salary = 0;

hireDay = LocalDate.now();

}

}

如果写一个类时没有编写构造器,就会为你提供一个无参数构造器。这个构造器将所有的实例字段设置为默认值。于是,实例字段中的数值型数据设置为 0、布尔型数据设置为 false、所有对象变量将设置为 null。

如果类中提供了至少一个构造器,但是没有提供无参数的构造器,那么构造对象时如果不提供参数就是为不合法。

警告: 仅当类没有任何其他构造器的时候,才会得到一个默认的无参数构造器。编写类的时候,如果写了一个你自己的构造器,要想让这个类的用户能够通过以下调用构造一个实例:

new ClassName();

你就必须提供一个无参数的构造器,当然,如果希望所有的字段被赋予默认值,只需要提供以下代码:

public ClassName() {

}

4. 参数名

在编写很小的构造器时,常常在参数命名时感到困惑。

常常用单个字母作为参数名:

public class Employee {

...

public Employee(String n, double s) {

name = n;

salary = s;

}

}

但这样做有一个缺点:只有阅读代码才能够了解参数 n 和参数 s 的含义。

有些程序员在每个参数前面加上一个前缀 “a”:

public class Employee {

...

public Employee(String aName, double aSalary) {

name = aName;

salary = aSalary;

}

}

这样很清晰。读者一眼就能看懂参数的含义。

还有一种常用的技巧,它基于这样的事实:参数变量会遮蔽同名的实例字段。如果将参数名命名为 salary,salary 将指示这个参数,而不是实例字段。但是,还是可以用 this.salary 访问实例字段。this 指示隐式参数,也就是所构造的对象。

public class Employee {

...

public Employee(String name, double salary) {

this.name = name;

this.salary = salary;

}

}

5. 调用另一个构造器

关键字 this 指示一个方法的隐式参数。这个关键字还有另一个含义。

如果构造器的第一个语句形如 this(...),这个构造器将调用同一个类的另一个构造器。下面是一个典型的例子:

public class Employee {

...

public Employee (double s)

{

// calls Employee(String, double)

this("Employee #" + nextId, s);

nextId++;

}

public Employee(String name, double salary) {

this.name = name;

this.salary = salary;

}

}

当调用 new Employee(6000) 时,Employee(double) 构造器将调用 Employee(name, double) 构造器。

采用这种方式使用 this 关键字非常有用,这样对公共的构造器代码只需要编写一次即可。

6. 对象析构与 finalize 方法

由于 Java 会完成自动的垃圾回收,不需要人工回收内存,所以 Java 不支持析构器。

某些对象使用了内存之外的其他资源,例如,文件或使用了系统资源的另一个对象的句柄。在这种情况下,当资源不再需要时,将其回收和再利用显得十分重要。

如果一个资源一旦使用完就需要立即关闭,那么应当提供一个 close 方法来完成必要的清理工作。可以在对象用完时调用这个 close 方法。

如果可以等到虚拟机退出,那么可以用方法 Runtime.addShutdownHook 增加一个 “关闭钩”(shutdown hook)。在 Java 9 中,可以使用 Cleaner 类注册一个动作,当对象不再可达时(除了清洁器还能访问,其他对象都无法访问这个对象),就会完成这个动作。在实际中这些情况很少见。

警告: 不要使用 finalize 方法来完成清理。这个方法原本要在垃圾回收器清理对象之前调用。不过,你并不知道这个方法到底什么时候调用,而且该方法已经被废弃。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436733.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】ABP源码分析十一:Timing

Timing这个简单实用的功能主要用来以统一的方式表示时间。因为ABP中有大量的module,另外还支持自定义module,所以将时间统一表示为local时间(默认)或utc时间是必要的。 IClockProvider:提供获取当前时间和标准化时间的接口。 UtcClockProvide…

java更改背景_java – 使用jquery更改menue的背景颜色

我正在尝试用Zenphoto建立一个照片库.他们使用PHP,可以添加这样的自定义菜单:PHP printCustomMenu(main_menue); ?>我改变了sylesheet中整个事物的外观,看起来像这样:#navmenu {width: 1000px;height: 42px;margin: 0px auto 30px auto;font-family:…

【转】ABP源码分析十二:本地化

本文逐个分析ABP中涉及到localization的接口和类,以及他们之间的关系。本地化主要涉及两个方面:一个是语言(Language)的管理,这部分相对简单。另一个是语言对应得本地化资源(Localization)的管理…

pandas 批量修改列名_pandas修改DataFrame列名的方法

在做数据挖掘的时候,想改一个DataFrame的column名称,所以就查了一下,总结如下:数据如下:>>>import pandas as pd>>>a pd.DataFrame({A:[1,2,3], B:[4,5,6], C:[7,8,9]})>>> aA B C0 1 4 7…

【转】ABP源码分析十三:缓存Cache实现

ABP中有两种cache的实现方式:MemoryCache 和 RedisCache. 如下图,两者都继承自ICache接口(准确说是CacheBase抽象类)。ABP核心模块封装了MemoryCache 来实现ABP中的默认缓存功能。 Abp.RedisCache这个模块封装RedisCache来实现缓存…

java 酒店预定 app_Android应用源码酒店在线预定app项目全套

【实例简介】Android应用源码酒店在线预定app项目全套【实例截图】【核心代码】package com.bn.summer;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;…

java peer_Java PeerConnection.getStats方法代码示例

import org.webrtc.PeerConnection; //导入方法依赖的package包/类Overridepublic void onIceServers(List iceServers) {factory new PeerConnectionFactory();MediaConstraints pcConstraints appRtcClient.pcConstraints();pcConstraints.optional.add(new MediaConstrain…

【转】ABP源码分析十四:Entity的设计

IEntity<TPrimaryKey>: 封装了PrimaryKey&#xff1a;Id,这是一个泛型类型 IEntity: 封装了PrimaryKey&#xff1a;Id,这是一个int类型 Entity<TPrimaryKey> &#xff1a;支持主键是泛型类型的Entity Entity&#xff1a;支持主键是int类型的Entity IHasCreation…

【转】ABP源码分析十五:ABP中的实用扩展方法

类名 扩展的类型 方法名 参数 作用 XmlNodeExtensions XmlNode GetAttributeValueOrNull attributeName Gets an attributes value from an Xml node. JsonExtensions object ToJsonString bool camelCase bool indented Converts given object to JSON …

php计算经纬度距离,php经纬度计算距离

/*** 计算两点地理坐标之间的距离* param Decimal $longitude1 起点经度* param Decimal $latitude1 起点纬度* param Decimal $longitude2 终点经度* param Decimal $latitude2 终点纬度* param Int $unit 单位 1:米 2:公里* param Int $decimal 精度…

【转】ABP源码分析十六:DTO的设计

IDTO:空接口&#xff0c;用于标注Dto对象。 ComboboxItemDto&#xff1a;用于combobox/list中Item的DTO NameValueDto<T>/NameValueDto:用于name value键值对的DTO&#xff0c; name为string类型&#xff0c; value为泛型或string类型。 Entity Dto IEntityDto<TPri…

php session 机制,Cookie、Session机制详解及PHP中Session处理

会话机制Cookie/Session&#xff1a;在web应用中&#xff0c;常用的会话追踪机制是Cookie和Session。而Cookie是通过在浏览器里记录确定用户身份&#xff0c;Session在服务器端记录信息确定用户身份。Http协议&#xff1a;http协议本身是无状态的&#xff0c;也就是说我们无法通…

【转】ABP源码分析十七:DTO 自动校验的实现

对传给Application service对象中的方法的DTO参数&#xff0c;ABP都会在方法真正执行前自动完成validation&#xff08;根据标注到DTO对象中的validate规则&#xff09;。 ABP是如何做到的? 思路无外乎通过Castle的拦截器实现AOP。本文主要分析ABP是如何设计。 Ivalidate: 空…

php扇形分布图,php生成扇形比例图的实例代码

本节内容&#xff1a;PHP GD库生成扇形比例图。实现功能&#xff1a;一些图形的百分比显示图&#xff0c;像三个地区所占地多少或成绩等。这里分享一段php生成的扇形比例百分比显示程序代码&#xff0c;需要phpGD库支持。代码&#xff1a;复制代码 代码示例:/*** 生成扇形比例图…

【转】ABP源码分析十八:UI Inputs

以下图中描述的接口和类都在Abp项目的Runtime/Validation, UI/Inputs目录下的。在当前版本的ABP&#xff08;0.83&#xff09;中这些接口和类并没有实际使用到。阅读代码时可以忽略&#xff0c;无需浪费时间去寻找其是如何被ABP使用的(本文的目的)。 这些接口和类最终都是通过…

php鼠标点击图片后换图片,鼠标滑过改变图片

jQuery中attr()函数不支持delay函数控制延迟&#xff0c;把attr函数加在animate的回调函数中jQuery(function(){jQuery(.avia_p_w_picpath).hover(function() {urlss jQuery(this).attr("src").replace("1.jpg","2.jpg");jQuery(this).stop().a…

【转】ABP源码分析十九:Auditing

审计跟踪&#xff08;也叫审计日志&#xff09;是与安全相关的按照时间顺序的记录&#xff0c;它们提供了活动序列的文档证据&#xff0c;这些活动序列可以在任何时间影响一个特定的操作。 AuditInfo&#xff1a;定义如下图中需要被Audit的信息。 AuditedAttribute&#xff1a;…

php linux 常用命令,Linux常用命令整理

文件、目录类cd # 返回 home 目录(相当于cd ~)cd .. # 返回上一级目录cd - # 返回上一次所在目录,并显示…

【转】WebServices:WSDL的结构分析

WSDL&#xff08;Web Services Description Language&#xff0c;Web服务描述语言&#xff09;是为描述Web Services发布的XML格式。W3C组织没有批准1.1版的WSDL&#xff0c;但是2.0版本已经在製訂中&#xff0c;2.0版将被作为推荐标准&#xff08;recommendation&#xff09;&…

【转】WebService WSDL结构分析

转载自&#xff1a;http://kalogen.javaeye.com/blog/418958 WSDL (Web Services Description Language,Web服务描述语言)是一种XML Application&#xff0c;他将Web服务描述定义为一组服务访问点&#xff0c;客户端可以通过这些服务访问点对包含面向文档信息或面向过程调用的服…