private 关键字

概述

private 关键字是最严格的访问修饰符,被修饰的成员只能在当前类内部访问。

语法格式

private int variable;            // 私有变量
private void method() { }        // 私有方法
private ClassName() { }          // 私有构造器

基本用法

public class Person {
    // 私有成员变量
    private String name;
    private int age;
    private String socialSecurityNumber;

    // 公共构造器
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
        this.socialSecurityNumber = generateSSN();
    }

    // 公共getter方法
    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    // 私有辅助方法
    private String generateSSN() {
        return "SSN-" + System.currentTimeMillis();
    }

    // 私有验证方法
    private boolean isValidAge(int age) {
        return age >= 0 && age <= 150;
    }

    // 公共setter方法,内部使用私有验证
    public void setAge(int age) {
        if (isValidAge(age)) {
            this.age = age;
        } else {
            throw new IllegalArgumentException("年龄无效");
        }
    }

    // 私有方法不能从外部访问
    private void secretMethod() {
        System.out.println("这是私有方法,只能在类内部调用");
    }

    public void publicMethod() {
        secretMethod(); // 类内部可以调用私有方法
        System.out.println("公共方法调用了私有方法");
    }
}

public class PrivateExample {
    public static void main(String[] args) {
        Person person = new Person("张三", 25);

        // 可以访问公共方法
        System.out.println("姓名: " + person.getName());
        System.out.println("年龄: " + person.getAge());

        // 调用公共方法(内部会调用私有方法)
        person.publicMethod();

        // 以下访问会编译错误
        // System.out.println(person.name);           // 错误:私有变量不能访问
        // person.secretMethod();                     // 错误:私有方法不能访问
        // String ssn = person.generateSSN();        // 错误:私有方法不能访问
    }
}

封装和数据保护

public class BankAccount {
    // 私有字段保护敏感数据
    private String accountNumber;
    private double balance;
    private String pin;

    public BankAccount(String accountNumber, String pin, double initialBalance) {
        this.accountNumber = accountNumber;
        this.pin = hashPin(pin);
        this.balance = initialBalance;
    }

    // 私有方法用于内部处理
    private String hashPin(String pin) {
        // 简单的哈希示例(实际应用中应使用更安全的方式)
        return "HASHED_" + pin;
    }

    private boolean validatePin(String inputPin) {
        return this.pin.equals(hashPin(inputPin));
    }

    private void logTransaction(String operation, double amount) {
        System.out.println("账户 " + accountNumber + " " + operation + " " + amount);
    }

    // 公共接口方法
    public boolean deposit(String pin, double amount) {
        if (!validatePin(pin)) {
            System.out.println("PIN码错误");
            return false;
        }

        if (amount > 0) {
            balance += amount;
            logTransaction("存款", amount);
            return true;
        }
        return false;
    }

    public boolean withdraw(String pin, double amount) {
        if (!validatePin(pin)) {
            System.out.println("PIN码错误");
            return false;
        }

        if (amount > 0 && amount <= balance) {
            balance -= amount;
            logTransaction("取款", amount);
            return true;
        }
        return false;
    }

    public double getBalance(String pin) {
        if (validatePin(pin)) {
            return balance;
        } else {
            System.out.println("PIN码错误,无法查询余额");
            return -1;
        }
    }
}

public class BankAccountExample {
    public static void main(String[] args) {
        BankAccount account = new BankAccount("12345", "1234", 1000.0);

        // 正确的PIN码操作
        account.deposit("1234", 500.0);
        System.out.println("余额: " + account.getBalance("1234"));
        account.withdraw("1234", 200.0);

        // 错误的PIN码操作
        account.deposit("0000", 100.0);
        System.out.println("余额: " + account.getBalance("0000"));

        // 无法直接访问私有成员
        // System.out.println(account.balance);      // 编译错误
        // account.logTransaction("test", 100);      // 编译错误
    }
}

私有构造器

// 工具类 - 防止实例化
public class MathUtils {
    // 私有构造器防止实例化
    private MathUtils() {
        throw new UnsupportedOperationException("工具类不能实例化");
    }

    public static double add(double a, double b) {
        return a + b;
    }

    public static double multiply(double a, double b) {
        return a * b;
    }
}

// 单例模式
public class Singleton {
    private static Singleton instance;

    // 私有构造器防止外部实例化
    private Singleton() {
        System.out.println("创建单例实例");
    }

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }

    public void doSomething() {
        System.out.println("执行单例操作");
    }
}

public class PrivateConstructorExample {
    public static void main(String[] args) {
        // 使用工具类的静态方法
        double result = MathUtils.add(5.0, 3.0);
        System.out.println("加法结果: " + result);

        // 无法实例化工具类
        // MathUtils utils = new MathUtils(); // 编译错误

        // 使用单例
        Singleton singleton1 = Singleton.getInstance();
        Singleton singleton2 = Singleton.getInstance();

        System.out.println("是否为同一实例: " + (singleton1 == singleton2));
        singleton1.doSomething();

        // 无法直接实例化单例
        // Singleton singleton = new Singleton(); // 编译错误
    }
}

内部类访问

public class OuterClass {
    private String outerPrivateField = "外部类私有字段";

    // 内部类可以访问外部类的私有成员
    private class InnerClass {
        public void accessOuterPrivate() {
            System.out.println("内部类访问: " + outerPrivateField);
        }
    }

    public void createInner() {
        InnerClass inner = new InnerClass();
        inner.accessOuterPrivate();
    }

    // 私有静态内部类
    private static class PrivateStaticInner {
        public void display() {
            System.out.println("私有静态内部类");
        }
    }

    public static void createPrivateStatic() {
        PrivateStaticInner inner = new PrivateStaticInner();
        inner.display();
    }
}

public class InnerClassExample {
    public static void main(String[] args) {
        OuterClass outer = new OuterClass();
        outer.createInner();

        OuterClass.createPrivateStatic();

        // 无法从外部访问私有内部类
        // OuterClass.InnerClass inner = outer.new InnerClass(); // 编译错误
    }
}

最佳实践

  1. 字段默认私有

    public class Example {
        private String name;     // 好的做法
        // public String name;   // 避免公共字段
    
        public String getName() {
            return name;
        }
    }
    
  2. 私有辅助方法

    public class Calculator {
        public double calculateTotal(double[] values) {
            double sum = sum(values);        // 使用私有方法
            double tax = calculateTax(sum);  // 使用私有方法
            return sum + tax;
        }
    
        private double sum(double[] values) {
            double total = 0;
            for (double value : values) {
                total += value;
            }
            return total;
        }
    
        private double calculateTax(double amount) {
            return amount * 0.1;
        }
    }
    

private关键字是Java封装性的核心,通过隐藏实现细节来保护数据和维护代码安全性。

powered by Gitbook© 2025 编外计划 | 最后修改: 2025-07-28 16:25:54

results matching ""

    No results matching ""