API概述以及Object类的概述
API(Application Programming Interface) :应用程序编程接口
Java API:就是Java提供给我们使用的类,这些类将底层的实现封装了起来,
Object类概述:类层次结构的根类,所有类都直接或者间接的继承自该类
构造方法:public Object(),子类的构造方法默认访问的是父类的无参构造方法
equals()方法
public class MyTest {
public static void main(String[] args) {
/* boolean equals (Object obj)
指示其他某个对象是否与此对象“相等”。*/
Object obj1 = new Object();
Object obj2 = new Object();
System.out.println(obj1==obj2);
/* public boolean equals (Object obj){
return (this == obj);
}*/
boolean b = obj1.equals(obj2);
System.out.println(b);
Student s1 = new Student();
Student s2 = new Student();
System.out.println(s1.equals(s2));
}
}
运行结果:
Object 类的equals() 方法,默认在比较两个对象的地址值,是否相同,但是我们认为,老是比较地址值是否相同意义不大。我们想要比较两个对象的成员变量是否相同,如果相同,我们认为两个对象就相等。也就是说子类想要按照他的比较方式来比较,那么子类得重写equals() 方法
= =和equals() 方法的区别:
= = 是一个比较运算符,他既可以比较基本数据类型,也可以比较引用数据类型。
= = 比较基本数据类型,比的是两个值是否相等,比较引用类型,比较的是两个对象的地址值是否相同。
equals() 是Object类中的方法,只能比较引用类型,默认比较的是两个对象的地址值,是否相同。
有些类,会认为父类Object类中equals()方法的默认比较方式,意义不大,会对equals()方法进行重写。
String类重写equals方法
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
instanceof 判断一个引用(对象)是不是该类型的一个引用
我们自定义的类,会重写时,会去比较两个对象的成员变量值是否相同。
toString()方法
返回该对象的字符串表示。
源代码:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
它的值等于: getClass().getName() + ‘@’ + Integer.toHexString(hashCode())
clone() 方法
clone()的权限修饰符是受保护的,在用的时候,让该类重写该方法,并把该方法的权限修饰符改为public
对象的浅克隆:浅克隆和深克隆
使用clone()方法采用的是浅克隆的方式
对象浅克隆要注意的细节:
- 如果一个对象需要调用clone的方法克隆,那么该对象所属的类必须要实现Cloneable接口。
- Cloneable接口只不过是一个标识接口而已,没有任何方法。
- 对象的浅克隆就是克隆一个对象的时候,如果被克隆的对象中维护了另外一个类的对象,这时候只是克隆另外一个对象的地址,而没有把另外一个对象也克隆一份。
- 对象的浅克隆也不会调用到构造方法的。
对象的深克隆:采用IO流来实现 使用 ObjectOutputStream 将对象写入文件中,然后再用ObjectInputStream读取回来
代码演示
public class MyTest {
public static void main(String[] args) throws CloneNotSupportedException {
DogFood dogFood = new DogFood("王中王");
Dog dog = new Dog("小白", 2, dogFood);
dog.dogFood.name="金锣";
//克隆操作
Dog dog1= (Dog) dog.clone();
dog1.name="小黑";
dog1.age=5;
dog1.dogFood.name="双汇";
System.out.println("=====================================");
System.out.println(dog.dogFood.name);
System.out.println(dog1.dogFood.name);
/* 对象的浅克隆:就是克隆一个对象的时候,如果被克隆的对象中维护了另外一个类的对象,
这时候只是克隆另外一个对象的地址,
而没有把 另外一个对象也克隆一份。
*/
}
}
class Dog implements Cloneable{
String name;
int age;
DogFood dogFood;
public Dog(String name, int age, DogFood dogFood) {
this.name = name;
this.age = age;
this.dogFood = dogFood;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
class DogFood{
String name;
public DogFood() {
}
public DogFood(String name) {
this.name = name;
}
}
运行结果: