Java 封装 private public protected和用法

本文深入讲解Java中的封装性,探讨private、default、protected、public四种访问控制符的使用及区别,通过实例展示如何利用封装性提升代码安全性。

Java是使用“访问控制符”来控制哪些细节需要封装,哪些细节需要暴露的。 Java中4种“访问控制符”分别为private、default、protected、public,它们说明了面向对象的封装性,所以我们要利用它们尽可能的让访问权限降到最低,从而提高安全性。

      下面详细讲述它们的访问权限问题。其访问权限范围如表5-1所示。

表5-1 访问权限修饰符

图1.png

      1. private 表示私有,只有自己类能访问

      2. default表示没有修饰符修饰,只有同一个包的类能访问

      3. protected表示可以被同一个包的类以及其他包中的子类访问

      4. public表示可以被该项目的所有包中的所有类访问

      下面做进一步说明Java中4种访问权限修饰符的区别:首先我们创建4个类:Person类、Student类、Animal类和Computer类,分别比较本类、本包、子类、其他包的区别。

public访问权限修饰符:

图5-8 public访问权限—本类中访问public属性.png

图5-8 public访问权限—本类中访问public属性

图5-9 public访问权限—本包中访问public属性.png

图5-9 public访问权限—本包中访问public属性

图5-10 public访问权限—不同包中的子类访问public属性.png

图5-10 public访问权限—不同包中的子类访问public属性

图5-11 public访问权限—不同包中的非子类访问public属性.png

图5-11 public访问权限—不同包中的非子类访问public属性

      通过图5-8 ~ 图5-11可以说明,public修饰符的访问权限为:该项目的所有包中的所有类。

protected访问权限修饰符:将Person类中属性改为protected,其他类不修改。

图5-12 protected访问权限—修改后的Person类.png

图5-12 protected访问权限—修改后的Person类

图5-13 protected访问权限—不同包中的非子类不能访问protected属性.png

图5-13 protected访问权限—不同包中的非子类不能访问protected属性

      通过图5-12和图5-13可以说明,protected修饰符的访问权限为:同一个包中的类以及其他包中的子类。

默认访问权限修饰符:将Person类中属性改为默认的,其他类不修改。

图5-14 默认访问权限—修改后的Person类.png

图5-14 默认访问权限—修改后的Person类

      通过图5-14可以说明,默认修饰符的访问权限为:同一个包中的类。

private访问权限修饰符:将Person类中属性改为private,其他类不修改。

图5-15 private访问权限—修改后的Person类.png

图5-15 private访问权限—修改后的Person类

      通过图5-15可以说明,private修饰符的访问权限为:同一个类。

类的属性的处理:

      1. 一般使用private访问权限。

      2.  提供相应的get/set方法来访问相关属性,这些方法通常是public修饰的,以提供对属性的赋值与读取操作(注意:boolean变量的get方法是is开头!)。

      3. 一些只用于本类的辅助性方法可以用private修饰,希望其他类调用的方法用public修饰。

【示例5-10】JavaBean的封装实例

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

public class Person {

    // 属性一般使用private修饰

    private String name;

    private int age;

    private boolean flag;

    // 为属性提供public修饰的set/get方法

    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 boolean isFlag() {// 注意:boolean类型的属性get方法是is开头的

        return flag;

    }

    public void setFlag(boolean flag) {

        this.flag = flag;

    }

}

      下面我们使用封装来解决一下5.4.1中提到的年龄非法赋值的问题。

【示例5-11】封装的使用

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

class Person {

    private String name;

    private int age;

    public Person() {

 

    }

    public Person(String name, int age) {

        this.name = name;

        // this.age = age;//构造方法中不能直接赋值,应该调用setAge方法

        setAge(age);

    }

     

    public void setName(String name) {

        this.name = name;

    }

    public String getName() {

        return name;

    }

    public void setAge(int age) {

        //在赋值之前先判断年龄是否合法

        if (age > 130 || age < 0) {

            this.age = 18;//不合法赋默认值18

        else {

            this.age = age;//合法才能赋值给属性age

        }

    }

    public int getAge() {

        return age;

    }

    @Override

    public String toString() {

        return "Person [name=" + name + ", age=" + age + "]";

    }

}

 

public class Test2 {

    public static void main(String[] args) {

        Person p1 = new Person();

        //p1.name = "小红"; //编译错误

        //p1.age = -45;  //编译错误

        p1.setName("小红");

        p1.setAge(-45);

        System.out.println(p1);

         

        Person p2 = new Person("小白"300);

        System.out.println(p2);

    }

}

      执行结果如图5-16所示:

图5-16 示例5-11运行效果图.png

图5-16 示例5-11运行效果图

Java中的访问修饰符用于控制类、接口、变量方法的可见性访问权限。`public`、`protected``private`是Java中的三种访问修饰符,它们之间的区别主要体现在访问范围适用对象上。 ### public `public`修饰符表示公开的访问权限,被`public`修饰的类、接口、变量方法可以被所有类访问,无论这些类是否在同一个包中。例如,一个`public`类的方法可以被任何其他类调用。`public`适用于类、接口、变量方法[^1]。 ### protected `protected`修饰符表示受保护的访问权限,被`protected`修饰的变量方法可以被同一包中的类访问,同时也可以被不同包中的子类访问。这意味着即使子类不在同一个包中,只要它是父类的子类,就可以访问父类中被`protected`修饰的成员。需要注意的是,`protected`不能用于修饰外部类[^1]。 ### private `private`修饰符表示私有的访问权限,被`private`修饰的变量方法只能在定义它们的类内部访问。这意味着其他类,即使是子类或同一包中的类,也无法直接访问这些成员。`private`也不能用于修饰外部类[^1]。 ### 示例代码 下面是一个简单的示例,演示了不同访问修饰符的使用: ```java // 公共类 public class PublicClass { // 公共方法 public void publicMethod() { System.out.println("Public method"); } // 受保护的方法 protected void protectedMethod() { System.out.println("Protected method"); } // 私有方法 private void privateMethod() { System.out.println("Private method"); } } // 子类 class SubClass extends PublicClass { public void accessMethods() { // 可以访问公共方法 publicMethod(); // 可以访问受保护的方法 protectedMethod(); // 无法访问私有方法 // privateMethod(); // 编译错误 } } ``` 在上述代码中,`PublicClass`是一个公共类,它包含了一个公共方法`publicMethod`、一个受保护方法`protectedMethod`一个私有方法`privateMethod`。`SubClass`继承自`PublicClass`,它可以访问`PublicClass`中的公共受保护方法,但不能访问私有方法。 ### 访问权限总结 - `public`:对所有类可见。 - `protected`:对同一包内的类所有子类可见。 - `private`:仅对定义它们的类可见。 通过合理使用这些访问修饰符,可以有效地控制代码的封装安全性,提高程序的健壮性可维护性。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值