0%

Java(16)Object类

Object类

java.lang.Object

类 Object 是类层次结构的根(父)类。

每个类都使用 Object 作为超(父)类。

所有对象(包括数组)都实现这个类的方法。

Object类的toString() 方法

直接打印对象的地址值没有意义,需要重写Object类中的toString方法

打印对象的属性(name, age)

alt + inter 可自动导入

Person类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package com.tipdm.Demo01;

import java.util.Objects;

public class Person {
private String name;
private int age;

/**
* 直接打印对象的地址值没有意义,需要重写Object类中的toString方法
* 打印对象的属性(name, age)
* alt + inter 可自动导入
*/
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}

public Person(String name, int age) {
this.name = name;
this.age = age;
}


public Person() {
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

demo1类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package com.tipdm.Demo01;

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

/**
* java.lang.Object
* 类 Object 是类层次结构的根(父)类。
* 每个类都使用 Object 作为超(父)类。
* 所有对象(包括数组)都实现这个类的方法。
*/
public class demo1 {
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.tipdm.Demo01.Person@1b6d3586

// 直接打印对象的名字,其实就是调用对象的toString p=p.toString
System.out.println(p); // com.tipdm.Demo01.Person@1b6d3586

// 看一个类是否重写了toString,直接打印这个类的对象即可,如果没有重写toString方法那么打印的是对象的地址值
Random r = new Random();
System.out.println(r); // java.util.Random@4554617c 未重写toString方法

Scanner sc = new Scanner(System.in);
System.out.println(sc); // java.util.Scanner[delimiters=\p{j... 重写toString方法

ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
System.out.println(list); // [1, 2, 3] 重写了toString方法
}
}
1
2
3
4
5
6
7
com.tipdm.Demo01.Person@2b8768b5
com.tipdm.Demo01.Person@2b8768b5
java.util.Random@4554617c
java.util.Scanner[delimiters=\p{javaWhitespace}+][position=0][match valid=false][need input=false][source closed=false][skipped=false][group separator=\x{2c}][decimal separator=\x{2e}][positive prefix=][negative prefix=\Q-\E][positive suffix=][negative suffix=][NaN string=\Q?\E][infinity string=\Q∞\E]
[1, 2, 3]

进程已结束,退出代码0

Object类的equals()方法

Person类默认继承了Object类,所以可以使用Object类的equals方法

equals(Object obj) 指示其他某个对象是否与此对象“相等”。

alt + instert 可直接添加

equals 方法源码:

1
2
3
public boolean equals(Object obj) {
return (this == obj);
}

参数:

  • Object obj:可以传递任意的对象

== 比较运算符,返回的是一个boolean

基本数据类型:比较的是值

引用数据类型:比较的是内存地址

Person类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package com.tipdm.Demo01;

import java.util.Objects;

public class Person {
private String name;
private int age;
/*
Object类的equals方法,默认比较的是两个对象的地址值,没有意义
所以我们要重写equals方法,比较两个对象的属性(name, age)
问题:
隐含着一个多态
多态的弊端:无法使用子类特有的内容(属性和方法)
Object obj = p2 = new Person("古力娜扎", 19); // 多态
解决:可以使用向下转型(强转)把obj类型转化为Person
alt + instert 可直接添加
*/

@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 Person(String name, int age) {
this.name = name;
this.age = age;
}


public Person() {
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

demo02类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.tipdm.Demo01;

import java.util.ArrayList;

/**
*
*/
public class demo2 {
public static void main(String[] args) {
/**
* this是谁? 哪个对象调用的方法,方法中的this就算哪个对象;p1调用的equals方法所以this就是p1
* obj是谁? 传递过来的参数p2
* this==obj --> p1==p2
*/
Person p1 = new Person("迪丽热巴", 18);
Person p2 = new Person("古力娜扎", 19);
Person p3 = new Person("古力娜扎", 19);
System.out.println("p1:" + p1); // p1:com.tipdm.Demo01.Person@1b6d3586
System.out.println("p2:" + p2); // p2:com.tipdm.Demo01.Person@4554617c

// p1 = p2; // 把p2的地址值赋值给p1
// boolean b = p1.equals(p2);
boolean b = p2.equals(p3); // true
System.out.println(b); // 此时比较的是地址值 false

ArrayList<String> list = new ArrayList<>();
// 类型转换异常
System.out.println(p1.equals(null)); // 空指针异常
}
}
1
2
3
4
5
6
p1:com.tipdm.Demo01.Person@904fec5d
p2:com.tipdm.Demo01.Person@89b8c9fc
true
false

进程已结束,退出代码0

Objects.equals(s1, s2) 防止空指针异常

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.tipdm.Demo01;

import java.util.Objects;

public class demo3Objects {
public static void main(String[] args) {
// String s1 = "abc";
String s1 = null;
String s2 = "aBc";

// boolean b = s1.equals(s2); // NullPointerException null是不能调用方法的,就会抛出空指针异常

/**
* Objects类中的equals方法:对两个对象进行比较,防止空指针异常
* public static boolean equals(Object a, Object b) {
* return (a == b) || (a != null && a.equals(b));
* }
*/
boolean b2 = Objects.equals(s1, s2);
System.out.println(b2);
}
}
-------------本文结束感谢您的阅读-------------