Java 类属性

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++;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值