Java 类属性的定义与作用
类属性(也称为字段或成员变量)是类的重要组成部分,用于描述对象的状态或特征。类属性可以是基本数据类型(如 int、double)或引用类型(如 String、自定义类)。类属性通常在类内部声明,但在所有方法之外。
public class Person {
// 类属性
private String name;
private int age;
private double height;
}
类属性的访问修饰符
Java 提供了四种访问修饰符来控制类属性的可见性:
private
:仅在当前类中可见protected
:在当前类、同一包内的类以及子类中可见public
:对所有类可见- 默认(无修饰符):在同一包内可见
public class AccessExample {
private int privateField;
protected int protectedField;
public int publicField;
int defaultField;
}
类属性的初始化
类属性可以在声明时初始化,也可以在构造函数中初始化,或者使用初始化块。
public class InitializationExample {
// 声明时初始化
private String name = "Unknown";
// 初始化块
{
name = "Initialized in block";
}
// 构造函数初始化
public InitializationExample() {
name = "Initialized in constructor";
}
}
静态属性与非静态属性
类属性可以分为静态属性(类变量)和非静态属性(实例变量)。静态属性属于类本身,而非静态属性属于类的实例。
public class StaticExample {
// 实例变量
private int instanceVar;
// 类变量
private static int classVar;
public void method() {
// 可以访问实例变量和类变量
instanceVar = 10;
classVar = 20;
}
public static void staticMethod() {
// 只能访问类变量
classVar = 30;
// instanceVar = 40; // 编译错误
}
}
常量属性
使用 final
关键字可以定义常量属性,这些属性一旦初始化后就不能被修改。
public class Constants {
// 常量通常使用大写字母命名
public static final double PI = 3.141592653589793;
public static final String APPLICATION_NAME = "MyApp";
// 实例常量
private final int id;
public Constants(int id) {
this.id = id; // 只能在构造函数中赋值一次
}
}
属性的封装与Getter/Setter方法
为了遵循封装原则,通常将属性设为私有,并提供公共的Getter和Setter方法。
public class EncapsulationExample {
private String name;
private int age;
// Getter方法
public String getName() {
return name;
}
// Setter方法
public void setName(String name) {
if(name != null && !name.isEmpty()) {
this.name = name;
}
}
public int getAge() {
return age;
}
public void setAge(int age) {
if(age >= 0 && age <= 120) {
this.age = age;
}
}
}
属性的注解
Java 提供了多种注解来标注属性,如 @Deprecated
、@Override
(用于方法)和自定义注解。
public class AnnotationExample {
@Deprecated
private String oldField;
@SuppressWarnings("unused")
private int unusedField;
}
属性的初始化顺序
了解类属性的初始化顺序很重要,特别是当存在多个初始化方式时。
public class InitializationOrder {
// 1. 静态变量声明时初始化
private static int staticVar = initStaticVar();
// 2. 静态初始化块
static {
staticVar = 20;
}
// 3. 实例变量声明时初始化
private int instanceVar = initInstanceVar();
// 4. 实例初始化块
{
instanceVar = 40;
}
// 5. 构造函数
public InitializationOrder() {
instanceVar = 50;
}
private static int initStaticVar() {
return 10;
}
private int initInstanceVar() {
return 30;
}
}
属性的Lombok简化
使用Lombok库可以简化Getter/Setter方法的编写。
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class LombokExample {
private String name;
private int age;
private double salary;
}
属性的序列化
当需要将对象序列化时,某些属性可能不需要序列化,可以使用 transient
关键字。
import java.io.Serializable;
public class SerializationExample implements Serializable {
private String name;
private transient int age; // 不会被序列化
public SerializationExample(String name, int age) {
this.name = name;
this.age = age;
}
}
属性的线程安全
在多线程环境中,需要注意属性的线程安全性。
public class ThreadSafetyExample {
// 非线程安全
private int counter;
// 使用volatile保证可见性
private volatile boolean flag;
// 使用Atomic类保证原子性
private java.util.concurrent.atomic.AtomicInteger atomicCounter =
new java.util.concurrent.atomic.AtomicInteger(0);
public synchronized void increment() {
counter++;
}
}