Day11JavaSE——常见对象之Object类

Day11JavaSE——常见对象之Object类

Object(类)
	public int hashCode()
	public final Class getClass()
	public String toString()
	public boolean equals(Object obj)

API(Application Programming Interface)

Java API
	就是Java提供给我们使用的类,这些类将底层的实现封装了起来,
	我们不需要关心这些类是如何实现的,只需要学习这些类如何使用。

Object类

概述 & 构造方法

Object类概述
	类层次结构的根类
	所有类都直接或者间接的继承自该类
构造方法
	public Object()
	回想面向对象中为什么说:
	子类的构造方法默认访问的是父无参构造方法

Object类的hashCode()方法

public int hashCode()
		a:返回该对象的哈希码值。默认情况下,该方法会根据对象的地址来计算。
		b:不同对象的,hashCode()一般来说不会相同。
	  	   但是,同一个对象的hashCode()值肯定相同。
		c:不是对象的实际地址值,可以理解为逻辑地址值。
public class Test {
    public static void main(String[] args) {
        /*API:Application Programming Interface
        * Object类:它是所有类的顶层父类,所有的类都是直接或间接的继承自它
        * 创建Object类的对象
        * java.lang包下的类,无需导包*/
        //new 对象 调方法
        Object obj=new Object();
        //Object类中的常用方法
        System.out.println(obj);
        //获取该对象的哈希码值
        //a:返回该对象的哈希码值。默认情况下,该方法会根据对象的地址来计算。
        //不同对象的,hashCode()一般来说不会相同。
        //但是,同一个对象的hashCode()值肯定相同。
        //不是对象的实际地址值,可以理解为逻辑地址值
        System.out.println(obj.hashCode());
        Object o = new Object();
        System.out.println(o);
        int code=o.hashCode();
        System.out.println(code);
    }
}

Object类的getClass()方法

public class Test {
    public static void main(String[] args) {
        //Java 万物皆对象
        // Object.java-------->Object.class
        //字节码文件 加载进内存后。他会把Object.class这个文件也看做对象。
        //此时会为Object.class文件创建对象 这个对象的类型就是 Class 我们只是把这字节码文件对象调用
        Object o = new Object();
        Class aClass=o.getClass();
        //getClass()获取这个类的字节码文件对象
        System.out.println(o);
        System.out.println(aClass);
        //Object.class文件就一份,当你将字节码文件一加载进内存,就为这个字节码文件创建了一个对象
        //所以无论你用再怎么创建Object类的新对象,在获取字节码文件的对象时
        //都获取的是同一个字节码对象
        Object o1 = new Object();
        Class aClass1=o1.getClass();
        System.out.println(o==o1);//false
        //对象是两个对象,所以对象的地址值不同
        System.out.println(aClass == aClass1);//true
        //对象获取的字节码文件对象地址是一样的,因为只加载一次
        //我们后期学习反射机制的时候,就要用到这个字节码文件对象。
    }
}

Object类的toString()方法

public class Test {
    public static void main(String[] args) {
        Object o = new Object();
        //toString:返回该对象的字符串表现形式
        //按住CTRL点击方法就可以看见源码
        /*这是Java类库中给出的toString的代码实现
        * public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());}
        * 由此可以看出这输出不是内容,而是地址,所以对toString进行重写使其输出内容*/
        //重写在Student中重写了toString方法
        String s=o.toString();
        System.out.println(s);
        Object o1 = new Object();
        System.out.println(o1.toString());
        //toString可以省略不写
        System.out.println(o1);

        //其实有很多类,也重写了Object类的toString()方法
        Scanner scanner = new Scanner(System.in);
        System.out.println(scanner.toString());
        //当你以后,输出一个对象名调用toString方法
        //他输出的不是地址值,说明该类重写了Object类的toString()方法
    }
}
public class Text2 {
    public static void main(String[] args) {
        Student student = new Student();
        //Student.class------->字节码文件对象
        Class aClass=student.getClass();
        System.out.println(aClass);
        int i=student.hashCode();
        System.out.println(i);
        String s=student.toString();
        System.out.println(s);
        System.out.println(student);
        System.out.println(student.toString());
    }
}
public class Student extends Object {
    private String name;
    private int age;

    public Student() {
        System.out.println("Student的空参构造执行了");
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("Student的有参构造执行了");
    }

    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;
    }

    //对toString()方法进行重写,使其返回内容
    @Override
    public String toString() {
        return "姓名:" + this.name + "=========" + "年龄:" + this.age;
    }

    public String show() {
        return "姓名:" + this.name + "=========" + "年龄:" + this.age;
    }
}
public class test3 {
    public static void main(String[] args) {
        Student student = new Student("张三",23);
        //我们输出一个对象的名称时,默认调用父类的toString()方法,打印该对象的地址值,
        //我们觉得老是打印这个地址值,意义不是很大。
        //我们想要的是,在调用toString方法时
        //能够打印一些我们认为有用的东西。比如打印这个成员变量的值
        //子类对父类Object类的toString()方法的实现不满意了。
        //子类就可以重写。子类想要打印成员变量的值。
        System.out.println(student.toString());
        System.out.println(student);
        String show = student.show();
        System.out.println(show);
    }
}

Object类的equals()方法

==与equals的区别
        /*==是运算符,可以比较基本数据类型,也可以比较引用数据类型
        * ==比较基本数据类型,是比较两个值是否相同
        * ==比较引用数据类型,是比较地址值是否相同
        * equals是Object类中的一个方法,他只能比较引用数据类型
        * 默认比较的是两个对象的地址值是否相同
        * 但是我们自定义的类,或其他的一些类可能会重写equals方法。
public class Test {
    public static void main(String[] args) {
        Object o = new Object();
        Object o1 = new Object();
        //判断两个对象是否相同
        System.out.println(o == o1);
        //我们还可以用Object类中的equal方法来比较来年各个对象的地址值是否相同
        boolean b = o.equals(o1);
        System.out.println(b);
        System.out.println("==============================");
        //使用java提供好的equals()比较两个对象的地址值是否相等意义不大
        /*这是Java提供的equals方法的源码,从源码可以看出,也是用==判定相等的
        * ==在判断引用类型数据时只能判定左右两边数据的地址是否相同
        * 但是当两个对象中的内容都一样,==就判断不出来了
        *
        * public boolean equals(Object obj) {
    					return (this == obj);
				}
        * */

        Student s1 = new Student("小刘", 23);
        Student s2 = new Student("小刘", 23);
        System.out.println(s1 == s2);
        System.out.println(s1.equals(s2));
        //此处输出都是false,所以我们需要对equals方法进行重写
    }
}
import java.util.Objects;

public class Student extends Object{
    private String name;
    private int age;

    public Student(){
        System.out.println("Student的空参构造访问了");
    }

    public Student(String name,int age){
        this.name=name;
        this.age=age;
        System.out.println("Student的有参构造访问了");
    }

    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;
    }

    @Override
    public boolean equals(Object obj) {
        //此处传入的是s2,s2是Student类型的
        //所以用父类类型的数据去接收子类的对象,这是多态
        //把obj向下转型,使其能够访问到age&name

        Student s3 = (Student) obj;

        //23==23  "李四"=="李四"
        //你要比较两个字符串字面上的内容是否相同,用==号比较不出来。
        //我们要比较两个字符串字面上的内容是否相同,要使用equals方法来比较。
        //因为obj是Object类型的,而s2是Student类型的,所以想要访问s2的成员变量,obj得向下转型
        return this.age == s3.age && this.name.equals(s3.name);
    }

   /*//快速重写toString()方法  alt+insert 弹框出来,选个toString() IDEA就会帮你自动重写toString()方法
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age &&
                Objects.equals(name, student.name);*/
}

Object类的equals()方法代码优化

public class Test2 {
    public static void main(String[] args) {
        System.out.println("================equals重写===============");
        //比较两个对象的成员变量的值是否一样,如果一样认为这两个对象相等。
        //子类对父类equals方法的默认比较方式不满意了。那子类可以按照他的比较方式去重写。
        //我们的子类想要比较两个对象的成员变量值是否一样,需要这么几步
        /*1、比较是否是同对象,比较对象地址值是否相等即可,同一对象地址值相等
        * 2、比较两个类型是否是同一个类,是同一类再执行下一步
        * 3、比较成员变量并返回
        * */
        Teacher t = new Teacher("liu", 23);
        Teacher t1 = new Teacher("liu", 233);
        System.out.println(t = t1);//false
        System.out.println(t.equals(t1));//true
    }
}
import java.util.Objects;

public class Teacher {
    private String name;
    private int age;

    public Teacher() {
        System.out.println("Student的空参构造访问了");
    }

    public Teacher(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("Student的有参构造访问了");
    }

    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;
    }

    /*快速重写equals()方法  alt+insert 弹框出来,选个equals() IDEA就会帮你自动重写equals()方法
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() == o.getClass()) return true;
        Teacher teacher = (Teacher) o;
        return age == teacher.age &&
                Objects.equals(name, teacher.name);
    }*/

    @Override
    public boolean equals(Object obj) {
        //地址值相同,同一个对象直接返回true
        if(this==obj) return true;
        //判断是否是Student类型的对象,如果不是,直接报错
        else if(obj instanceof Student) return true;
        //向下转型访问子类的成员变量
        Teacher s3 = (Teacher) obj;
        return (this.age == s3.age) && (this.name.equals(s3.name));
    }
}

Object类的clone() 方法

public class Test {
    public static void main(String[] args) throws CloneNotSupportedException {
        Dog dog = new Dog("旺财", 10);
        //克隆一个对象
        //CloneNotSupportedException 克隆不被支持
        //如果你要克隆一个对象,那么这个对象对应的类必须实现一个Cloneable这个接口,克隆才会被支持
        //对象的浅克隆也不会调用到构造方法
        Dog dog2 = (Dog) dog.clone();
        System.out.println(dog2.name);
        System.out.println(dog2.age);

        dog2.name = "黑子";
        dog2.age = 8;
        System.out.println(dog.name);
        System.out.println(dog.age);
        System.out.println(dog2.name);
        System.out.println(dog2.age);
    }
}

class Dog implements Cloneable {
    String name;
    int age;

    public Dog() {
        System.out.println("空参构造执行了");
    }


    public Dog(String name, int age) {
        System.out.println("有参构造执行了");
        this.age = age;
        this.name = name;
    }

    //我们重写一下Object类的clone()方法把权限修饰符改为public
    //但是重写逻辑还是要用父类的逻辑
    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

me;
int age;

public Dog() {
    System.out.println("空参构造执行了");
}


public Dog(String name, int age) {
    System.out.println("有参构造执行了");
    this.age = age;
    this.name = name;
}

//我们重写一下Object类的clone()方法把权限修饰符改为public
//但是重写逻辑还是要用父类的逻辑
@Override
public Object clone() throws CloneNotSupportedException {
    return super.clone();
}

}


![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hZTAxLmFsaWNkbi5jb20va2YvSDAzYzAzMDhiNDZhNTQxZWE5ZWE5MjdjM2UwZTQ2ODU1WC5qcGc?x-oss-process=image/format,png)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值