Java 封装 private public protected和用法

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运行效果图

  • 20
    点赞
  • 106
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值