Object类
在 Java 中创建类,如果没有声明继承关系、父类,编译器会自动添加 Object 为其父类。
因此,所有的 Java 类直接或者间接地继承了 Object 类,自动拥有了其所有属性(没有属性)和方法。
所以我们可以这样写:
Object a = 123;
Object obj = new A();
Object null1 = null;
Object str = "字符串";
Object array = new boolean[5];
并且可以直接调用Object的方法
toString()
String toString()方法调用后返回该调用对象的字符串形式,通常用于字符串转换、字符串输出打印中。
public class A{} // 默认实现
public class B{
@Override
public String toString(){
return "this is B class.";
}
}
// 测试
System.out.println(new A()); // A@1b6d3586
System.out.println(new B()); // this is B class.
可以看到:
- 打印会自动调用对象的 toString 方法
- 默认的对象会转换为一个带类名和内存地址的字符串
- 可以重写 toString 方法,返回自定义字符串内容
equals()
boolean equals(Object) 方法用于比较两个对象是否相等
public class Date{
public int year;
public int month;
public int day;
public Date(int year, int month, int day){
this.year = year;
this.month = month;
this.day = day;
}
}
// 入口测试
Date d1 = new Date(2020, 11, 11);
Date d2 = new Date(2020, 11, 11);
System.out.println(d1 == d2); // false
System.out.println(d1.equals(d2)); // false
可以看到上述代码的输出都是 false ,原因很简单:
- == 表示两个对象或者值是否完全相等,如果是对象则表示引用的对象、地址完全一样
- equals 表示两个对象是否相同,两个对象进行比较时,默认情况下和 == 效果相当
那么如何让两个相似意义的对象能够做出相等的行为?办法就是重写 equals 方法:
public class Date{
/* 省略上述代码…… */
@Override
public boolean equals(Object that) {
if(that == null || ! (that instanceof Date)) {
return false;
}
if(this == that){
return true;
}
Date thatDate = (Date)that;
return thatDate.year == this.year && thatDate.month == this.month && thatDate.day == this.day;
}
}
// 入口测试
Date d1 = new Date(2020, 11, 11);
Date d2 = new Date(2020, 11, 11);
System.out.println(d1 == d2); // false
System.out.println(d1.equals(d2)); // true
hashCode()
int hashCode() 方法返回一个整数即对象的哈希码值,是一个 Native 本地方法,该方法在涉及到数据相关操作时非常重要,一旦类的 equals 方法被重写,那么对象的 hashCode 方法也尽量需要实现重写。
哈希值有个重要的特点:相同类型的两个对象如果相同,那么他们的哈希值也应该一样;相反如果两个对象不一样,那么其哈希值也应该不一样;反之,哈希值相同不能代表两个对象一样!所以,哈希值只能用于判断不相等,而不能用于判断对象的相等。
JavaBean
可以理解是一种普通的代码规范格式
JavaBean 的规范相当简单,满足如下即可:
- 所有属性为 private 私有
- 提供默认构造方法
- 提供 getter 和 setter 方法
- 实现 Serializable 可序列化接口
JavaBean 的一大特点是能够保证向后的兼容性。从上述代码中可以看到一些命名规范:
- 每个单值属性都伴随有一对 get/set 方法
- 属性名与和该属性相关的 get/set 方法名对应,例如如果有一个名为 xyz 的属性,则会有 setXyz 和 getXyz 方法,注意大小写
- 布尔类型字段是一种特殊的单值属性,如果有一个名为 xyz 的布尔属性,则可以通过 isXyz 方法访问,当然也可以使用 getXyz 方法
总结来讲,其优点有以下几点:
- 提高代码的可复用性,特别是通用的操作、数据库对象等
- 程序易于开发和维护,因为实现了逻辑的封装,使事务处理和显示互不干扰
- 支持分布式应用,在前后端开发中可以减少 Java 代码和 HTML 代码的混编