文章36 | 阅读 16935 | 点赞0
Object是类层次结构的根类,所有的类都直接的或者间接的继承自该类。
Object 类api文档
Object:是类层次结构的根类,所有的类都直接的或者间接的继承自该类。
构造方法:Object()
直接输出对象名,输出底层调用的是该对象的toString()
查看API,我们发现建议所有子类都重写toString()。
到底该如何重写该方法呢?自动生成的就可以。
代码:
object1
package Java_study;
/**
*
* @author 只是甲
* @date 2021-06-30
* @remark Object类的toString()方法
*
*/
public class object1 {
private String name;
private int age;
public object1() {
}
public object1(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;
}
@Override
//第一次打印object1对象时还没有重写toString方法,打印出来的是一串地址值
//由于所有类的都默认继承Object类,所以也可以使用父类的toString(),默认打印了包名+类名+@+内存地址
//重写tostring()可以自定义实现打印输出的结果
public String toString() {
return "object1[" +
"name='" + name + '\'' +
",age=" + age +
']';
}
}
objectTest1
package Java_study;
/**
*
* @author 只是甲
* @date 2021-06-30
* @remark Object类的toString()方法-测试类
*
*/
public class objectTest1 {
public static void main(String[] args) {
object1 student = new object1();
student.setName("杜兰特");
student.setAge(32);
//1。重写toString方法前: Java_study.object1@15db9742
//2. 重写toString方法后:objectTest1[name='杜兰特', age=32]
System.out.println(student);
/*//按住ctrl点击println查看打印方法的源码
public void println(Object x) { //相当于子类对象赋值给父类的引用--多态的方式向上转型,即=> Object x = student;
String s = String.valueOf(x);
synchronized (this) {
println(s);
}
}*/
/* //再次按住ctrl点击valueOf方法查看源码,因为student对象不为null,所以实际上又调用了toString方法
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
*/
//输出结果与直接打印对象名一致
//直接输出对象名,输出底层调用的是该对象的tostring()
System.out.println(student.toString());
/* //再次按住ctrl点击toString方法查看源码 返回的是类名+包名+@+内存的哈希地址
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
*/
}
}
==:
可以比较基本数据类型,比较基本数据类型的时候比较的是基本数据类型的值是否相同
也可以比较引用数据类型,比较引用数据类型的时候比较的是引用数据类型的地址值是否相同
而我们现在想比较的是对象的内容是否相同?该怎么办呢?
通过查看API,我们找到了比较对象是否相等的方法:
public boolean equals(Object obj)
Object类中的equals()方法默认比较的是对象的地址是否相同。
如果我们想比较对象的内容是否相同,就必须自己重写该方法。
代码:
object2
package Java_study;
/**
*
* @author 只是甲
* @date 2021-06-30
* @remark 学生类 Object类的equals()方法
*
*/
public class object2 {
private String name;
private int age;
public object2() {
}
public object2(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;
}
@Override
public boolean equals(Object obj) {
//执行语句: s1.equals(s2)
//this: 表示 s1
//obj: 表示 s2
//没有加括号的if语句只能控制一个分号内的方法体,s1==s2不成立,所以此条return true不执行
if (this == obj) return true;
// obj == null -- 比较的对象是否为空(不成立)
// getClass() != obj.getClass() -- 比较的对象是否不是同一个类的对象,如果不是同一个类的则没有比较的意义(不成立)
// a||b表示:当a、b有一个为真时,结果为真。a、b都为假时结果为假。
// false || false => false 所以此条return false不执行
if (obj == null || getClass() != obj.getClass()) return false;
//obj向下转型(强转)
object2 that = (object2) obj;
// a&&b表示:当a、b都为真时,结果为真。有一个为假或者都为假时结果为假。
// age == that.age 表示 s1.age == s2.age 判断结果为true
// name.equals(that.name) 表示 s1.name == equals(s2.name) 比较字符内容是否相同,判断结果为true
// true && true => true ;所以此条 return true 给测试类Demo3ObjectMethodEquals
return age == that.age && name.equals(that.name);
}
}
objectTest2
package Java_study;
/**
*
* @author 只是甲
* @date 2021-06-30
* @remark 学生测试类 Object类的equals()方法
*
*/
public class objectTest2 {
public static void main(String[] args) {
object2 s1 = new object2("杜兰特",32);
object2 s2 = new object2("杜兰特",32);
//object2对象 重写equals方法前:【false】
//object2对象 重写equals方法前:【true】
System.out.println(s1.equals(s2)); //true
//s1,s2代表实例的引用 位于栈中,真正的对象实例存储在堆中,s1,s2存储了其实例在堆中的内存地址
//重写equals方法前,比较的是s1,s2的地址值,因为是两个不同对象,所以地址值不同,结果为【false】
//重写equals方法后,我们指定比较两者的属性值,结果为【true】
Integer a = 123;
Integer b = 123;
System.out.println(a == b);//true
}
}
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/u010520724/article/details/119889209
内容来源于网络,如有侵权,请联系作者删除!