Java中的Object类中的部分方法

发布时间:2024年01月16日

一、toString()方法

关于Object类中的toString()方法

?? 1.源代码长什么样?

????? public String toString(){

???????? return this.getClass().getName()+"@"+Inter.toHexString(hashCode());

????? }

????? 源代码上toString()方法的默认实现是:

????????? 类名@对象的内存地址转换为十六进制的形式

?? 2.SUN公司设计toString()方法的目的是什么?

????? toString()方法的作用是什么?

????? toString()方法的设计目的是:通过调用这个方法可以将一个“java对象”转换成字符串表示形式。

??? 3.其实SUN公司开发java语言的时候,建议所有的子类都去重写toString()方法。toString()方法应该是一个简洁的,详实的,易阅读的。

?? 以后所有类的toString()方法是需要重写的。重写规则,越简单越明了

?? System.out.println(引用);这里会自动调用”引用"的toString()方法

?? String类是SUN写的,toString方法已经重写了。

?public class Test01{

????? public static void main(String[] args){

????????? MyTime t1 = new MyTime(1970,1,1);

????????? //一个日期对象转换成字符串形式的话,可能还是希望能看到具体的日期信息

?????? String s1 = t1.toString();

?????? //MyTime类重写toString()方法之前

????? System.out.println(s1);??????? //MyTime@02a418fc

?????? //MyTime类重写toString()方法之后

????? System.out.println(s1);???????? //1970年1月1日

????? //System.out.println(t1.toString());??? //1970年1月1日

????? //输出引用的时候,会自动调用该引用的toString()方法

???? System.out.println(t1);

???? }

}

?class MyTime{

???? int year;

???? int month;

???? int day;

? public MyTime(){

? }

? public MyTime(int year,int month,int day){

? this.year = year;

? this.month = month;

? this.day = day;

?}

?//重写toString方法

?//如何重写?

?//越简洁越好,可读性越强越好,向简洁的,详实的,易阅读的方向发展

?public String toString(){

? return this.year+"年"+this.month+"月"+this.day+"日”;

?// return this.year+"/"+this.month+"/"+this.day+"/”;

}

二、equals方法

关于Object类中的equals方法

? 1.equals方法的源代码

???? public boolean equals(Object obj){

?????? return (this==obj);

???? }

?以上这个方法是Object类的默认实现

?2.SUN公司设计equals方法的目的是什么?

??? 以后编程的过程当中,都要通过equals方法来判断两个对象是否相等。

?3.在Object类中的equals方法当中,默认采用的是“==”判断两个java对象是否相等。而

“==”判断的是两个java对象的内存地址,我们应该判断两个java对象的内容是否相等。所以

Object的equals方法不够用,需要子类重写equals方法。

?4.判断两个java对象是否相等,不能使用“==”,因为“=="比较的是两个对象的内存地址。

?以后所有类的equlas方法也需要重写,因为Object中的equals方法比较的是两个对象的内存地址,我们应该比较的是内容,所以需要重写

?基本数据类型比较使用:==

?对象和对象比较:调用equals方法

String类是SUN编写的,所以String类的equals方法重写了。

判断两个字符串是否相等,最好不要使用==,要调用字符串对象的equals方法

?1.String类已经重写了equals方法,比较两个字符串不能使用==,必须使用equals方法,

equals方法是通用的。

?2.String类已经重写了toString方法

?java中什么类型的数据可以使用”==“判断

?? java中基本数据类型比较是否相等,使用==

java中什么类型的数据需要使用equals判断

? java中所有的引用数据类型统一使用equals方法来判断是否相等

?字符串也不可以用双等号比较

?//equals方法重写的时候要彻底

?public class Test05{

??? public static void main(String[] args){

???? User u1 = new User("zhangsan",new Address("北京","大兴区","11111”));

???? User u2 = new User("zhangsan",new Address("北京","大兴区","11111”));

???? System.out.println(u1.equals(u2));?????????? //true

??

??? User u3= new User("zhangsan",new Address("北京","朝阳区","11112”));

???? System.out.println(u1.equals(u3));????????? //false

??? }

}

?class User{

?? //用户名

? String name;

? //用户的地址

?Address addr;

?public User(){

? }

?public User(String name,Address addr){

? this.name=name;

? this.addr = addr;

?}

? //重写equals方法

?//重写规则:当一个用户的用户名和家庭住址都相同,表示同一个用户

//这个equals判断的是User对象和User对象是否相等

?public boolean equals(Object obj){

? //用户名和用户名相同,住址和住址相同的时候,认定是同一个用户

? if(obj==null ||!(obj instanceof User))???? return false;

? if(this==obj)????????????????????????????????????????? return true;

? User u = (User) obj;

? if(this.name.equals(u.name)&&this.addr.equals(u.addr)){

??? return true;

? }

? return false;

?}

}

?class Address{

??? String city;

??? String street;

??? String zipcode;

???

?? public Address(){

?? }

?? public Address(String city,String street,String zipcode){

?? this.city=city;

?? this.street=street;

?? this.zipcode=cipcode;

?? //注意:这里并没有重写equals方法

? //这里的equals方法判断的是:Address对象和Address对象是否相等

?? public boolean equals(Object obj){

???? if(obj==null ||!(obj instanceof User))???? return false;

???? if(this==obj)????????????????????????????????????????? return true;

???? //怎样才算家庭住址相同呢?

??? //城市相同,街道相同,邮编相同,表示相同

?? Address a = (Address)obj;

?? if(this.city.equals(a.city)&&this.street.equals(s.street)&&(this.zipcode.equals(a.zipcode)){

?????? return true;

?? }

????? return false;

? }

?? }

三、finalize()方法

?关于Object类中的finalize()方法

? 1.在Object类中的源代码

???? protected void finalize() throws Throwable{ }

???? GC:负责调用finalize()方法。

? 2.finalize()方法只有一个方法体,里面没有代码,而且这个方法是protected修饰的

? 3.这个方法不需要程序员手动调用,JVM垃圾回收器负责调用这个方法。

????? 不像equals toString,equals和toString()方法是需要你写代码调用的。

????? finalize()只需重写,重写完将来自动会有程序来调用。

? 4.finalize()方法的执行时机:

????? 当一个java对象即将被垃圾回收器回收的时候,垃圾回收器负责调用finalize()方法

? 5.finalize()方法实际上是SUN公司为java程序员准备的一个时机,垃圾销毁时机。如果

希望在对象销毁时机执行一段代码的话,这段代码要写到finalize()方法当中。

?6.静态代码块的作用是什么?

??? static{

???? ……

?? }

?? 静态代码块在类加载的时刻执行,并且只执行一次。这是一个SUN准备的类加载时机。

?? finalize()方法同样也是SUN为程序员准备的一个时机。这个时机是垃圾回收时机。

public class Test06{

?? public static void main(String[] args){

???? //创建对象

?? Person p = new Person();

?? //怎么把Person对象变成垃圾?

? p = null;

? }

}

//项目开发中有这样的业务需求:所有对象在JVM中被释放的时候,请记录一下释放时间

//记录对象被释放的时间点,这个负责记录的代码写到哪里?

//写到finalize()方法中

?class Person{

?? //重写finalize方法

? //Person类型的对象被垃圾回收器回收的时候,垃圾回收器负责调用:p.finalize();

? protected void finalize() throws Throwable{

???? System.out.println("年月日");

?? }

}

四、hashCode方法

关于Object类中的hashCode方法:

?? 在Object中的hashCode方法是怎么样的?

??? public native int hashCode();

这个方法不是抽象方法,带有native关键字,底层调用C++程序

?hashCode()方法返回的是哈希码:

??? 实际上就是一个java对象的内存地址,经过哈希算法,得出的一个值。

所以hashCode()方法的执行结果可以等同看作一个java对象的内存地址。

public class Test07{

??? public static void main(String[] args){

?????? Object o = new Object();

?????? int hashCodeValue = o.hashCode();

????? //对象内存地址经过哈希算法转转的一个数字。可以等同看作内存地址

??? System.out.println(hashCodeValue);? //798154996

??? MyClass mc = new MyClass();

??? int hashCodeValue = mc.hashCode();

??? System.out.println(hashCodeValue2);???????? //1392838282

??

??? MyClass mc2 = new MyClass();

??? System.out.println(mc2.hashCode());?????? //523429237

?? }

}

?class MyClass{

}

文章来源:https://blog.csdn.net/m0_74249744/article/details/135628027
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。