Java——Object类

Object类概念

Object是Java默认提供的一个类,Object类是所有类的父类,Java里面除了Object类,所有的类都是存在继承关系的。

以下两种定义效果完全一致:

class A{}
class A extends Object{}

由此可得:所有类的对象都可以使用Object的引用进行接收,如下:

public class A {}

public class B extends A{}

public class Test {
    Object obj1 = new A();
    Object obj2 = new B();
}

Object类中——获取对象信息方法 toString()

如果要打印对象中的内容,可以重写Object类中的toString()方法,如下:

Dog类中没有toString()方法,父类Animal中也没有,所以调用了Object中的toString()方法

我们打开源码可以看到,返回的相当于是一个地址:

所以需要我们自己重写toString()方法:

 


Object类中——对象比较equals()方法

当两个成员变量的值相同时,运行结果如下:

在比较dog这个引用类型变量时,发现Object类中的equals()方法默认比较的是引用变量的地址

所得结果均为false

想要比较对象中的内容,必须重写object中的equals()方法:


在上述重写的equals()方法中进一步优化,如下:

    @Override
    public boolean equals(Object obj) {
        //判空
        if(obj == null){
            return false;
        }
        
        //是否为同一个对象
        if(this == obj){
            return true;
        }

        //不是同一个类型
        if(!(obj instanceof Dog)){
            return false;
        }
        
        Dog tmp = (Dog) obj;//此处方法向下转型
        return tmp.name.equals(this.name)
                && tmp.age == this.age;
    }

结论:

在Java中,用 == 进行比较时

  1. 如果 == 左右两侧是基本类型变量,比较的是变量中值是否相同
  2. 如果 == 左右两侧是引用类型变量,比较的是引用变量地址是否相同
  3. 如果要比较对象中内容,必须重写Object类中的equals()方法,因为equals()方法默认也是按照地址比较的

Object类中——hashcode()方法

如上所示,hashcode()方法帮我们计算了两个具体的对象位置

hashcode()方法源码是一个native方法,底层是由C/C++代码写的,我们无法看到

假设我们认为两个name、age相同的对象,会储存在同一个位置,如果不重写hashcode()方法,我们可以看到两个对象的hash值并不一样

所以我们可以像重写equals()方法一样,重写hashcode()方法,如下:

    @Override
    public int hashCode() {
        return Objects.hash(name,age);
    }

让name、age作为参数生成hash值,当name、age相同时,生成的hash值相同

结论:

  • hashcode()方法用来确定对象在内存中存储的位置是否相同
  • 事实上hashCode() 在散列表中才有用,在其它情况下没用。在散列表中hashCode() 的作用是获取对象的 散列码,进而确定该对象在散列表中的位置。

tips:下为Object类中所有方法,应全部掌握!

  • 18
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SDO(Service Data Object)是一种数据访问和操作的模型,它可以在不同的应用程序之间共享数据。SDO定义了一组API,用于访问和操作数据对象。在Java中,SDO的实现称为SDO for Java。 在SDO for Java中,DataObject是SDO的核心概念之一。DataObject是一个Java对象,它可以表示任意类型的数据。SDO for Java提供了一组API,用于创建、访问和操作DataObject。 DataObject具有以下特点: 1. 动态属性:DataObject可以动态添加和删除属性,而不需要在定义时指定属性。 2. 支持继承:DataObject可以继承自其他DataObject,继承可以实现数据的重用。 3. 支持多重值:DataObject的属性可以是多重值,可以包含多个值。 4. 支持关联:DataObject可以与其他DataObject建立关联,形成一个对象图。 SDO for Java提供了一组API,用于访问和操作DataObject。例如,可以使用以下代码创建一个DataObject: ``` DataObject dataObject = dataFactory.create("uri", "typeName"); ``` 其中,dataFactory是SDO的工厂类,"uri"和"typeName"分别表示DataObject的命名空间和类型名。 创建DataObject后,可以使用以下代码设置和获取属性值: ``` dataObject.set("propertyName", propertyValue); Object value = dataObject.get("propertyName"); ``` 其中,"propertyName"表示属性名,propertyValue表示属性值。 除了设置和获取属性值外,还可以使用以下代码访问DataObject的关联: ``` DataObject relatedObject = dataObject.getDataObject("associationName"); List<DataObject> relatedObjects = dataObject.getList("associationName"); ``` 其中,"associationName"表示关联名。getDataObject方法返回与DataObject建立关联的单个DataObject,getList方法返回与DataObject建立关联的多个DataObject。 总之,DataObject是SDO for Java的核心概念之一,它提供了一种灵活、动态、可扩展的数据访问和操作模型。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值