Java中的Object类 | 您所在的位置:网站首页 › java中native有什么作用 › Java中的Object类 |
一、Object类简介
Object类是Java的java.lang包下的核心类,Object类是所有类的父类,任何一个类时候如果没有明确的继承一个父类的话,那么它就是Object的子类; Java中所有的类都是从Object类中继承出来的,它是所有类的源头,是所有类的父类。 Fig.1 Java 核心API 以下两种类的定义的最终效果是完全相同的: class Person { } class Person extends Object { }使用Object类型接收所有类的对象 Object 类属于java.lang包,此包下的所有类在使用时无需手动导入,系统会在程序编译期间自动导入。 Object 类的结构图(Object提供了11 个方法) 下面我们一个个方法进行分析,看这些方法到底有什么作用: 1. clone() 保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。 2. getClass() 它是final方法,返回Class类型的对象,反射来获取对象。即告诉你对象是从哪里被初始化的。 Cat c = new Cat(); sout(c.getClass());输出结果是:class Cat 3. toString() 该方法用得比较多,一般子类都有覆盖,来获取对象的信息。 4. finalize() 该方法用于释放资源。因为无法确定该方法什么时候被调用,很少使用。当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。 5. equals() 比较对象的内容是否相等 6. hashCode() 该方法用于哈希查找,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到。即列出此对象的哈希代码,可以把哈希代码看作是一个唯一值ID。 Cat c = new Cat(); sout(c.hashCode());输出结果是:8202111 7. wait() wait方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。wait(long timeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。 调用该方法后当前线程进入睡眠状态,直到以下事件发生。 其他线程调用了该对象的notify方法。 其他线程调用了该对象的notifyAll方法。 其他线程调用了interrupt中断该线程。 时间间隔到了。 此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常。 8. notify() 该方法唤醒在该对象上等待的某个线程。 9. notifyAll() 该方法唤醒在该对象上等待的所有线程。 有关Object类的部分问题(部分不是很准确)1、Object类是抽象类吗? 不是,至少不是正式的Java抽象类,可以把Object类理解为一个特殊的Java类。2、Object中的方法可以重写吗? 部分可以,但是标记为final的方法不能被override。并且强烈建议在自己的类中重写toString()、equals()和hashCode()方法。3、为什么会允许创建Object对象呢?这跟之前说过的Animal对象不是一样没有意义吗? Object很特殊,有时候我们就是会需要一个通用的对象,一个轻量化的对象。它最常见的用途是在线程的同步化上面。4、Object类的目的是什么? Object类有两个主要目的:一、作为多态让方法可以应付多种类型的机制,以及提供Java在执行期间对任何对象都有需要的方法的实现程序代码(这一个比较绕,我也没搞明白)。二、与线程有关。 二、 Object类的常用方法![]() toString():取得对象信息,返回该对象的字符串表示 我们先看一个简单的例子: 输出:iqqcode.algorithm.bintree.Person@1ee12a7 在使用对象直接输出的时候,默认输出的是一个对象在堆内存上的地址值;如若要输出该对象的内容,则要覆写toString()方法。 覆写Person中的toString()方法: 名字为:Mr.Q 年龄为:20 toString( )的核心目的在于取得对象信息 String作为信息输出的重要数据类型,在Java中所有的数据类型只要遇见String就执行了+,都要求其变为字符串后连接,而所有对象想要变为字符串就默认用toString( )方法。 例如: System.out.println("hello" + 123); >>> 输出:hello 123为什么hello 和 123 (一个是字符串,一个是int类型的数据) 就可以直接拼接在一起呢? 因为字符串是爸爸,在这个拼爹的时代,他有一个万能的爸爸Object 换而言之,Object是所有类的父类,任意类都是继承Object类的。而Object中定义了 toString()方法,所以任意类中都包含了toString()方法,对象在实例化之后都可以调用。 所以任意对象转字符串的输出,是通过覆写 toString()方法实现的… 每一个类中都包含有toString(),但是并不是每一个类都覆写了toString()。(注意:每一个类中都有toString方法,因为Object类是所有类的父类,但是不一定每个子类都override,这样看来Object类并不是个抽象类。)
equals():对象比较 String类对象比较 使用的是 equals()方法,实际上String类的equals()方法就是覆写 Object类中的equals()方法。 基本数据类型的比较用 == (如: a == 3,b == 4, a == b,比较的是值是否相等)引用类型数据比较:调用 equals()方法进行比较用equals( )来比较对象内容是否相同:
因为此时直接调用equals()方法默认进行比较的是两个对象的地址。 在源码中,传递来的Object对象和当前对象比较地址值,返回布尔值。
但是在判断两个对象是否相等时,比如要判断一个Person类的两个对象的姓名是否相同时,此时要重新覆写equals()。 还是上面的例子,覆写equals()方法: 比较结果:true 所以,引用类型的数据在进行比较时,应该先覆写equals()方法,不然比较的还是两个对象的堆内存地址值,必然不会相等。 ———————————————— 版权声明:本文为CSDN博主「iqqcode」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/weixin_43232955/article/details/89705350 |
CopyRight 2018-2019 实验室设备网 版权所有 |