Java学习指南(09) 访问控制与封装

本文是《Java学习指南》原书的网络版,作者邵发,拥有本书的全部权利。相关视频课程在此查看

目录

第9章 访问控制与封装

9.1 访问修饰符

9.2 Getter与Setter


第9章 访问控制与封装

9.1 访问修饰符

访问修饰符 ( Access Modifier ),是指在属性和方法前面用于访问控制的关键字。本章介绍两个访问修饰符:public和private。

其中,public是我们一直使用的,用在属性和方法的前面,例如,

简单的讲,public表示公开的,private则表示私有的、私密的。

这就好比一个家(class),其客厅是public的,而卧室则是private的。

9.1.1 私有的private

当一个属性/方法被声明为private,则表示它是私有的。此时,不允许外部访问它。

例如,

public class Example
{
    private int number = 10; // 声明为私有
}

则在外部无法访问number属性,例如,

public class HelloWorld
{
    public static void main(String[] args)
    {
        Example ex = new Example();
        ex.number  = 10; // 错误!
    }
}

此时Eclipse会提示"The field is not visible" 的错误,告诉我们不能在HelloWord类里访问Example类的number属性。

强调一下,这里所谓的“外部”,是指Example类的外面。比如,在HelloWorld里访问Example就算是外部。

9.1.2 可见性 visibility

可见性和可访问性是同一回事:如果一个属性/方法可以访问,就可以说成是可见的(visible);反之,就是不可见的(not visible)。

在Eclipse里自动提示时,对于private的属性/方法会自动过滤,不会显示在候选下拉列表里。这正说明了什么是可见性。

v public:  外部可以访问的,可见的

v private: 外部不可以访问的,不可见的

值得一提的是,在类里的内部访问时,不受private的限制。例如,

public class Example
{
    private int number = 10;

    public void show ()
    {
        System.out.println("值为" + this.number);
    }
}

其中,属性number是private的,但是在show()里可以访问。

因为它们好比是一家人,家庭内部自然是不受private限制的。所谓的可见性,是对外人而言的。

9.2 Getter与Setter

public和private的含义其实比较简单,理解起来应该没有太大问题。真正的问题在于应用,即什么时候该用public,什么时候该用private,是一个问题。

其使用原则是:如果仅供内部使用,则设为private;如果是提供给外部使用的,用 public。

初学者在练习时,如果难以决定,则可以统一设为private;当需要在外部访问时,则再改成public就可以了。例如,

public class Example
{
    private int number ; // 将所有属性设为private
}

9.2.1 Getter方法

如果外部要获取这个number的值,则可以添加一个方法用于获取属性的值,例如,

public class Example
{
    private int number ;

    public int getNumber()
    {
        return number;
    }
}

像getNumber()这种,用于获取属性的值的方法,称为Getter方法。其名字是一般以get打头,后面加上属性的名字,并将首字母大写。

其命名规律示例如下,

number ->  getNumber()

name -> getName()

numView -> getNumView()

9.2.2 Setter方法

同理,如果外部想要设置number的值,就得添加一个Setter方法,示例如下,

public class Example
{
    private int number ;

    public void setNumber(int number)
    {
        this.number = number;
    }
}

Setter方法的命名规律基本类似,只是以set打头的,并且传递一个同类的参数。

使用 Getter / Setter 方法,就可以灵活地对一个属性进行访问控制。

v 读/写: Getter/Setter

v 只读 : 仅 Getter

v 禁止读/写: private,并且没有Getter/Setter

比如,

public class Example
{
    private int number ;

    public int getNumber()
    {
        return number;
    }
}

由于 number 属性只有 Getter、没有Setter,所以它对外是只读的。在外部,可以用getNumber() 获取属性的值。示例如下,

Example e = new Example();

int num = e.getNumber(); // 获取属性的值

9.2.3 封装

封装是一种设计思路,它指的是将实现细节封装到内部,是用户不可见的;用户能操作的接口,设为用户可见的。

打个比方,一台电视机就是做了很好的封装设计。其内部的实现细节是相当复杂的,有各种元器件、线路、线圈。它们被封装在了内部,是不可见的。而对外暴露给用户的,则是显示屏、按钮、信号输入插孔等,这个是可见的。如下图所示,

我们在设计类的时候,也应参考这种设计思想。把不该让用户看到的东西,封装在内部(设为private) ;把应该让用户看到的东西,设为public。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿发你好

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值