常用类--object类

object概述

  1. 该类是层次结构的根类
  2. 每一个类直接或间接继承该类
  3. 所以的列,包括数组都实现这个类中的方法
  4. 任何一个类都会访问object类的无参构造方法
    一但访问到父类的object构造方法,就会将object加载到内存空间中,就会执行object类的静态代码块
  5. 满足java的核心思想,万事万物皆对象
int hashCode ()(重点掌握)

由object类定义的hashcode方法确定会针对同的对象返回不同的整数

特点:

  1. 该值可以理解为地址值的一个转换值,该值相同不能说明两个对象相等,但是可以作为参考,该值不相等那么两个对象不一样
  2. 该值是对象的哈希码值

关于==比较基本数据类型和引用类型
比较基本类型:比较的是数值是否相等
比较引用类型:比较的是地址值是否相等

Class getClass()

返回的是一个字节码文件对象
任何一个类的编译会生成字节码文件对象
student.java–>student.class
这个student.class文件就class类
java万事万物皆对象,那么我们就可以理解为这个class文件在代码中就是class类

String tostring()(重点掌握)

观察tostring的源码

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

默认输出语句输出对象的时候输出的是对象的tostring方法

观察tostring源码发现来自于object的tostring方法打印类名全路径+地址值的转换值的十六进制
对我们毫无意义,object类的tostring方法不能够满足字了student的需求,所以需要方法重写
如何重写?
一般希望打印对象的成员属性值
可以自动生成
Alt+shift+s再按S

boolean equals(Object obj) (重点掌握)
public class ObjectDemo05 {
	public static void main(String[] args) {
		Student s1 = new Student("貂蝉", 18);
		Student s2 = new Student("吕布", 19);
		Student s3 = new Student("貂蝉", 18);
		
		System.out.println(s1.equals(s2)); // false
		System.out.println(s1.equals(s1)); // false
		
//		String str1 = "abc";
//		String str2 = "acd";
//		String str3 = "abc";
//		
//		System.out.println(str1.equals(str2)); // false
//		System.out.println(str1.equals(str3)); // true
//		
//		System.out.println(str1.equals(str1));
//		
//		System.out.println(str1.equals(new Student()));
	}
}

观察equals源码:

    s1.equals(s2)
 public boolean equals(Object obj) {
 				// s1 == s3
        return (this == obj);
    }

再来观察String类equals方法

String str1 = "abc"; [a,b,c]
   String str2 = "abd";
  class String {
   private final char value[];
   public boolean equals(Object anObject) {
   		// 效率考虑
        if (this == anObject) {
            return true;
        }
        
        // 安全性考虑
        if (anObject instanceof String) {
        			"abd"
            String anotherString = (String)anObject;
            int n = this.value.length; // 3
            // 效率考虑
            if (n == anotherString.value.length) {
                char[] v1 = this.value; // 地址传递 [a,b,c]
                char[] v2 = anotherString.value; [a,b,c]
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }
   }

通过观察string和object方法我们知道一般比较成员变量是否相等

这个一般自动生成
alt + shift + s 再按H

protected Object clone() (了解)

克隆:深拷贝和浅拷贝(查资料了解)

java.lang.CloneNotSupportedException
CloneNotSupportedException:需要被clone的类没有实现接口
解决办法:实现cloneable接口

cloneable:该接口没有任何的抽象方法,这样的接口称为标记接口
该接口是否实现本身就是一种功能的体现

clone的内存分析
在这里插入图片描述
在这里插入图片描述
克隆和引用传递的区别
克隆是原空间中独立出来的一份
地址传递是多个引用指向同一堆区空间

protected void finalize()

当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法

public class ObjectDemo07 {
	public static void main(String[] args) throws Throwable {
		Student s = new Student();
		s = new Student();
		
//		s.finalize();
		
//		如果你希望自己来回收垃圾对象,按照如下步骤
//		1.启动垃圾回收期
		System.gc();
//		2.调用系统运行垃圾回收期的回收方法
		System.runFinalization();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值