Object类—相关操作
-
toString方法
-
类
package cn.xiaoge.day12.demo01; import java.util.Objects; public class Person { private String name; private int age; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } /* 直接打印对象的地址值没有意义,需要重写Object类中的toString方法 打印对象的属性(name,age) */ /*@Override public String toString() { //return "abc"; return "Person{name="+name+" ,age="+age+"}"; }*/ /*@Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; }*/ /* Object类的equals方法,默认比较的是两个对象的地址值,没有意义 所以我们要重写equals方法,比较两个对象的属性(name,age) 问题: 隐含着一个多态 多态的弊端:无法使用子类特有的内容(属性和方法) Object obj = p2 = new Person("古力娜扎",19); 解决:可以使用向下转型(强转)把obj类型转换为Person */ /*@Override public boolean equals(Object obj) { // 增加一个判断, 传递的参数obj如果是null, 直接返回false, 可以提高程序的效率. if (obj == null) { return false; } // 增加一个判断, 传递的参数obj如果是this本身, 直接返回true, 提高程序的效率. if (this == obj) { return true; } // 增加一个判断, 防止类型转换失败ClassCastException if (obj instanceof Person) { // 使用向下转型, 把obj转换为Person类型 Person p = (Person) obj; // 比较两个对象的属性, 一个对象是this(p1), 一个对象是p(obj->p2) return this.name.equals(p.name) && this.age == p.age; } // 不是Person类型, 直接返回false return false; } */ @Override public boolean equals(Object o) { if (this == o) return true; // getClass() != o.getClass() 使用反射技术, 判断o是否是Person类型 等效于 obj instanceof Person if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return age == person.age && Objects.equals(name, person.name); } @Override public int hashCode() { return Objects.hash(name, 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; } }
-
执行路口
package cn.xiaoge.day12.demo01; import java.util.ArrayList; import java.util.Random; import java.util.Scanner; /* java.lang.Object 类 Object 是类层次结构的根(父)类。 每个类(Person,Student...)都使用 Object 作为超(父)类。 所有对象(包括数组)都实现这个类的方法。 */ public class Demo01ToString{ public static void main(String[] args) { /* Object里的toString源码 public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); } */ /* Person类默认继承了Object类,所以可以使用Object类中的toString方法 String toString() 返回该对象的字符串表示。 */ Person p = new Person("张三",18); String s = p.toString(); System.out.println(s);//cn.xiaoge.day12.demo01.Person@16e8e0a | abc | Person{name=张三 ,age=18} //直接打印对象的名字,其实就是调用对象的toString p=p.toString(); System.out.println(p);//cn.xiaoge.day12.demo01.Person@16e8e0a | abc | Person{name=张三 ,age=18} //看一个类是否重写了toString,直接打印这个类的对象即可,如果没有重写toString方法那么打印的是对象的地址值 Random r = new Random(); System.out.println(r);//java.util.Random@610455d6 没有重写toString方法 Scanner sc = new Scanner(System.in); System.out.println(sc);//java.util.Scanner[delimiters=\p{javaWhitespace}+.. 重写toString方法 ArrayList<Integer> list = new ArrayList<>(); list.add(1); list.add(2); list.add(3); System.out.println(list);//[1, 2, 3] 重写toString方法 } } // 运行结果 cn.xiaoge.day12.demo01.Person@16e8e0a cn.xiaoge.day12.demo01.Person@16e8e0a java.util.Random@610455d6 java.util.Scanner[delimiters=\p{javaWhitespace}+][position=0][match valid=false][need input=false][source closed=false][skipped=false][group separator=\,][decimal separator=\.][positive prefix=][negative prefix=\Q-\E][positive suffix=][negative suffix=][NaN string=\Q�\E][infinity string=\Q∞\E] [1, 2, 3]
-
-
eqauls方法
-
类
package cn.xiaoge.day12.demo01; import java.util.Objects; public class Person { private String name; private int age; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } /* 直接打印对象的地址值没有意义,需要重写Object类中的toString方法 打印对象的属性(name,age) */ /*@Override public String toString() { //return "abc"; return "Person{name="+name+" ,age="+age+"}"; }*/ /*@Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; }*/ /* Object类的equals方法,默认比较的是两个对象的地址值,没有意义 所以我们要重写equals方法,比较两个对象的属性(name,age) 问题: 隐含着一个多态 多态的弊端:无法使用子类特有的内容(属性和方法) Object obj = p2 = new Person("古力娜扎",19); 解决:可以使用向下转型(强转)把obj类型转换为Person */ /*@Override public boolean equals(Object obj) { // 增加一个判断, 传递的参数obj如果是null, 直接返回false, 可以提高程序的效率. if (obj == null) { return false; } // 增加一个判断, 传递的参数obj如果是this本身, 直接返回true, 提高程序的效率. if (this == obj) { return true; } // 增加一个判断, 防止类型转换失败ClassCastException if (obj instanceof Person) { // 使用向下转型, 把obj转换为Person类型 Person p = (Person) obj; // 比较两个对象的属性, 一个对象是this(p1), 一个对象是p(obj->p2) return this.name.equals(p.name) && this.age == p.age; } // 不是Person类型, 直接返回false return false; } */ @Override public boolean equals(Object o) { if (this == o) return true; // getClass() != o.getClass() 使用反射技术, 判断o是否是Person类型 等效于 obj instanceof Person if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return age == person.age && Objects.equals(name, person.name); } @Override public int hashCode() { return Objects.hash(name, 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; } }
-
执行路口
package cn.xiaoge.day12.demo01; public class Demo02Equals { public static void main(String[] args) { /* Person类默认继承了Object类, 所以可以使用Object类的equals方法 boolean equals(Object obj) 指示其他某个对象是否与此对象“相等”。 equals方法源码: public boolean equals(Object obj) { return (this == obj); } 参数: Object obj: 可以传递任意对象 == 比较运算符, 返回的是一个布尔值 true false 基本数据类型: 比较值 引用数据类型: 比较的是两个对象的地址值 this是谁? 那个对象调用的方法, 方法中的this就是那个对象;p1调用的equals方法所以this是p1 obj是谁? 传递过来的参数p2 this == obj --> p1 == p2 */ Person p1 = new Person("迪丽热巴", 18); Person p2 = new Person("迪丽热巴", 18); System.out.println("p1: " + p1); // p1: cn.xiaoge.day12.demo01.Person@11468599 System.out.println("p2: " + p2); // p2: cn.xiaoge.day12.demo01.Person@43f3f46a boolean result = p1.equals(p2); System.out.println(result); // false } } // 运行结果 p1: cn.xiaoge.day12.demo01.Person@11468599 p2: cn.xiaoge.day12.demo01.Person@11468599 true
-
-
Objects下的equals方法
-
执行路口
package cn.xiaoge.day12.demo01; import java.util.Objects; public class Demo03Objects { public static void main(String[] args) { // String s1 = "abc"; // String s2 = "aBc"; // boolean b = s1.equals(s2); // System.out.println(b); // false // String s1 = null; // String s2 = "aBc"; // boolean b = s1.equals(s2); // NullPointerException null不能调用方法的, 就会抛出空指针异常. /* Objects类的equals方法: 对象两个对象进行比较, 防止空指针异常 Objects.equals方法源码: public static boolean equals(Object a, Object b) { return (a == b) || (a != null && a.equals(b)); } */ String s1 = null; String s2 = "aBc"; boolean b2 = Objects.equals(s1, s2); System.out.println(b2); // false } } // 运行结果 false
-