一、API概述
API是应用程序编程接口
Java API是java提供给我们使用的类,这些类将底层的实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用
二、Object类概述
类层次结构的根类
所有类都直接或者间接的继承自该类
构造方法
public Object()
三、Object类的方法
1、hashCode()方法
public int hashCode()
a、返回该对象的哈希码值。默认情况下,该方法会根据对象的地址来计算。
b、不同对象的hashCode()不同
c、不是对象的实际地址值,可以理解为逻辑地址值。
public class MyTest1 {
public static void main(String[] args) {
Test test1 = new Test();
Test test2 = new Test();
System.out.println(test1.hashCode());
System.out.println(test2.hashCode());
}
}
class Test{}
运行结果
356573597
1735600054
2、getClass()方法
public final class getClass()
a、返回此Object的运行时类
b、可以通过class类中的一个方法,获取对象的真实类的全名称。
public String getName()
public class MyTest {
public static void main(String[] args) {
Object obj1 = new Object();
Class class1 = obj1.getClass();
Object obj2 = new Object();
Class class2 = obj2.getClass();
System.out.println(obj1==obj2);
System.out.println(class1==class2);
System.out.println("--------------------");
Test test = new Test();
Class<? extends Test> class3 = test.getClass();
System.out.println(class3.getName());
}
}
class Test {
}
运行结果
false
true
--------------------
com.mi.demo5.Test
3、toString()方法
public String toString()
a、返回该对象的字符串表示
源代码:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
b、从源代码看出,返回值是getClass().getName() + “@” + Integer.toHexString(hashCode());,也就是物理地址名+@+逻辑地址值
c、由于默认情况下的数据对我们来说没有意义,一般建议重写该方法。重写是将该类的所有的成员变量组成返回
public class MyTest {
public static void main(String[] args) {
Person person = new Person("洛天依",15);
System.out.println(person.toString());
System.out.println("============================");
Person2 person2 = new Person2("言和",17);
System.out.println(person2);
}
}
class Person{
String name;
int age;
public Person(String name,int age){
this.name = name;
this.age=age;
}
public String toString(){
return name+age+"岁";
}
}
class Person2{
String name ;
int age ;
public Person2(String name,int age){
this.name = name;
this.age=age;
}
}
运行结果:
洛天依15岁
============================
com.mi.demo5.Person2@1540e19d
4、equals()方法
指示其他某个对象是否与此对象“相等”
源代码:
public boolean equals(Object obj) {
return (this == obj);
}
默认情况下比较的是对象的引用是否相等
由于比较对象的引用没有意义,一般建议重写该方法。一般用于比较成员变量的值是否相等
public class MyTest {
public static void main(String[] args) {
Person person = new Person();
Person2 person2 = new Person2();
System.out.println(person.equals(person2)); //默认方法,比较的是对象的地址值是否相同
System.out.println("================================");
Person3 person3 = new Person3("言和","girl");
Person3 person31 = new Person3("言和", "girl");
System.out.println(person3.equals(person31));//重写方法过后,比较的是对象的成员是否相等
}
}
class Person{
String name = "天依";
String sex = "girl";
}
class Person2{
String name = "天依";
String sex = "girl";
}
class Person3{
String name;
String sex;
public Person3(String name,String sex){
this.name=name;
this.sex=sex;
}
public boolean equals(Object obj){
if(this==obj){
return true;
}else if(!(obj instanceof Person3)){ //instanceof 判断一个引用,是否是,该类型的一个引用
return false;
}
Person3 per = (Person3) obj; //向下转型,将Object类转为和要比较对象一样的类
return this.name.equals(per.name)&&this.sex.equals(per.sex);
}
}
运行结果
false
================================
true
5、clone()方法
clone()的权限修饰符是受保护的,在用的时候,让该类重写该方法,并把该方法的权限修饰符改为public
对象的克隆分为浅克隆和深克隆,使用clone()方法采用的是浅克隆的方式
对象的浅克隆要注意的细节:
1、如果一个对象需要调用clone()方法克隆,那么该对象所属的类必须要实现Cloneable接口
2、Cloneable接口只不过是一个表示接口而已,没有任何方法。
3、对象的浅克隆就是克隆一个对象的时候,如果被克隆的对象中维护了另外一个类的对象,这时候只是克隆另外一个对象的地址,而没有把另外一个对象也克隆一份。
4、对象的浅克隆不会调用到构造方法的
对象的深克隆采用IO流来实现,使用 ObjectOutputStream将对象写入文件中,然后再用 ObjectInputStream读取出来,详见:深克隆
public class MyTest2 {
public static void main(String[] args) throws CloneNotSupportedException{
CatFood catFood = new CatFood("小鱼干");
Cat cat1 = new Cat("小黑",233,catFood);
cat1.catFood.name="小饼干";
Cat cat2 = (Cat) cat1.clone();
//对象的浅克隆就是克隆一个对象的时候,如果被克隆的对象中维护了另外一个类的对象,这时候只是克隆另外一个对象的地址,而没有把另外一个对象也克隆一份。
cat2.catFood.name="小肉干";
System.out.println(cat1.catFood.name);
System.out.println(cat2.catFood.name);
}
}
class Cat implements Cloneable{
String name;
int age;
CatFood catFood;
public Cat(){
}
public Cat(String name,int age,CatFood catFood){
this.name=name;
this.age=age;
this.catFood=catFood;
}
protected Object clone() throws CloneNotSupportedException{
return super.clone();
}
}
class CatFood{
String name;
public CatFood(String name){
this.name=name;
}
}
运行结果:
小肉干
小肉干