Java类与对象

Java/ 学习 2020-03-18

一、面向对象三大特性

封装、继承、多态

二、类的定义和创建对象

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
//Student.java
public class Student {
private String name;
private int age;

//无参构造
public Student() {}

//有参构造
public Student(String name, int age) {
this.name = name;
this.age = age;
}

public void study() {
System.out.println(name + "正在学习");
}
}

//Main.java
import com.example.Student;

public class Main {
public static void main(String[] args) throws Exception {
Student s = new Student("小明", 20);
s.study();
}
}

//输出小明正在学习

三、equals和hashCode

  • 在Java中,Object 类提供了两个重要的方法:equals()hashCode()。这两个方法经常在集合框架(如 HashSetHashMap)中。
  • equals(Object obj):默认实现是比较两个对象的内存地址(即 == 比较)。只有当两个引用指向同一个对象时,才返回 true
  • hashCode():默认返回对象的内存地址转换成的整数(不同JVM实现可能不同)。
1
2
3
Object obj1 = new Object();
Object obj2 = new Object();
System.out.println(obj1.equals(obj2)); // false

什么时候需要重写

当希望两个对象在逻辑上相等(例如,根据属性值判断)时,就需要重写 equals()。典型的场景是实体类(比如 Person、Student)。

重写 equals() 时必须同时重写 hashCode()

  • 一致性:只要对象属性没有改变,多次调用 hashCode() 应返回相同的整数。
  • 如果 equals() 返回 true,那么两个对象的 hashCode() 必须相等。
  • 如果 equals() 返回 false,hashCode() 不一定要不同,但尽量不同以提高集合性能。
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
public class Person {
private String id;
private String name;

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

// 重写 equals():比较 id 和 name
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Person person = (Person) obj;
return id.equals(person.id) && name.equals(person.name);
}

@Override
public int hashCode() {
int result = id.hashCode();
result = 31 * result + name.hashCode();
return result;
}
}