Object类与JavaBean

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.

可以看到:

  1. 打印会自动调用对象的 toString 方法
  2. 默认的对象会转换为一个带类名和内存地址的字符串
  3. 可以重写 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 的规范相当简单,满足如下即可:

  1. 所有属性为 private 私有
  2. 提供默认构造方法
  3. 提供 getter 和 setter 方法
  4. 实现 Serializable 可序列化接口

JavaBean 的一大特点是能够保证向后的兼容性。从上述代码中可以看到一些命名规范:

  1. 每个单值属性都伴随有一对 get/set 方法
  2. 属性名与和该属性相关的 get/set 方法名对应,例如如果有一个名为 xyz 的属性,则会有 setXyz 和 getXyz 方法,注意大小写
  3. 布尔类型字段是一种特殊的单值属性,如果有一个名为 xyz 的布尔属性,则可以通过 isXyz 方法访问,当然也可以使用 getXyz 方法

总结来讲,其优点有以下几点:

  1. 提高代码的可复用性,特别是通用的操作、数据库对象等
  2. 程序易于开发和维护,因为实现了逻辑的封装,使事务处理和显示互不干扰
  3. 支持分布式应用,在前后端开发中可以减少 Java 代码和 HTML 代码的混编
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

轩尼诗道-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值