Object类是java中的顶级父类,所有的类都直接或间接的继承Object类,Object类中的方法可以被所有子类访问,所以学习Object类和其中的方法还是很有必要的。
因为Object类中没有成员变量,所以它只定义了无参构造。
接下来开始介绍常用方法及代码演示
1.toString:
返回对象的字符串表示形式(System.out.println也调用这个方法)
代码演示:
public class Test {
public static void main(String[] args) {
//toString() 返回对象的字符串表示形式
Object o = new Object();
String str = o.toString();
System.out.println(str);
}
}
输出结果为对象o的包名和地址值
扩展:
这个方法更常用的情况是在子类中改写toString方法,使子类对象调用这个方法后可以输出属性值
我们先定义子类Student并改写toString方法
Student类代码如下:
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "Student{name = " + name + ", age = " + age + "}";
}
}
编写测试类Test调用重写后的toString方法,代码如下:
public class Test {
public static void main(String[] args) {
Student stu1 = new Student("xiaowang", 21);
Student stu2 = new Student("xiaozhang", 22);
System.out.println(stu1.toString());
System.out.println(stu2.toString());
}
}
运行结果:
2.equals:
比较两个对象是否相等(Object类中比较的是两者的地址值),它返回一个布尔类型的数据
代码演示:
public class Test {
public static void main(String[] args) {
Student stu1 = new Student("xiaowang", 21);
Student stu2 = new Student("xiaozhang", 22);
boolean result = stu1.equals(stu2);
System.out.println(result);
}
}
运行结果:
扩展:
这个方法更常用的情况是在子类中改写equals方法,比较子类对象中的属性值,并返回布尔类型true或false。
我们在Student子类中改写equal方法
点进Student类中,摁快捷键 Alt + insert 或 Alt + Fn + insert ,弹出这个窗口
选择第五个equals()和hashCode(),然后一直点确定即可,我们不用管hashCode(),代码中会多一段改写后的equals方法如下:
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age && Objects.equals(name, student.name);
}
我们就可以用这个方法比较对象的属性值是否相等了
接下来编写测试类Test验证一下:
代码:
public class Test {
public static void main(String[] args) {
//属性值相等情况
Student stu1 = new Student("xiaowang", 21);
Student stu2 = new Student("xiaowang", 21);
boolean result1 = stu1.equals(stu2);
System.out.println("第一组结果:" + result1);
//属性值不相等情况
Student stu3 = new Student("xiaohan", 21);
Student stu4 = new Student("xiaoyang", 22);
boolean result2 = stu3.equals(stu4);
System.out.println("第二组结果:" + result2);
}
}
运行结果:
3.clone:
方法会帮我们创建一个对象,并帮我们把原对象的数据拷贝过去
代码演示:
先修改一下上文中的Student类的内容,添加了一个数组成员变量,修改了toString来更完善的展示信息便于我们演示,不可少的步骤是:实现接口Cloneable来确保可以正常拷贝,并且因为Object类中的clone方法是用protected修饰的,我们还需要重写clone方法。
Student类代码:
public class Student implements Cloneable{
private String name;
private int age;
private int[] arr;
public Student() {
}
public Student(String name, int age, int[] arr) {
this.name = name;
this.age = age;
this.arr = arr;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int[] getArr() {
return arr;
}
public void setArr(int[] arr) {
this.arr = arr;
}
public String toString() {
return "Student{name = " + name + ", age = " + age + ", arr = " + arrTOString() + "}";
}
//将数组转换成字符串形式
public String arrTOString() {
StringJoiner sj = new StringJoiner(", ", "[", "]");
for (int i = 0; i < arr.length; i++) {
sj.add(arr[i] + "");
}
return sj.toString();
}
//由于Object类中clone方法使用protected修饰的,所以我们还要重写clone方法
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
测试类代码Test:
注:使用clone方法创建的对象默认为Object类,这里我把它强转成了Student类
public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
Student s1 = new Student("1", 21, new int[]{1, 2, 3});
Student s2 = (Student) s1.clone();
//输出s1和s2的信息
System.out.println(s1.toString());
System.out.println(s2.toString());
}
}