SentralLiu

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

 Object基本操作(重点)
Object类:老祖宗类,所有类直接或间接继承Object
Object类中的方法是所有类都具有的方法---继承性

Object中的多态使用:
1.直接Object引用子类对象
2.Object引用传参方式接收对象
3.Object以返回值方式接收对象

class Son{
    
}  
public class BasicTest {
    public static void main(String[] args) {
        Object obj1 = new Son();  //多态核心--父类引用直接指向子类对象
        
        test(new Son());
        
        Object obj3 = getSon();  //以返回值方式实现多态
    }

    private static Object getSon() {
        return new Son();
    }

    private static void test(Object obj) { //Object以传参方式实现多态
        
    }
}

2.2 Object的getClass方法
getClass方法: 获取Object类的类对象

class Person{
    
}
public class ClassTest {
    public static void main(String[] args) {
        Class class1 = new Object().getClass();  //获取Object的类对象
        Class class2 = new Object().getClass(); 
        //获取类对象,只要调用对象所在类是同一个类,那么类对象就是同一个
        System.out.println(class1==class2);  //true---反射机制
        
        Class class3 = new Person().getClass();
        Class class4 = new Person().getClass();
        System.out.println(class3==class4); //true--两个都是Person类的对象,所以类对象一致
    }
}


2.3.Object的hashCode方法(重点)
Object的hashCode:每个不同对象都会得到一个唯一的hash值(整数值)
应用场景:new不同对象,根据相同属性设置,决定hashCode一致

案例: 获取自定义对象的hashCode
目的: 属性一致,则hash值相同,如何做?
解决方案---重写,父类的方法不适用我,我需要重写

class Student{
    String name;
    public Student(String name) {
        this.name = name;
    }
    
    @Override
    public int hashCode(){
        //重写后,将调用Object的hashCode转为了调用String类型的hashCode
        return name.hashCode(); //返回属性的hashCode
    }
}
public class HashCodeTest {
    public static void main(String[] args) {
        System.out.println(new Object().hashCode());  //不同对象,两个打印的hashCode不同
        System.out.println(new Object().hashCode());
        
        
        System.out.println(new Student("fengjie").hashCode());
        System.out.println(new Student("fengjie").hashCode());
    }
} 

2.3 toString方法(重点)

Object的toString:用于打印类名@hash值
应用场景:toString一般用于打印自身对象,返回属性值的打印
处理方案:重写自定义类的toString方法

class Teacher{
    private String name;
    public Teacher(String name) {
        this.name = name;
    }
    
    @Override  //重写Object的toString方法,返回属性值
    public String toString() {
        return name;
    }
}

public class ToStringTest {
    public static void main(String[] args) {
        Object obj = new Object();
        System.out.println(obj.toString()); //java.lang.Object@15db9742
        
        Teacher teacher = new Teacher("fengjie");
        System.out.println(teacher.toString()); 
        
        //简化版打印对象:
        System.out.println(teacher);
    }
}


2.4.equals方法(重点)

Object的equals方法:
比较两个对象是同一个对象,返回结果才为true, 等价于‘==’案例:自定义对象比较相等
应用场景:  往往属性值一致,则认为是同一个对象
问题: 传入相同属性名,但是调的依然是Object的equals方法,还是比较地址
解决方案: 重写equals,按自己方式比较属性值

class Star{

    private String name;
    public Star(String name) {
        this.name = name;
    }
    
    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Star) {
            Star star = (Star) obj;
            //转为了属性String的equals的调用,String的equals方法就是比较内容的
            return this.name.equals(star.name);
            
        }else {
            return false;
        }
        
    }
    
}
public class EqualsTest {
    public static void main(String[] args) {
        Object object = new Object();
        System.out.println(object.equals(object));  //true
        System.out.println(object==object);  //true
        
        
        Star star = new Star("furong");
        System.out.println(star.equals(new Star("furong"))); //true
        System.out.println(star.equals("furong"));   //false
    }
}

2.5. finalize方法

当程序中出现垃圾对象时,jvm可以通过gc(垃圾回收器),将垃圾对象进行回收
垃圾对象:就是new出来的对象,没有人使用
两种垃圾回收方式:
1.自动回收:当程序内存耗尽时,jvm会一次性将垃圾对象回收
2.手动回收:调用System.gc(),通知jvm需要进行垃圾回收了(调用finalize方法),一般都会延时回收

class Woman{

    private String name;
    public Woman(String name) {
        this.name = name;
    }
    
    @Override  //通过jvm需要回收垃圾的触发
    protected void finalize() throws Throwable {
        System.out.println(name+"已经被回收了");
    }
    
}

public class FinalizeTest {
    public static void main(String[] args) {
        Woman woman = new Woman("刘亦菲");  //new的对象有人用
        
        new Woman("凤姐");  //new的对象没人用--垃圾对象
        
        System.gc();  //手动通知回收垃圾
    }
}

posted on 2021-10-27 18:00  SentralLiu  阅读(17)  评论(0)    收藏  举报