Java基础04:Object类

Object

Object类是Java种所有类直接或间接的父类。

clone()方法

克隆对象的方法

protected native Object clone() throws CloneNotSupportedException;
  • clone方法用protected修饰,本包内可用 包外有继承关系的子类中也可用
  • .调用的地方同样需要抛出异常
  • .要被克隆的类型必须实现Cloneable接口
//java.lang.Object
public class TestClone extends Object{
	public static void main(String[] args)throws Exception{
		Teacher t1 = new Teacher("Jay");
		Teacher t2 = t1.clone();
		t1.name = "Gay";
		System.out.println(t2.name);	//Jay

		Student s1 = new Student("Bob");
		Student s2 = s1.clone();
        //抛出异常,java.lang.CloneNotSupportedException: Student,因为Student类没有实现Cloneable接口
		System.out.println(s2.name);  
	}
}
class Student{
	String name;
	public Student(String name){
		this.name = name;
	}
	@Override
	public Student clone()throws CloneNotSupportedException{
		Object obj = super.clone();
		return (Student)obj;
	}
}

class Teacher extends Object implements Cloneable{
	String name;
	public Teacher(String name){
		this.name = name;
	}
	@Override
	public Teacher clone()throws CloneNotSupportedException{
		Object obj = super.clone();
		return (Teacher)obj;
	}
}

finalize()方法

对象“遗言”的方法,

 protected void finalize() throws Throwable { 
 
 }
  • gc在回收一个对象之前 会去调用的方法

  • 如何主动的召唤gc

    1. System.gc();
    2. Runtime.getRuntime().gc();
  • 如果在第n行主动调用了gc,gc不能保证立刻出现且回收内存

public class TestFinalize{
	public static void main(final String[] args) {
		while (true) {
			final Teacher tea = new Teacher("Jay");
			// Runtime.getRuntime().gc();
			System.gc();// 主动召唤垃圾回收器 gc
		}
	}
}

class Teacher {
	String name;

	public Teacher(final String name) {
		this.name = name;
		System.out.println("一个老师站起来~");
	}
	@Override
	public void finalize(){
		System.out.println("一个老师倒下去~");
	}
}

toString()方法

将一个对象体现成字符串形式

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

equals()方法

定义一个类型的比较规则

public boolean equals(Object obj) {
    return (this == obj);
}

举例

public class TestEquals{
	public static void main(String[] args){
		/*
		Object o1 = new Object();
		Object o2 = new Object();
		System.out.println(o1.equals(o2));
		*/
		Cacti cc = new Cacti();

		String str1 = new String("ETOAK");
		String str2 = null;
		System.out.println(str1.equals(cc));

		Student s1 = new Student("Jay");
		Student s2 = null;
		System.out.println(s1.equals(cc));//?
	}
}
class Cacti{}//仙人球
class Student{
	String name;
	public Student(String name){
		this.name = name;
	}
	@Override
	public String toString(){
		return name;
	}
	@Override
	public boolean equals(Object obj){
		//将自己的需求学会通过覆盖这个方法描述出来
		//让equals更加健壮 防止参数为null
		if(obj == null)	return false;
		//让equals更加健壮 防止参数类型错误
		if(!(obj instanceof Student)) return false;
		//让equals更加高效 不做无用的比较
		if(obj == this) return true;
		//1st.找到参与比较的两个对象v
		Student s1 = this;//调用方法的那个学生
		Student s2 = (Student)obj;//作为参数传入的那个学生
		return s1.name.equals(s2.name);
	}
}

class Teacher{
	String name;
	public Teacher(String name){
		this.name = name;
	}
	@Override
	public String toString(){
		return name;
	}
	@Override
	public boolean equals(Object obj){
		if(obj == null) return false;
		if(!(obj instanceof Teacher)) return false;
		if(obj == this) return true;
		Teacher t1 = this;
		Teacher t2 = (Teacher)obj;
		return t1.name.equals(t2.name);
	}
}

hashCode()方法

定义一个对象的散列码(哈希码)

public native int hashCode();

举例

//哈希表
/*
	哈希表又名散列表 = 将一大组数据分散排列成若干小组

		46  27  79  34  99  87  53  19			x
		s1  s2  s3  s4  s5  s6  s7  s8
[0]
[1]		53
[2]		34	46
[3]		19	99	79	27

*/
public class TestHashCode{
	public static void main(String[] args){

	}
}
class Student{
	String name;
	int age;
	public Student(String name,int age){
		this.name = name;
		this.age = age;
	}
	@Override
	public String toString(){
		return name + " : " + age;
	}
	@Override
	public boolean equals(Object obj){
		if(obj == null) return false;
		if(!(obj instanceof Student)) return false;
		if(obj == this) return true;
		Student s1 = this;
		Student s2 = (Student)obj;
		return s1.name.equals(s2.name) && s1.age == s2.age;
	}
	//equals方法返回true的两个对象 哈希码应当生成相同的整数
	@Override
	public int hashCode(){
		return name.hashCode() + age;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值