文章目录
一、可变类型
可变类型的对象在创建后,其状态(字段值)可以发生变化。这意味着,对象的属性可以在对象创建后被修改。
1.1 特点:
- 对象的字段值可以通过方法或直接访问进行修改。
- 可以通过 setter 方法或其他手段修改对象的状态。
- 可变类型的对象通常不具备线程安全性,特别是当多个线程访问同一个对象时,需要额外的同步措施。
1.2 示例
可变类型:
public class Person {
// 可变字段
private String name;
private int age;
// 构造方法
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getter 和 Setter 方法
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; // 可以修改对象的状态
}
}
使用可变类型:
public class Main {
public static void main(String[] args) {
Person person = new Person("John", 25);
System.out.println(person.getName() + " " + person.getAge());
// 修改对象的状态
person.setName("Alice");
person.setAge(30);
System.out.println(person.getName() + " " + person.getAge());
}
}
输出:
John 25
Alice 30
1.3可变类型的应用场景:
- 需要修改对象的状态:比如用户的账号信息、订单的状态等。
- 性能要求较高时,允许直接修改字段。
二、不可变类型
1.1 定义
不可变类型的对象在创建后,其状态无法改变。这意味着,一旦对象创建,其内部的字段值就不可再修改。常见的不可变类型有String、Integer、localDate
1.2 特点:
- 对象的字段只能在构造时进行初始化,且之后无法更改。
- 不可变类型的对象具有线程安全性,因为其状态不可变,多个线程访问时不会发生数据竞争。
- 通常不可变类型会提供 只读字段 和 无 setter 方法。
1.3 示例:
public final class Person {
private final String name; // final 字段,无法修改
private final int age; // final 字段,无法修改
// 构造方法
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getter 方法(没有 Setter 方法,无法修改对象的状态)
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
使用不可变类型:
public class Main {
public static void main(String[] args) {
Person person = new Person("John", 25);
System.out.println(person.getName() + " " + person.getAge());
// person.setName("Alice"); // 编译错误,无法修改对象的状态
// person.setAge(30); // 编译错误,无法修改对象的状态
}
}
1.4 String
String
是 Java 中最经典的不可变类。String
类的实例一旦创建后,其值就不能修改。每当对字符串进行修改时,实际上是创建了一个新的 String
对象,而原始字符串对象保持不变。
1.4.1 为什么说它是不可变类型
- 类是被final修饰
- 存储数据的数组也是被final修饰
- 类内没有任何方法对数组内的内容做修改
“共享带来的便利>随意修改带来的便利”
1.4.2 示例
public class Main {
public static void main(String[] args) {
String str1 = "Hello";
String str2 = str1.toUpperCase(); // 转换为大写,但不会修改原始字符串
System.out.println("Original String: " + str1); // 输出 "Hello"
System.out.println("Modified String: " + str2); // 输出 "HELLO"
}
}
输出:
Original String: Hello
Modified String: HELLO