三大特性之浅谈封装
前言
英语:Encapsulation——封装,包装。
面向对象的封装与真实世界的目的是一样的。封装能够使外部访问者不能随意存取对象的内部数据,隐藏了对象的内部细节,只保留有限的对外接口。外部访问者不用关心对象的内部细节,使得操作对象变得简单。
好处
先通过阅读下面的文字,再回来理解可能会更好一点
- 减少了耦合(物理学上类似相互影响的概念)
- 便于维护和修改
- 可以隐藏信息,一些具体实现代码,安全性
- 对成员变量精准控制
介绍(实现方式)
-
Java 面向对象的封装性是通过对成员变量和方法进行访问控制实现的。这里就涉及到了访问控制的四个关键字了。
类别不同地方 同一个类 同一个包 不同包的子类 不同包非子类 私有的(private) Yes No No No 默认 Yes Yes No No 保护的(protected) Yes Yes Yes No 公有的(public) Yes Yes Yes Yes -
封装是一种保护作用,将其变量以及方法保护起来,防止被随机访问,所以一定程度上增强了代码的安全性。
示例
- 下面是代码示例,私有类只能在同一个类中被访问,否则会报错。

private还可以防止直接访问特定的构造器(或全部的构造器)
package music.daima.ebook;
class TestClass{
private TestClass(){}
static TestClass make(){
return new TestClass();
}
}
public class PrivateDaiMa {
public static void main(String args[]){
// TestClass x = new TestClass();
TestClass x = TestClass.make();
// 不能通过构造器来创建TestClass,要通过调用make方法才可以
}
}
报错信息说明TestClass的private将其构造器给私有化了,不能直接访问。

- 访问不同包的protected方法(非子类的),先是定义在Music类中的BaoHu方法。

在其它包访问,就会报错,因为在Music里面这个BaoHu的方法用的是protected修饰的。

其实在Idea写代码时候,定义的属性之类可以在左下角有个概览,可以查看是什么类型的

- 整体的test代码
import music.Music;//导入了music包的Music类
class test{
test(int i){
i = i + 1;
}
private String name;//将其变为public String name;的话下面就可以访问
public int num=2;//公有的可以被访问
double i = 2.2;//默认的定义,也可以被访问,在本包里面
}
public class FengZhuang {
public static void main(String args[]){
test a = new test(6);
System.out.println(a.num);
//a.name就会报错,因为在上面的name是私有的
Music ceshi = new Music();//导入了不同的包中的类
// ceshi.BaoHu();报错,是在其它包里的protected方法
}
}
小结
访问成员有两种方式:一种是调用,即通过类或对象调用它的成员,如p.printX()语句;另一种是继承,即子类继承父类的成员变量和方法。在开发使用的时候,应该尽量限制类中成员的可见性
-
公有访问级别任何情况下两种方式都可以;(public)
-
默认访问级别在同一包中两种访问方式都可以,不能在包之外访问;()
-
保护访问级别在同一包中与默认访问级别一样,两种访问方式都可以。但是在不同包之
外只能继承访问;(protected)
-
私有访问级别只能在本类中通过调用方法访问,不能继承访问。(private)
感谢阅读!!!
才疏学浅,有不对的地方请指出。