三大特性之浅谈 封装
英语: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将其构造器给私有化了,不能直接访问。
在其它包访问,就会报错,因为在Music里面这个BaoHu的方法用的是protected修饰的。
其实在Idea写代码时候,定义的属性之类可以在左下角有个概览,可以查看是什么类型的
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)