4.12.重载
4.12.1定义
重载:具有相同的名字,不同的参数。
4.12.2例子
package com.eleven.oop_03;
/**
* 重载:
* 1.具有相同的名字,不同的参数
* @author sywangu
*
*/
public class HeavyLoad {
public static void main(String[] args) {
Person p = new Person();
p.getPerson(); // 无参数!
p.getPerson(1); // 只有id参数
p.getPerson(1, "伊莱文"); // 有id和name两个参数
p.getPerson(1, "伊莱文", 21); // 有id、name和age3个参数
}
}
class Person{
private int id;
private String name;
private int age;
public void getPerson() {
System.out.println("无参数!");
}
public void getPerson(int id) {
System.out.println("只有id参数");
}
public void getPerson(int id,String name) {
System.out.println("有id和name两个参数");
}
public void getPerson(int id,String name,int age) {
System.out.println("有id、name和age3个参数");
}
}
4.13默认域初始化
4.13.1定义
在构造器中没有显式的给实例域赋初值,那么就会被自动赋为默认值:数值为0,布尔值为false,对象引用为null
4.14无参数的构造器
4.14.1定义
1.对象由无参数构造函数创建时,其状态会设置为适当的默认值。
2.只有当类没有提供任何构造器时,系统才会提供一个默认的构造器。
4.14.2例子
package com.eleven.oop_03;
import java.time.LocalDate;
/**
* 无参数的构造器
* 1.对象由无参数构造函创建时,会设置为默认值。
* 2.如果在编写一个类没有编写默认构造器时,系统就会自动提供一个无参数构造器。
* @author sywangu
*
*/
public class ParamConstructor {
public static void main(String[] args) {
System.out.println(new Per());
}
}
class Per{
private String name;
private double salary;
private LocalDate hireDay;
// 无参构造
public Per() {
name = "";
salary = 0;
hireDay = LocalDate.now();
}
}
4.15显示域初始化
4.15.1定义
可以保证不管怎么调用构造器,每个实例域都可以被设置为一个有意义的初始值。
4.15.2例子
package com.eleven.oop_03;
/**
* 显式域初始化
* 1.可以保证不管怎么调用构造器,每个实例域都可以被设置为一个有意义的初始值。
*
* @author sywangu
*
*/
public class DisplayDomainInit {
}
class Emp {
// 在执行构造器之前,先执行赋值语句,将一个值赋予给任何域。
private String name = "";
}
4.16参数名
4.16.1描述
1.单个字符命名。2.参数前面加前缀"a"。3.采用this形式访问实例域。
4.16.2例子
package com.eleven.oop_03;
/**
* 参数名
* @author sywangu
*
*/
public class ParamName {
private String name;
private double salary;
private int age;
// 01用单个字符命名
public ParamName(String n) {
name = n;
}
// 02可以在每个参数前面加上一个前缀"a"
public ParamName(String aName,double aSalary) {
name = aName;
salary = aSalary;
}
// 03采用this的形式访问实例域,this指示的是隐式参数
public ParamName(String name, double salary, int age) {
this.name = name;
this.salary = salary;
this.age = age;
}
}
4.17调用另一个构造器
4.17.1定义
关键字this除了是表示引用方法的隐式参数外,还有另外一个含义:this(…)表示这个构造器将调用同一个类的另一个构造器。
4.17.2例子
package com.eleven.oop_03;
/**
* 调用另外一个构造器
* 1.关键字this除了是表示引用方法的隐式参数外,还有另外一个含义:
* 2.this(...)表示这个构造器将调用同一个类的另一个构造器。
* @author sywangu
*
*/
public class CallAnotherConstructor {
private static int nextId = 1; // 静态域id
private double salary;
// 采用这样方式使用this关键字,可以使公共的构造器代码只编写一次
public CallAnotherConstructor(double aSalary) {
// 02-程序在执行这个
this("CallAnotherConstructor:" + nextId ,aSalary);
// 04-程序在执行这个
nextId++;
}
public CallAnotherConstructor(String string, double aSalary) {
// 03-程序在执行这个
System.out.println("调用CallAnotherConstructor(String string, double aSalary)这个构造器");
}
public static void main(String[] args) {
// 01-程序先执行这个
new CallAnotherConstructor(5000); // 将会调用CallAnotherConstructor(String string, double aSalary)这个构造器
// 05-程序结束退出
}
}
4.18初始化块
4.18.1定义
1.除了具有"在构造器中设置值"和"在声明中赋值"以外,还有一种"初始化块"。
2.在一个类的声明中,可以包含多个代码块。只要构造类的对象,这些块就会被执行。
4.18.2例子
package com.eleven.oop_03;
/**
* 初始化块
* 1.在一个类的声明中,可以包含多个代码块。只要构造类的对象,这些块就会被执行。
*
* @author sywangu
*
*/
public class InitBlock {
private static int nextId;
private int id;
private String name;
private double salary;
// 初始化构造块
/// 02-在运行初始化块
{
id = nextId;
nextId++;
}
public InitBlock(String aName, double aSalary) {
name = aName;
salary = aSalary;
}
/// 03-然后在运行构造器的主体部分
public InitBlock() {
name = "";
salary = 0;
}
public static void main(String[] args) {
/// 01-先执行这个
new InitBlock();
}
}
4.19浅谈对象析构与finalize方法
4.19.1定义
以回收分配给对象的存储空间。
1.由于Java具有自动的垃圾回收机制,所以不需要人工回收内存,所以Java不支持析构器。
2.finalize方法是在垃圾回收器清除对象之前进行调用。
3.如果某个资源在使用完毕后立刻被关闭,那么就需要由人工来管理,对象用完后,可以使用close方法来完成相应的清理操作。