Object类
程序员文章站
2022-04-01 10:19:13
...
Object类
API:Application Programing Interface,应用程序编程接口。Java API就是java语言提供使用的类,这些类将底层的实现封装起来,我们只需搬运使用即可。
Object:类 Object 是类层次结构的根类。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。Object 是所有类的顶层父类,所有的类,都是直接 或间接继承自他。
public int hashCode()
- 返回该对象的哈希码值。默认情况下,该方法会根据对象的地址来计算。
- 同一个对象的hashCode()值相同,不同对象的,hashCode()一般来说不会相同。
- 不是对象的实际地址值,可以理解为逻辑地址值。
public class Test1 {
public static void main(String[] args) {
Object obj = new Object();
int code = obj.hashCode();
System.out.println(code);
}
}
public final Class getClass()
获取该类的字节码文件对象。可以用来判断两个对象是否实例化的同一个类。
public class Test2 {
public static void main(String[] args) {
Object obj1 = new Object();
Object obj2 = new Object(); //这两个对象均实例化类Object
Class<?> aClass1 = obj1.getClass();
System.out.println(aClass1.getName()); //打印字节码文件:java.lang.Object
Class<?> aClass2 = obj2.getClass();
System.out.println(aClass1 == aClass2); //ture
}
}
public String toString()
获取该对象的地址值,以字符串形式返回.
当你打印一个对象名的时候,默认在调用Object类中的toString()方法
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
public class Test3 {
public static void main(String[] args) {
Object obj = new Object(); // 初始化一个Object类的对象
String s = obj.toString(); // 将其地址传给s
System.out.println(s); //aaa@qq.com
System.out.println(obj.toString()); //aaa@qq.com
System.out.println(obj); //aaa@qq.com,打印一个对象名的时候,默认在调用Object类中的toString()方法
}
}
public boolean equals(Object obj)
public boolean equals(Object obj) {
return (this == obj);
}
Object 类的equals() 方法,默认在比较两个对象的地址值是否相同,但是老是比较地址值是否相同意义不大。子类可以重写equals()方法获得自己比较的方式。
== 和 equals() 方法的区别:
- == 是一个比较运算符,他既可以比较基本数据类型,也可以比较引用数据类型,而 equals() 是Object类中的方法,只能比较引用类型,默认比较的是两个对象的地址值,是否相同;
- 比较基本数据类型,比的是两个值是否相等,比较引用类型,比较的是两个对象的地址值是否相同。
protected native Object clone() throws CloneNotSupportedException;
一个接口中,没有任何的抽象方法,这种接口我们称之为标记接口。目的就是给类打一个标记,让虚拟机支持克隆操作。
对象克隆:
- 使用clone()方法采用的是浅克隆的方式;
- 采用IO流来实现 使用 ObjectOutputStream 将对象写入文件中,然后再用ObjectInputStream读取回来.
注意:
- 如果一个对象需要调用clone的方法克隆,那么该对象所属的类必须要实现Cloneable接口。
- Cloneable接口只不过是一个标识接口而已,没有任何方法。
- 对象的浅克隆就是克隆一个对象的时候,如果被克隆的对象中维护了另外一个类的对象,这时候只是克隆另外一个对象的地址,而没有把
另外一个对象也克隆一份。 - 对象的浅克隆也不会调用到构造方法的。
例:
类Person
public class Person implements Cloneable {
public Worker worker;
private int num;
private String name;
private double wage;
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
} //clone重写,将关键字protected 改为 public
public Person(int num, String name, double wage, Worker worker) {
this.num = num;
this.name = name;
this.wage = wage;
this.worker = worker;
} //有参构造
public Person() {
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getWage() {
return wage;
}
public void setWage(double wage) {
this.wage = wage;
}
public Worker getWorker() {
return worker;
}
public void setWorker(Worker worker) {
this.worker = worker;
}
}
类Worker
public class Worker {
private String jobName;
public Worker(){}
public Worker(String jobName) {
this.jobName = jobName;
}//有参构造
public String getJobName() {
return jobName;
}
public void setJobName(String jobName) {
this.jobName = jobName;
}
}
测试类
public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
Worker worker = new Worker("电工");
Person person = new Person(001, "李老板", 1000, worker);
person.worker.setJobName("伐木工"); //这里在person类中将worker对象设为了私有,导致在此类中调不到
//克隆操作
Person per = (Person) person.clone(); //克隆只克隆了对象person,并没有克隆里边的worker对象
person.worker.setJobName("打麻将"); //将对象worker.jobname改为"打麻将"
person.setName("光头强");
person.setNum(002);
person.setWage(2000);
System.out.println(person.worker.getJobName()); //打印 打麻将
System.out.println(per.worker.getJobName()); //打印 打麻将
}
}
简易图示:
上一篇: java中的接口定义与使用
下一篇: 数组的定义及使用