ApI的概述和Object的概述

  • Java API:就是Java提供给我们使用的类,这些类将底层的实现封装了起来,
  • Object类概述:类层次结构的根类,所有类都直接或者间接的继承自该类
  • 构造方法:
    public Object()
  • hashCode()方法
    特点:
  1. 返回该对象的哈希码值。默认情况下,该方法会根据对象的地址来计算。
  2. 不同对象的,hashCode()一般来说不会相同。但是,同一个对象的hashCode()值肯定相同。
  3. 不是对象的实际地址值,可以理解为逻辑地址值。

代码示例:

public class MyTest {
    public static void main(String[] args) {
        //创建Object类的对象
        Object obj = new Object();
        System.out.println("Object 的地址值obj是:" + obj);
        int i = obj.hashCode();
        System.out.println("Object的哈希值:" + i);
        Object obj2 = new Object();
        System.out.println("第二个Object的地址值obj2是:" + obj2);
        int i2 = obj2.hashCode();
        System.out.println("第二个Object的哈希值:" + i2 );
        System.out.println(obj.hashCode()==obj2.hashCode());
        //不同的哈希码值是不同的

    }
}

代码运行结果:

Object 的地址值obj是:java.lang.Object@140e19d
Object的哈希值:21029277
第二个Object的地址值obj2是:java.lang.Object@17327b6
第二个Object的哈希值:24324022
false
  • getClass()方法
    特点:
  1. 返回此 Object 的运行时类。
  2. 可以通过Class类中的一个方法,获取对象的真实类的全名称。

代码示例:

public class MyTest2 {
    public static void main(String[] args) {

        //object.class字节码文件加载进内存,JVM就会为Object.class创建一个对象

        Object obj = new Object();
        Class clazz = obj.getClass();//object.class 字节码文件对象
        Object obj2 = new Object();
        Class<?> aClass = obj2.getClass();//返回该类的字节码文件对象
        Object obj3 = new Object();
        Class aClass1 = obj3.getClass();

        System.out.println(obj==obj2);//flase
        System.out.println(obj2==obj3);

        System.out.println(clazz==aClass);//true 字节码文件对象是一个,所以相同

        System.out.println(aClass==aClass1);

    }
}

代码运行结果:

false
false
true
true
  • toString()方法
    具体实现:
public String toString() {
            return getClass().getName() + "@" + Integer.toHexString(hashCode());    }

代码示例:

public class MyTest1 {
    public static void main(String[] args) {
        Object o = new Object();
        System.out.println(o.toString());//后面的toString默认有
        String s = o.toString();//获取该对象的地址值的字符串表现行式
        System.out.println(s);    
    }
}

代码运行结果:

java.lang.Object@140e19d
java.lang.Object@140e19d

代码示例2:

public class MyTest {
    public static void main(String[] args) {
        Teacher teacher = new Teacher("张三",19);
        teacher.toString();
        System.out.println(teacher);
    }
}
class Teacher{
    private String name;
    private int age;

    public Teacher(String name, int age) {
        this.name = name;
        this.age = age;
    }
    //利用软件重写toString()放法
    // ctrl+o  重写 选择toString()
    // alt+Insert get。set方法,空参构造
    @Override
    public String toString() {
        return "name"+name +"\n"+"age"+age;
    }
}

代码运行结果:

name张三
age19
  • equals()方法
  1. 指示其他某个对象是否与此对象“相等”。
    源代码:
    public boolean equals(Object obj) {
    return (this == obj);
    }
  2. 默认情况下比较的是对象的引用是否相同。
  3. 由于比较对象的引用没有意义,一般建议重写该方法。一般用于比较成员变量的值是否相等

代码示例:

package org.westos.demo5;

import sun.rmi.transport.ObjectTable;

public class MyTest {
    public static void main(String[] args) {
        Object obj1 = new Object();
        Object obj2 = new Object();
        System.out.println(obj1==obj2);//flase
        //public boolean equals(Object obj1)    判断两个对象的值是否相等
       
        boolean b = obj1.equals(obj2);
        System.out.println(b);//flase
        System.out.println("-----");
        Student s1 = new Student("战三", 19);
        Student s2 = new Student("战三", 19);
        System.out.println(s1 == s2);//flase
        System.out.println(s1.equals(s2));//true
        
        //只要两个对象的成员变量的值一样,我们就认为这两个对象是一样。重写equals()方法
        boolean b1 = s1.equals(new Teacher());//ClassCastException 类型转换异常
        System.out.println(b1);
        System.out.println("------");
        boolean b2 = s1.equals(s2);
        System.out.println(b2);//flase
    }
}

class Student{
    private String name;
    private int age;

    public Student(String name,int age){
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object obj) {
    //如果对象的地址值相同,则其内容相同
        if(this == obj){
            return true;
        }

        if(!(obj instanceof Student)){
            return false;
        }
        //也可以这样
        //if (obj == null || getClass() != obj.getClass()) {
         //   return false;
       // }
        Student stu = (Student)obj;
       return this.name.equals(stu.name) && this.age ==age;
    }
}
class Teacher{

}

代码运行结果:

false
false
-----
false
true
false
------
tru
  • 使用clone()方法克隆
    使用clone()方法采用的是浅克隆的方式
    对象浅克隆要注意的细节:
  1. 如果一个对象需要调用clone的方法克隆,那么该对象所属的类必须要实现Cloneable接口。
  2. Cloneable接口只不过是一个标识接口而已,没有任何方法。
  3. 对象的浅克隆就是克隆一个对象的时候,如果被克隆的对象中维护了另外一个类的对象,这时候只是克隆另外一个对象的地址,而没有把另外一个对象也克隆一份。
  4. 对象的浅克隆也不会调用到构造方法的。

代码示例:

public class MyTest {
    public static void main(String[] args) throws CloneNotSupportedException {
        //  protected Object clone () 创建并返回此对象的一个副本。
        Dog dog = new Dog();
        dog.name = "小明";
        dog.age  = 10;
        System.out.println(dog.name+","+dog.age);
        System.out.println("-----");
        Dog clone = (Dog) dog.clone();
        System.out.println(clone.name+","+clone.age);
        System.out.println("------");
        Dog dog3 = new Dog();
        Dog clone3 = (Dog) dog3.clone();
        System.out.println(clone3.name+","+clone3.age);
	 }
}

/*此类实现了Cloneable 接口,以实现Object.clone()方法可以合法的对该类实例进行按字段复制
* 在没有实现Cloneable 接口的实例上调用Object的clone方法,则会导致跑出*CloneNotSupportedException 异常。
* Cloneable没有任何的抽象方法的接口,是一个标记接口
* */
class Dog extends Object implements Cloneable{
    String name = "熊白";
    int age = 1;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

运行结果:

小明,10
-----
小明,10
------
熊白,1