Object类中的API
public String toString() //返回该对象的字符串表示形式(可以看做是对象的内存地址值)
public boolean equals(Object obj) //默认 比较两个对象地址值是否相等;true表示相同,false表示不相同 重写可以比较属性
protected Object clone() //默认浅克隆 重写深克隆
tostring()
System.out.println("对象”);不重写的话,会默认调用object的tostring()默认方法打印出地址;
- 在通过输出语句输出一个对象时,默认调用的就是toString()方法
- 输出地址值一般没有意义,我们可以通过重写toString方法去输出对应的成员变量信息(快捷键:atl + insert , 空白处 右键 -> Generate -> 选择toString)
- toString方法的作用:以良好的格式,更方便的展示对象中的属性值
- 一般情况下Jdk所提供的类都会重写Object类中的toString方法
equals()
public class ObjectDemo02 {
public static void main(String[] args) {
// 创建两个学生对象
Student s1 = new Student("itheima" , "14") ;
Student s2 = new Student("itheima" , "14") ;
// 比较两个对象是否相等
System.out.println(s1 == s2);
}
}
因为"=="号比较的是对象的地址值,而我们通过new关键字创建了两个对象,它们的地址值是不相同
的。因此比较结果就是false。
- 默认情况下equals方法比较的是对象的地址值
- 比较对象的地址值是没有意义的,因此一般情况下我们都会重写Object类中的equals方法,重写部分得自己写。
arraycopy(数组1,数组1的起始索引,数组2,起始索引,终止索引);
1、currentTimeMillis()
// 获取当前时间所对应的毫秒值
long millis = System.currentTimeMillis();
// 输出结果
System.out.println("当前时间所对应的毫秒值为:" + millis);
2、exit()
// 终止JVM
System.exit(0);
3、arraycopy()
Student s1 = new Student("zhangsan", 23);
Student s2 = new Student("lisi", 24);
Student s3 = new Student("wangwu", 25);
Student[] arr1 = {s1, s2, s3};
Person[] arr2 = new Person[3];
//把arr1中对象的地址值赋值给arr2中
System.arraycopy(arr1, 0, arr2, 0, 3);
1、toString() 其他类不重写Object这个方法那就是地址
2、equals(Object obj) 重写才可以比较对象之间的属性值
3、 clone() Object默认是浅克隆
clone()
浅克隆
不管对象内部的属性是基本数据类型还是引用数据类型,都完全拷贝过来。
基本数据类型拷贝过来的是具体的数据,引用数据类型拷贝过来的是地址值。
Object类默认的是浅克隆。
深克隆
基本数据类型拷贝过来,字符串复用,引用数据类型会重新创建新的
浅克隆就是原对象和复制的对象共用一套数据,原对象数据改变复制的对象也会跟着改变。
深克隆就是相当于把原对象里的数据复制一份放在一个新的容器里,原对象数据的改变不会对复制的对象有任何影响。
深克隆实现步骤
Object里的clone()的权限修饰符是protected,protected可以被同包访问,可以被子类访问,所以有一个类肯定是继承Object类必是它的子类,那如果在测试类访问子类继承的clone()方法的话,首先就要在子类里要重写一下clone()方法,否则其他类都没有权限来访问它,创建改类的对象就不能调用该方法。实现cloneable()接口只是一个标记,为了让该类可以被 复制的标记。
所以说要想复制,子类要重写Object中的clone()方法,然后实现cloneable()接口,这样创建的该类的对象就能被复制了。
public class student implements Cloneable{
private int age;
public student() {
}
public student(int age) {
this.age = age;
}
/**
* 获取
* @return age
*/
public int getAge() {
return age;
}
/**
* 设置
* @param age
*/
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "s{age = " + age + "}";
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();//默认浅克隆 //深克隆需自己实现这里就不写了
}
}
class s1 {
public static void main(String[] args) throws CloneNotSupportedException {
student s1 = new student(18);
student s2 = (student) s1.clone();
System.out.println(s1);
System.out.println(s2);
System.out.println(s1==s2));
}
}
//运行结果
s{age = 18}
s{age = 18}
false
只要是new出来的它们肯定不等,因为实例对象在内存中地址是不同的,但浅克隆的两个对象的属性值是相同,不管对象中是基本数据类型还是引用数据类型都是相等的;而对于深克隆,只有基本数据类型是复用是相等的,而引用数据会在堆中开辟新的空间是不相等的。