Java中的Object类详细解读

 更新时间:2023年11月29日 09:55:36   作者:时代&信念  
这篇文章主要介绍了Java中的Object类详细解读,java.lang.Object是类层次结构的根类,即所有其它类的父类,每个类都使用 Object 作为超类,需要的朋友可以参考下

什么是Object类?

类 java.lang.Object是类层次结构的根类,即所有其它类的父类。

每个类都使用 Object 作为超类。(父类和超类是一个意思,不同的叫法) 也就是当初的Java语言设计时,就将Object作为所有类的父类, 是万类之父。

①Object类型的变量与除Object以外的任意引用数据类型的对象都存在多态引用。

method(Object obj){…} //可以接收任何类作为其参数
Person o = new Person();  
method(o);

②所有对象(包括数组)都实现这个类的方法。

③如果一个类没有特别指定父类,那么默认则继承自Object类。

public class Person {
	...
}
//等价于:
public class Person extends Object {
	...
}

Object类的相关方法

  1. equals()
  2. = =:

基本类型比较值:只要两个变量的值相等,即为true。

int a=5; 
if(a==6){…}

引用类型比较引用(是否指向同一个对象):只有指向同一个对象时,==才返回true。

Person p1=new Person();  	    
Person p2=new Person();
if (p1==p2){…}

用“==”进行比较时,符号两边的数据类型必须兼容(可自动转换的基本数据类型除外),否则编译出错

equals()

所有类都继承了Object,也就获得了equals()方法。还可以重写。

  • 只能比较引用类型,Object类源码中equals()的作用与“==”相同:比较是否指向同一个对象。
  • 特例:当用equals()方法进行比较时,对类File、String、Date及包装类(Wrapper Class)来说,是比较类型及内容而不考虑引用的是否是同一个对象;
  • 原因:在这些类中重写了Object类的equals()方法。
  • 当自定义使用equals()时,可以重写。用于比较两个对象的“内容”是否都相等。

经典面试题:==和equals的区别?

  • == 既可以比较基本类型也可以比较引用类型。对于基本类型就是比较值,对于引用类型就是比较内存地址
  • equals的话,它是属于java.lang.Object类里面的方法,如果该方法没有被重写过默认也是==;我们可以看到String等类的equals方法是被重写过的,而且String类在日常开发中用的比较多,久而久之,形成了equals是比较值的错误观点。
  • 具体要看自定义类里有没有重写Object的equals方法来判断。
  • 通常情况下,重写equals方法,会比较类中的相应属性是否都相等。

toString()

方法声明:public String toString()

① 默认情况下,toString()返回的是“对象的运行时类型 @ 对象的hashCode值的十六进制形式"

② 在进行String与其它类型数据的连接操作时,自动调用toString()方法

Date now=new Date();
System.out.println(“now=”+now);  //相当于
System.out.println(“now=”+now.toString()); 

③ 如果我们直接System.out.println(对象),默认会自动调用这个对象的toString()

因为Java的引用数据类型的变量中存储的实际上是对象的内存地址,但是Java对程序员隐藏内存地址信息,所以不能直接将内存地址显示出来,所以当你打印对象时,JVM帮你调用了对象的toString()。

④ 可以根据需要在用户自定义类型中重写toString()方法 如String 类重写了toString()方法,返回字符串的值。

s1="hello";
System.out.println(s1);//相当于System.out.println(s1.toString());

例如自定义的Person类:

public class Person {  
    private String name;
    private int age;

    @Override
    public String toString() {
        return "Person{" + "name='" + name + '\'' + ", age=" + age + '}';
    }
}

finalize()

  • 当对象被回收时,系统自动调用该对象的 finalize() 方法。(不是垃圾回收器调用的,是本类对象调用的)
    • 永远不要主动调用某个对象的finalize方法,应该交给垃圾回收机制调用。
  • 什么时候被回收:当某个对象没有任何引用时,JVM就认为这个对象是垃圾对象,就会在之后不确定的时间使用垃圾回收机制来销毁该对象,在销毁该对象前,会先调用 finalize()方法。
  • 子类可以重写该方法,目的是在对象被清理之前执行必要的清理操作。比如,在方法内断开相关连接资源。
    • 如果重写该方法,让一个新的引用变量重新引用该对象,则会重新激活对象。
  • 在JDK 9中此方法已经被标记为过时的。
public class FinalizeTest {
	public static void main(String[] args) {
		Person p = new Person("Peter", 12);
		System.out.println(p);
		p = null;//此时对象实体就是垃圾对象,等待被回收。但时间不确定。
		System.gc();//强制性释放空间
	}
}

class Person{
	private String name;
	private int age;

	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	//子类重写此方法,可在释放对象前进行某些操作
	@Override
	protected void finalize() throws Throwable {
		System.out.println("对象被释放--->" + this);
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	
}

getClass()

public final Class<?> getClass():获取对象的运行时类型

因为Java有多态现象,所以一个引用数据类型的变量的编译时类型与运行时类型可能不一致,因此如果需要查看这个变量实际指向的对象的类型,需要用getClass()方法

public static void main(String[] args) {
	Object obj = new Person();
	System.out.println(obj.getClass());//运行时类型
}

结果:

class com.atguigu.java.Person

到此这篇关于Java中的Object类详细解读的文章就介绍到这了,更多相关Java中的Object类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring AOP 切面@Around注解的用法说明

    Spring AOP 切面@Around注解的用法说明

    这篇文章主要介绍了Spring AOP 切面@Around注解的用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • springcloud安装rabbitmq并配置延迟队列插件的过程详解

    springcloud安装rabbitmq并配置延迟队列插件的过程详解

    本期主要讲解如何利用docker快速安装rabbitmq并且配置延迟队列插件,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • 两张动图--带你搞懂TCP的三次握手与四次挥手

    两张动图--带你搞懂TCP的三次握手与四次挥手

    TCP是一种传输控制协议,是面向连接的、可靠的、基于字节流之间的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,TCP完成第四层传输层所指定的功能
    2021-06-06
  • Java实现多项式除法的代码示例

    Java实现多项式除法的代码示例

    今天小编就为大家分享一篇关于Java实现多项式除法的代码示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • 如何利用Java输出链表中倒数第k个结点

    如何利用Java输出链表中倒数第k个结点

    这篇文章主要给大家介绍了关于如何利用Java输出链表中倒数第k个结点的相关资料,文中通过实例代码介绍的非常详细,对大家学习或者使用java具有一定的参考学习价值,需要的朋友可以参考下
    2021-12-12
  • ZooKeeper入门教程三分布式锁实现及完整运行源码

    ZooKeeper入门教程三分布式锁实现及完整运行源码

    本文是ZooKeeper入门系列教程,分布式锁有多种实现方式,比如通过数据库、redis都可实现。作为分布式协同工具ZooKeeper,当然也有着标准的实现方式。本文介绍在zookeeper中如何实现排他锁
    2022-01-01
  • JAVA中String类与StringBuffer类的区别

    JAVA中String类与StringBuffer类的区别

    这篇文章主要为大家详细介绍了JAVA中String类与StringBuffer类的区别,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • 如何使用JJWT及JWT讲解和工具类

    如何使用JJWT及JWT讲解和工具类

    关于JWT的文章网上已经多如牛毛了,但是相信很多同学学的还是云里雾里,所以在我学习JWT之后尽量用最简洁的描述写下这篇文章用于日后复习,与此同时也希望可以帮助同学们共同进步
    2021-09-09
  • MyBatis的核心配置文件以及映射文件

    MyBatis的核心配置文件以及映射文件

    这篇文章主要介绍了MyBatis的核心配置文件以及映射文件,Mybatis它是一款半自动的ORM持久层框架,具有较高的SQL灵活性,支持高级映射(一对一,一对多),动态SQL,延迟加载和缓存等特性,但它的数据库无关性较低,需要的朋友可以参考下
    2023-05-05
  • ssm实现视频的上传与播放的示例代码

    ssm实现视频的上传与播放的示例代码

    这篇文章主要介绍了ssm实现视频的上传与播放的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04

最新评论