常用类学习(二)

Java基本类的学习(二)

Object类

概念:

  • Object类是所有类直接或者间接父类,位于继承树的顶端。

  • 任何类如果没有书写extends显示继承某个类,都默认直接继承Object类,否则为间接继承。

  • 所定义的方法,是所有对象都具备的方法。

  • Object类型可以存储任何对象。

    • 作为参数,可以接受任何对象。
    • 作为返回值,可返回任何对象。

getClass()方法

  • public final Class<?> getClass(){}
  • 作用:返回引用中存储的实际对象类(返回需要判断的这个类是什么类型)。
  • 应用:用于判断两个引用中实际存储对象类型是否一致。
public class Student{
    private String name;
    private int age;
    
    public void Student(){
        
    }
    public void Student(String name,int age){
        this.name = name;
        this.age = age;
    }
    public String getName(){
        return name;
    }
    public int getAge(){
        return age;
    }
    public String setName(String name){
        this.name = name;
    }
    public int setAge(int age){
        this.age = age;
    }
}

测试类:输出结果应该为属于同一类

public class TestStudent(){
    public static void main(String[] args){
        student1 = new Studnet("aaa",20);
        studnet2 = new Student("bbb",22);
        //判断s1和s2是不是同一个类型
        Class class1 = s1.getClass();
        Class class2 = s2.gettClass();
        if(class1 == class2){
            System.out.println("s1和s2属于同一个类型");
        }else{
            System.out.println("s1和s2不属于同一个类型");
        }
    }
}

hashCode()方法

  • public int hashCode(){}
  • 作用:返回该对象的哈希值.
  • 哈希值根据对象的地址或者字符串或数字使用hash算法计算出来的int类型的数值。
  • 一般情况下相同对象返回相同的哈希码。
//hashCode方法,可以放在TestStudent(上面那个)类中测试
	System.out.println(s1.hashCode());

	System.out.println(s2.hashCode());

	Student s3=s1;
	System.out.println(s2.hashCode());
	//此时执行会发现s1的hash值和s3的hash值相同

因为s1的地址与s3的地址相同,所以使用hashCode方法生成的哈希值也会相同

toString()方法

  • public String toString(){}
  • 作用:返回该对象的字符串表示(表现形式)。
  • 可以根据程序需求覆盖(重写)该方法,如:展示对象各个属性。

演示:

//toString方法	可以放在TestStudent(上面那个)类中测试
System.out.println(s1.toString());
System.out.println(s2.toString());

会输出对象的全名称和hash值(16进制),可以自行转换与hashCode方法输出进行对比

但是这些数据有时候对于我们来说并没有意义,那么我们可以对其进行重写

//重写toString()方法	idea快捷方法 insert+control
//在上面Student类中重写方法
public String toString(){
    
    return name + ":" + age;
    
}

equals()方法

  • public boolean equals(Object obj){}
  • 默认实现为(this == obj),比较两个对象的地址是否相同。
  • 可以进行覆盖(重写),比较两个对象的内容是否相同。

测试:

//equals()方法 判断两个方法是否相等

System.out.println(s1.equals(s2));
//false

Student s4 = new Student("小明",17);
Student s5 = new Student("小明",17);
System.out.println(s1.equals(s2));
//false
S1 S3 S5
X00012 X00001 X12345
S2 S4 对象
X00043 X00124 模拟地址

s4,s5虽然内容一样,但是在堆中的地址并不一样

重写步骤:

@Override
public boolean equals(Object obj){
    //1、判断两个对象是否是同一个引用
    if(this == obj){
        return true;
    }
    //2、判断obj是否为空null
    if(obj == null){
        return false;
    }
    //3、判断是否是同一个类型
    //instanceof可以判断对象是否是某种类型
    if(obj instanceof Student){
        //4、强制类型转换
        Student s = (Student)obj;
        //5、熟悉比较
        if(this.name.equals(s.getName())&&this.getAge() == obj.getAge())
    }
}

这个时候再次运行上面的测试类就会发现s4.equals(s5)返回的结果为true

finalize()方法

  • 当对象被系统判定为垃圾对象时,有JVM自动调用此方法,用以标记垃圾对象,进入回收队列。
  • 垃圾对象定义:没有有效引用指向此对象时,为垃圾对象。
  • 垃圾回收:由GC销毁垃圾对象,释放数据存储空间。
  • 自动回收机制:JVM的内存耗尽,一次性回收所有的垃圾对象。
  • 手动回收机制:使用System.gc();通知JVM执行垃圾回收。

重写方法:

@Override
//在Student类中重写finalize()方法
protected void finalize() throws Throwable{
    System.out.println(this.name+"对象被回收了");
}

测试:

//finalize()方法
public class TestStudent2{
    public static void main(String[] args){
        Student s1 = new Student("aaa",20);
        Student s2 = new Student("bbb",20);
        Student s3 = new Student("ccc",20);
        Student s4 = new Student("ddd",20);
        Student s5 = new Student("eee",20);
        //通知系统回收垃圾
        System.out.println("回收垃圾");
    }
}

执行后会发现只输出了垃圾回收,并没有输出xxx对象被回收了

原因:这些对象都在被引用所以不算垃圾对象,不会被系统清除

我们可以改成如下形式:

public class TestStudent2{
    public static void main(String[] args){
        new Student("aaa",20);
        new Student("bbb",20);
        new Student("ccc",20);
        new Student("ddd",20);
        new Student("eee",20);
        //通知系统回收垃圾
        System.out.println("回收垃圾");
    }
}

大家自己测试一下就可以知道结果啦。

posted @ 2021-03-05 09:48  江小豚  阅读(30)  评论(0)    收藏  举报