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