温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java private 常见错误有哪些

发布时间:2026-09-13 21:36:15 来源:亿速云 阅读:103 作者:小樊 栏目:编程语言

在 Java 中,private 是访问修饰符,用于限制成员(变量、方法、构造器等)只能在同一个类内部访问。在实际开发中,关于 private 的常见错误主要集中在误用、误解访问范围、JSON/框架反射、继承误区等方面。下面按“场景 + 错误示例 + 正确做法”说明。


一、以为 private 能被子类访问(最常见)

❌ 错误

class Parent {
    private int age = 10;
}

class Child extends Parent {
    void test() {
        System.out.println(age); // 编译错误
    }
}

✅ 说明

  • private 不能被继承
  • 子类看不到父类的 private 成员

✅ 正确做法

protected int age;
// 或提供 getter
public int getAge() { return age; }

二、以为 private 方法能被外部类调用

❌ 错误

class User {
    private void say() {}
}

User u = new User();
u.say(); // 编译错误

✅ 正确做法

  • 通过 public / protected 方法间接调用
  • 或改为包级/公开方法

三、在构造器中忘记初始化 private 字段

❌ 错误

class User {
    private String name;

    public String getName() {
        return name; // 可能为 null
    }
}

✅ 建议

public User(String name) {
    this.name = name;
}

四、JSON / 框架反序列化失败(非常常见)

❌ 错误

class User {
    private Long id;

    // 没有 setter / 无参构造
}

Jackson / Fastjson 反序列化失败:

{ "id": 1 }

✅ 正确做法

private Long id;

public void setId(Long id) {
    this.id = id;
}

或:

@JsonProperty
private Long id;

五、误以为 private 能提高安全性(安全误区)

❌ 误解

private 字段外部改不了,所以安全

✅ 事实

  • 反射可以访问 private
Field f = obj.getClass().getDeclaredField("secret");
f.setAccessible(true);
f.set(obj, "hack");

✅ private 是封装,不是安全机制


六、private 构造器使用错误

❌ 错误

class Util {
    private Util() {}
}
// 忘记防止反射创建

✅ 单例正确写法

private Util() {
    if (instance != null) {
        throw new IllegalStateException();
    }
}

七、内部类访问外部类 private(容易混淆)

✅ 合法

class Outer {
    private int x = 1;

    class Inner {
        void test() {
            System.out.println(x); // OK
        }
    }
}

⚠️ 这是 Java 编译器特殊处理,不是普通访问规则


八、单元测试访问 private 方法错误方式

❌ 错误

obj.privateMethod(); // 编译失败

✅ 推荐

  • 改为 package-private
  • 或通过公共方法覆盖测试
  • 或用反射(不推荐频繁使用)

九、static private 误用

private static int count;

✅ 合法
⚠️ 注意:所有实例共享


总结速查表

错误类型 是否编译错误 说明
子类访问 private ✅ 不可继承
外部调用 private 方法 ✅ 不可访问
JSON 反序列化失败 ❌(运行时) 缺 setter
认为 private 安全 ❌(误解) 可被反射
private 构造器 ✅/⚠️ 单例需防反射

如果你愿意,我可以:

  • 给你 private 面试常问问题
  • 或结合 Spring / Jackson / Lombok 讲 private 坑
  • 或分析你具体代码错误

直接贴代码即可。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手