1-5 常用API第二部分第1节 Object类

    技术2022-07-17  77

    这里写自定义目录标题

    P21501.Object类的toString方法lang包下的类有什么特点?1、如果没有重写tostring 方法?打印对象名是地址2、重写了toString方法,打印对象名是重写的内容。3、为什么要有toString方法? 4、看一个类是否重写了tostring方法?P21602.Object类的equals方法P21703.重写Object类的equals方法,1、getClass() != o.getClass()什么意思?2、equals方法,还是使用alt+ins,去快速重写。每句话的意思。 P21804.Object类&Objects类P21905.Objects类的equals方法

    P21501.Object类的toString方法

    lang包下的类有什么特点?

    无需导包直接使用。

    1、如果没有重写tostring 方法?打印对象名是地址

    2、重写了toString方法,打印对象名是重写的内容。

    3、为什么要有toString方法?

    在Java中每个类都默认继承Object类,除非声明继承于某个类。 而toString 方法来自于Object 类,作用是: 返回一个字符串,是该Java对象的内存地址经过哈希算法得出的int类型的值在转换成十六进制。。 换句话说,该方法返回一个字符串,它的值大概就是等于: getClass().getName()+’@’+Integer.toHexString(hashCode()) 这是一个内存地址经过哈希算法得出的int类型的值在转换成十六进制的东西。等同的看作Java对象在堆中的内存地址。

    如果没有重写tostring 方法?打印对象名是地址。 比如: demoTest_zt.toStringTest@15db9742 很显然这要是在项目开发的时候,不应该是一串看不懂的数字,而应该是符合逻辑的东西; 接下来测试带有tostring方法的时候,Object中的toString方法就要被重写。

    所以现在一个最基本的类有什么? 1成员变量 2成员方法 3构造方法 4getset 5tostring

    4、看一个类是否重写了tostring方法?

    打印这个类的对象名即可。 如果没有,打印出来就是地址值。 如果有,就按照重写的方式打印。

    package com.itheima.demo01.Object; 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) { /* Person类默认继承了Object类,所以可以使用Object类中的toString方法 String toString() 返回该对象的字符串表示。 */ Person p = new Person("张三",18); String s = p.toString(); System.out.println(s);包+地址:com.itheima.demo01.Object.Person@75412c2f | abc | Person{name=张三 ,age=18} //直接打印对象的名字,其实就是调用对象的toString p=p.toString(); System.out.println(p);//com.itheima.demo01.Object.Person@5f150435 | abc | Person{name=张三 ,age=18} System.out.println(p.toString());//同上 //看一个类是否重写了toString,直接打印这个类的对象即可,如果没有重写toString方法那么打印的是对象的地址值 Random r = new Random(); System.out.println(r);//java.util.Random@3f3afe78 没有重写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方法 } } package demo01; public class Person { private String name; private int age; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", 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; } }

    P21602.Object类的equals方法

    package com.itheima.demo01.Object; import java.util.ArrayList; 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("古力娜扎",19); Person p2 = new Person("迪丽热巴",18); System.out.println("p1:"+p1);//p1:com.itheima.demo01.Object.Person@58ceff1 System.out.println("p2:"+p2);//p2:com.itheima.demo01.Object.Person@7c30a502 //p1=p2;//把p2的地址值赋值给p1 ArrayList<String> list = new ArrayList<>(); boolean b = p1.equals(p1); System.out.println(b); } }

    P21703.重写Object类的equals方法,

    1、getClass() != o.getClass()什么意思?

    使用反射技术,判断o是否是Person类型 等效于 obj instanceof Person

    2、equals方法,还是使用alt+ins,去快速重写。

    一般来说选择这个。

    每句话的意思。

    @Override public boolean equals(Object o) { if (this == o) return true;//如果内存地址值一样,返回true if (o == null || getClass() != o.getClass()) return false;//如果它的地址值为空,或者它们的类型不同,返回false Person person = (Person) o;//经历完上述条件后,进行向下转型。 return age == person.age &&//比较两个对象中的年龄和姓名。 Objects.equals(name, person.name); }

    P21804.Object类&Objects类

    package demo01; public class Test { public static void main(String[] args) { String str = "abc"; System.out.println(str);//abc System.out.println(str.toString());//两者等价 //为什么打印str对象名,出现了abc, //因为String类,调用了toString方法。 //因为String类,重写了toString方法。 Student s = new Student("张三",23); System.out.println(s);//demo01.Student@4dd8dc3 System.out.println(s.toString());//demo01.Student@4dd8dc3 //为什么打印对象s是地址,二而str是内容? //重写后: //Student{name='张三', age=23} } } package demo01; import java.util.Objects; public class Test2 { public static void main(String[] args) { String s1 = "abc"; String s2 = "abc"; System.out.println(s1.equals(s2));//true /* * 这里String类的toString方法以及重写了,比较的不是地址,而是内容! * */ Student stu1 = new Student("张三",23); Student stu2 = new Student("张三",23); System.out.println(stu1.equals(stu2));//false,重写equals之后true //没重写,比较的是地址。重写了,比较的是内容。equals,是object类的。可以接受任何类型。 String s3 = "abc"; String s4 = null; System.out.println(s4.equals(s3));//如果变量放在前面,变量是null值,会报错。NullPointerException空指针异常 //所以使用Objects工具类,来比较。 boolean equals = Objects.equals(s3, s4); System.out.println(equals); } } package demo01; public class Student extends Object{ private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", 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; } }

    P21905.Objects类的equals方法

    上面有代码。

    Processed: 0.012, SQL: 9