Java基础——API简介、object类的概述

1.API简介

API:应用程序编程接口。
Java API:Java提供给我们使用的类,这些类将底层彻底的实现封装了起来。
object类的概述:类层次结构的根类,所有类都直接或者间接的继承自该类;

2.object中的hashCode()方法

public int hashCode()
		返回该对象的哈希码值。默认情况下,该方法会根据对象的地址来计算。
		不同对象的,hashCode()一般来说不会相同但是,同一个对象的hashCode()值肯定相同。
		不是对象的实际地址值,可以理解为逻辑地址值。	

代码演示

public class Demo01 {
    public static void main(String[] args) {
        Person person = new Person(30);
        System.out.println(person.hashCode()); //输出person对象的哈希码值
    }
}
class Person{
    int num;
    public Person(int num){
        super();
        this.num=num;
    }
}

运行结果图
运行结果

3.object中的getClass()方法

	public final Class getClass()
	     返回此 Object 的运行时类。
	     可以通过Class类中的一个方法,获取对象的真实类的全名称。	
	public String getName()

代码演示:

package demo6;

/**
 * @Author:liger
 * @Description:爱学Java
 * @Time:2021-11-07 15:45
 */

    public class Demo01 {
        public static void main(String[] args) {
            Test t=new Test(20);
            System.out.println(t.getClass());  // 获取t的运行时类位置
        }
    }
    class Test{
        int age;
        public Test(int age){
            super();
            this.age=age;
        }
    }

运行结果
运行结果

4.Object类的toString()方法

public String toString()
	返回该对象的字符串表示。
		源代码:
		 	public String toString() {
   					 return getClass().getName() + "@" + Integer.toHexString(hashCode());
				}
	它的值等于: 
		getClass().getName() + '@' + Integer.toHexString(hashCode()) 
	由于默认情况下的数据对我们来说没有意义,一般建议重写该方法。
	  怎么重写, 一般是将该类的所有的成员变量组成返回即可;
B:重写方法IDEA可以自动生成;
C: 直接输出对应的名称,就是调用对象的toString()方法。

代码演示:

public class Demo01 {
    public static void main(String[] args) {
        Demo02 demo02 = new Demo02(40,"李哥");
        System.out.println(demo02.toString());//输出
    }
}
class Demo02 {
    int num;
    String name;

    public Demo02(int num, String name) {
        super();
        this.num = num;
        this.name = name;
    }

    @Override
    public String toString() {  //重写toString()方法
        return "Demo02{" +
                "num=" + num +
                ", name='" + name + '\'' +
                '}';
    }
}

5.Object类的equals()方法

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

==和equals()的区别:

==:如果比较的是基本数据类型变量,比较两个变量的值是否相等。(不一定数据类型相同)
   如果比较的是引用数据类型变量,比较两个对象的地址值是否相同,即两个引用是否指向同一个地址值。

equals(): 如果类中重写了equals方法,比较内容是否相等。
           String、Date、File、包装类都重写了Object类的equals方法。
如果类中没有重写equals方法,比较地址值是否相等(是否指向同一个地址值)。

Object类的equals()方法代码优化
a: 提高效率
b: 提高健壮性(instanceof)
代码演示:

public class Demo01 {
    public static void main(String[] args) {
        Student student = new Student();
        Student2 student2 = new Student2();
        System.out.println(student.name.equals(student2.name));//比较两个对象的name是否相等
    }
}
class Student{
    String name="李哥";
}
class Student2{
    String name="李哥";
    @Override
    public boolean equals(Object o) {     //重写equals()方法
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student2 student2 = (Student2) o;
        return Objects.equals(name, student2.name);
    }
    @Override
    public int hashCode() {
        return Objects.hash( name);
    }
}

6.Object类的clone() 方法

clone()的权限修饰符是受保护的,在用的时候,让该类重写该方法,并把该方法的权限修饰符改为public。
对象的浅克隆:浅克隆和深克隆;
​使用clone()方法采用的是浅克隆的方式;

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

代码演示:

public class MyTest {
    public static void main(String[] args) throws CloneNotSupportedException {
        /*
        *  3. 对象的浅克隆就是克隆一个对象的时候,如果被克隆的对象中维护了另外一个类的对象,
        * 这时候只是克隆另外一个对象的地址,而没有把另外一个对象也克隆一份。
	        4. 对象的浅克隆也不会调用到构造方法的。
        *
        * */
        DogFood dogFood = new DogFood("金锣");
        Dog dog = new Dog("小白", 2, dogFood);
        dog.dogFood.foodName="王中王";
        //克隆
        Dog dog2 = (Dog) dog.clone();
        dog2.dogFood.foodName="玉米肠";
        System.out.println(dog.dogFood.foodName); // 玉米肠
        System.out.println(dog2.dogFood.foodName); // 玉米肠
    }
}
class Dog implements Cloneable {
    String name;
    int age;
    //成员变量,DogFood类型
    DogFood  dogFood;
    public Dog() {
    }
    public Dog(String name, int age, DogFood dogFood) {
        System.out.println("构造方法调用了");
        this.name = name;
        this.age = age;
        this.dogFood = dogFood;
    }
    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone(); //继续调用父类Object的克隆
    }
}
class DogFood{
    String foodName="双汇";
    public DogFood() {
    }
    public DogFood(String foodName) {
        this.foodName = foodName;
    }
}

内存图

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Geek Li

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值