Object类中的常用方法

5 篇文章 2 订阅

一,equals()方法

1,所有类都从Object类中继承equals()方法
2,Object中的equals方法是直接判断this和obj本身的值是否相等,即用来判断调用equals的对象和形参obj所引用的对象是否是同一对象,所谓同一对象就是指内存中同一块存储单元,如果this和obj指向的hi同一块内存对象,则返回true,如果this和obj指向的不是同一块内存,则返回false,注意:即便是内容完全相等的两块不同的内存对象,也返回false。
3,如果是同一块内存,则object中的equals方法返回true,如果是不同的内存,则返回false

4,如果希望不同内存但相同内容的两个对象equals时返回true,则我们需要重写父类的equals()方法(类似于String类中重写的toString()方法)

5,String类已经重写了object中的equals方法

二,toString()方法

1,toString
public String toString()返回该对象的字符串表示。通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。
Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:
getClass().getName() + ‘@’ + Integer.toHexString(hashCode())
返回:
该对象的字符串表示形式。

/*public String toString();返回该对象的字符串表示
 * 
 * 
 * getClass().getName() + '@' + Integer.toHexString(hashCode())
 * 
 * Integer类下的一个静态方法
 * public static String toHexString(int i):把一个整数转化为16进制表示的字符串
 * 
 * 现在是没有意义的,所以建议子类重写该方法(把该类的所有成员变量值组成返回即可),可以自动生成
 */
public class ToStringTest {
	public static void main(String[] args) {
		teacher t2 = new teacher();
		teacher t3 = new teacher();
		System.out.println(t2);
		System.out.println(t3);
		System.out.println("-----------------");
		System.out.println(t2.hashCode());//366712642
		System.out.println(t2.getClass().getName());
		System.out.println("-----------------");
		System.out.println(t3.hashCode());//1829164700
		System.out.println(t3.getClass());
		System.out.println("-----------------");
		System.out.println(t2.toString());
		System.out.println(t3.toString());
		System.out.println("-----------------");
		System.out.println(t2.getClass().getName()+'@'+Integer.toHexString(t2.hashCode()));
		System.out.println(t2.toString());
	}

}
class teacher{
	private String name;
	private int age;
	public teacher(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public teacher() {
		super();
		// TODO 自动生成的构造函数存根
	}
	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
	//public String toString() {
		// TODO 自动生成的方法存根
	//	return super.toString();
		//return "hello";
	//}
	@Override
	public String toString() {
		return "teacher [name=" + name + ", age=" + age + "]";
	}
	
}
————————————————
版权声明:本文为CSDN博主「围巢111」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40817827/article/details/89072258

————————————————
这里的知识引用了围巢111的这篇博客

2,子类可以使用父类中的方法,且Object类是所有类的默认父类(只要你不extends其他类),也就是说所有类都继承Object类,所以如果子类中不重写,就会按Object类中的构造的那样输出

三,finalize()方法

1,在object类中的源代码:
protected void finalize()throws Throwable()
2,finalize()方法只有一个方法体,里面没有代码,而且这个方法是protected修饰的。

class Person{
    protected void finalize()throws Throwable{
//        this代表当前对象
//        当对象被销毁时,finalize()方法才会被运行
        System.out.println(this+"即将被销毁!");
    }
}

3,这个方法不需要程序员手动调用,JVM垃圾回收器负责调用这个方法。
不像equals和toString方法,equals和toString方法是需要你来写代码调用的
finalize()方法只需要重写,写完将来自动会有程序来调用。
4,finalize()方法的执行时机:
当一个java对象即将被垃圾回收器回收的时候,垃圾回收器负责调用

public class Finalize{
	public static void main(String[] args) {
//      创建对象
        for(int i=0;i<10000000;i++){
            Person p=new Person();
//        怎么把垃圾回收器变成垃圾?
//

//        有一段代码可以建议垃圾回收器启动,当然只是建议,在垃圾过少时还是不一定成功,只是启动的概率高了些
            p=null;
        }

    }
}

5,finalize()方法实际上是sun公司为java程序员准备的一个时机,垃圾销毁时机。
如果希望在对象销毁时机执行一段代码的话,这段代码要写到finalize()方法当中。
6,这其实有点像静态代码块,静态代码块的作用是什么?
static{

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

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

7,java中的垃圾回收器不是轻易启动的,垃圾太少,或者时间没到,种种条件下,就有可能启动有可能不启动。

//项目开发中有这样的业务需求:所有对象在JVM虚拟机中释放的时候,请记录一下释放时间!!!
//记录对象被释放的时间点,这个负责记录的代码写在哪里?
//写到finalize()方法中。
public class Finalize{
	public static void main(String[] args) {
//      创建对象
        for(int i=0;i<10000000;i++){
            Person p=new Person();
//        怎么把垃圾回收器变成垃圾?
//

//        有一段代码可以建议垃圾回收器启动,当然只是建议,在垃圾过少时还是不一定成功,只是启动的概率高了些
            p=null;
            System.gc();
        }

    }
}

四,hashcode()方法

hashcode()方法返回的是哈希码:
1,实际上就是一个java对象的内存地址,经过哈希算法,得出的一个值。
2,所以hashcode()方法的运算结果可以等同看作一个java对象的内存地址。

public class HashCode{
	public static void main(String[] args) {
        Object o=new Object();
        int hashcodevalue=o.hashCode();
        System.out.println(hashcodevalue);//460141958
        Myclass clas=new Myclass();
        hashcodevalue=clas.hashCode();
        System.out.println(hashcodevalue);//1163157884
        Myclass clas2=new Myclass();
        System.out.println(clas2.hashCode());//1956725890
    }
}
  • 9
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值