前言
面向对象编程(Object-Oriented Programming, OOP)已经成为了主流的编程范式之一。面向对象程序主要有Java、Python、C++和C语言等等。
面向对象程序三大特性:封装、继承、多态。这些特性使得程序具有更好的可维护性、可扩展性和可重用性。
本文使用Java对面向对象编程语言三大特性之一 封装性 进行解析。
正文
一.何为封装
在Java类和对象阶段,主要研究的就是封装特性。
何为封装呢?简单来说就是:
套壳屏蔽细节,将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。
比如:对于电脑这样一个复杂的设备,提供给用户的就只是:开关机、通过键盘输入,显示器,USB插孔等,让用户来和计算机进行交互,完成日常事务。
但实际上:电脑真正工作的却是CPU、显卡、内存等一些硬件元件。
对于计算机使用者而言,不用关心内部核心部件,比如主板上线路是如何布局的,CPU内部是如何设计的等,用户 只需要知道,怎么开机、怎么通过键盘和鼠标与计算机进行交互即可。
因此计算机厂商在出厂时,在外部套上壳子,将内部实现细节隐藏起来,仅仅对外提供开关机、鼠标以及键盘插孔等,让用户可以与计算机进行交互即可。
比如:
此时name和age都用public修饰,在类外可以实例化对象然后 “ .name ”进行赋值
但是如果我想保证name和age的隐私,不想让别人在类外知道我这两个属性,就要把public改成private。
如下图,此时再像上图一样调用属性就会报错(使用 "person." 调用也在列表中看不见两个属性),就相当于给属性套了个壳子,将其封装起来,使在类外无法看到这个属性,体现了封装性
(类内是指Person类,而类外是指Person以外的类,如Test类)
如果还想给对象赋值,可以使用public修饰的有参构造
同时,private也能用来修饰方法。如下图,当改成private后,有参构造就不能在类外使用了,这意味着此时构造方法只能在类内使用(Person类),而类外无法使用了。
这也体现了封装性
所以我们也可以这么说:
封装: 从语法上来说就是被private 修饰的成员变量或者成员方法只能在当前类当中使用
那封装了属性和方法后我们就不能给对象赋值了吗?
不,正如前文所说,我们可以结合操作数据的方法进行赋值
我们可以使用Get和Set方法
如图,成功打印,因此,当我们使用封装时,我们可以用Get和Set方法对对象数据进行操作
以下是:快捷键操作
(IDEA快捷键 Alt + Insert)
(然后Ctrl+A全选确定即可快速生成Get和Set方法)
二. 访问限定符
Java中主要通过类和访问权限来实现封装:类可以将数据以及封装数据的方法结合在一起,更符合人类对事物的认知,而访问权限用来控制方法或者字段能否直接在类外使用。
而封装的使用离不开访问修饰符之一private的修饰。
Java中提供了四种访问限定符:
No | 范围 | private | default | protected | public |
---|---|---|---|---|---|
1 | 同一个包中的同一类 | √ | √ | √ | √ |
2 | 同一个包中的不同类 | √ | √ | √ | |
3 | 不同包中的子类 | √ | √ | ||
4 | 不同包中的非子类 | √ |
public :可以理解为一个人的外貌特征,谁都可以看得到
default :对于自己家族中(同一个包中)不是什么秘密,对于其他人来说就是隐私了
private :只有自己知道,其他人都不知道
protected:对子类相当于公开(public),对不是同一包中的没有父子关系的类相当于私有 (private)
【说明】
protected主要是用在继承中
default权限指:什么都不写时的默认权限
访问权限除了可以限定类中成员的可见性,也可以控制类的可见性
public class Computer {
private String cpu; // cpu
private String memory; // 内存
public String screen; // 屏幕
String brand; // 品牌---->default属性
public Computer(String brand, String cpu, String memory, String screen)
{
this.brand = brand;
this.cpu = cpu;
this.memory = memory;
this.screen = screen;
}
public void Boot(){
System.out.println("开机~~~");
}
public void PowerOff(){
System.out.println("关机~~~");
}
public void SurfInternet(){
System.out.println("上网~~~");
}
}
public class TestComputer {
public static void main(String[] args) {
Computer p = new Computer("HW", "i7", "8G", "13*14");
System.out.println(p.brand); // default属性:只能被本包中类访问
System.out.println(p.screen); // public属性: 可以任何其他类访问
//System.out.println(p.cpu); // private属性:只能在Computer类中访问,不能被其他类访问
}
}
结语
以上就是面向对象语言三大特性之一封装性的讲解,其中学习访问限定符能更好地帮助我们理解封装,接下来我将逐步发布关于其他两大特性的讲解,敬请关注,谢谢!