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。

你可能感兴趣的:(Java01,快速入门篇)