02Object概述

发布时间 2023-10-20 19:57:43作者: ahssmy

Object类

  • Object类是:超类、基类,所有类的直接或者间接父类,位于继承树的最顶层。
  • 任何类,如果没有书写extends显示继承某个类,都默认直接直接继承Object类,否则为间接继承。
  • Object类中所定义的方法,是所有对象都具备的方法。
  • Object类可以存储任何对象。
    • 作为参数,可接受任何对象。
    • 作为返回值,可返回任何对象。

一、getClass()方法

  • public final Class<?> getClass(){}

  • 引用:对象.getClass();

  • 返回引用中的存储的 实际对象类型。

  • 应用:通常用于判断两个引用中实际存储对象类型是否一致。

    Student类

    public class Student {
    	private String name;
    	private int age;
    	
    	public Student() {
    		// TODO Auto-generated constructor stub
    	}
    //	构造类
    	public Student(String name, int age) {
    		super();
    		this.name = name;
    		this.age = age;
    	}
    	
    	//get/set方法
    	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;
    	}
    }
    

    测试类:

    public class MytestStudent {
    	public static void main(String[] args) {
    		Student s1 = new Student("aaa",22);
    		Student s2 = new Student("ccc",33);
    		
    		//使用getClass();判断s1和s2是不是同一个类
    		Class c1 = s1.getClass();
    		Class c2 = s2.getClass();
    		
    		if(c1==c2) {
    			System.out.println("s1和s2是同一个类型");
    		}else {
    			System.out.println("s1和s2不是同一个类型");
    		}
    	}
    }
    

    1

二、hashCode() 方法

  • public int hashCode(){}

  • 返回该对象的哈希码值。

  • 哈希值是根据 对象的地址 或字符串 或数字使用hash算法计算出来的int类型的数值。

  • 一般情况下相同对象返回相同的哈希码。

    hashCode测试类(Student用的是getClass的):

    public class MytestStudent {
    	public static void main(String[] args) {
    		Student s1 = new Student("aaa",22);
    		Student s2 = new Student("ccc",33);
    		//hashCode方法
    		System.out.println(s1.hashCode());
    		System.out.println(s2.hashCode());
    		
    		Student s3 = s1;
    		
    		System.out.println(s3.hashCode());
    	}
    

    2

三、toString()方法

  • public String toString(){}

  • 返回该对象的字符串表示(表现形式)。

  • 可以根据程序需求覆盖该方法,如:展示对象各个属性值。

  • 可以重写toString方法,以实现新功能

    测试类(Student用的是getClass的):可以打印出带包名称@hash值

    		System.out.println(s1.toString());
    		System.out.println(s2.toString());
    
  • 重写toString方法

    public String toString() {
    		return "Student [name=" + name + ", age=" + age + "]";
    	}
    //再次打印就会得到不同的输出
    

    3

四、equals()方法

  • public boolean equals(Object obj){}

  • 默认实现为(this == obj),比较两个对象地址是否相同。this是指当前对象。

    测试类(Student用的是getClass的):

    //4equls方法,判断两个对象是否相等
    		System.out.println("---------equls方法----------");
    		System.out.println(s1.equals(s2)); //在堆当中,地址不一样,所以是false
    		
    		Student s4 = new Student("小明",17);
    		Student s5 = new Student("小明",17);
    		System.out.println(s4.equals(s5)); //在堆当中,地址不一样,所以是false
    

    4

  • 可进行覆盖,比较两个的对象的内容是否相同。

  • equals()方法覆盖步骤

    • 比较两个引用是否指向同一个对象。

    • 判断obj是否为null。

    • 判断两个引用指向的实际对象类型是否一致。

    • 强制类型转换

    • 依次比较各个属性值是否相等

      重写equals()方法

      public boolean equals(Object obj) {
      		 //1判断两个对象是否是同一个引用
      		 if(this==obj) {
      			 return true;
      		 }
      		 //2判断obj是否null
      		 if(obj == null) {
      			 return false;
      		 }
      		 //3判断是否为同一个类型
      		 /*
      		 if(this.getClass() == obj.getClass()) {
      			 
      		 }*/
      		 
      		 //instanceof 判断对象是否相同类型类型
      		 if(obj instanceof Student) {
      			 //4强制类型转换
      			 Student s =(Student)obj;
      			 //5比较属性
      			 if(this.name.equals(s.getName())&&this.age==s.getAge()) {
      				 return true;
      			 }
      		 }
      	      return false;
      	    }
      //测试类用上面的测试类
      

五、finalize()方法

  • 当对象被判定为垃圾对象时,由jvm自动调用此方法,用以标记垃圾对象进入回收队列。

    • 垃圾对象:没有有效引用指向此对象时,为垃圾对象。

    • 垃圾回收:由CG销毁垃圾对象,释放数据存储空间。

    • 自动回收机制:jvm的内存耗尽,一次性回收所有的垃圾对象。

    • 手动回收机制:使用System.gc();通知jvm执行垃圾回收。

      重写垃圾回收方法:

       @Override
      	protected void finalize() throws Throwable {
      		System.out.println(this.name+"对象被回收了");
      	}
      

      测试类:

      		new Student("aaa",22);
      		new Student("bbb",22);
      		new Student("ccc",22);
      		new Student("ddd",22);
      		new Student("eee",22);
      		System.gc();
      		System.out.println("垃圾回收");