java 封装是什么?
在面向对象程式设计方法中,封装(英语:Encapsula ti on)是指一种将抽象性函式 接口 的实现细节部份 包装 、隐藏起来的方法。
封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。
要访问该类的代码和数据,必须通过严格的接口控制。
封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。
适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。
封装的优点
1. 良好的封装能够减少 耦合 。
2. 类内部的结构可以自由修改。
3. 可以对成员变量进行更精确的控制。
4. 隐藏信息,实现细节。
Java面向对象的封装
封装是Java面向对象的三大特性之一,通常我们是通过包管理机制同时对类进行封装,隐藏其内部实现细节,通常开发中不允许直接操作类中的成员属性,所以属性一般设置为私有权限priva te ,类中一般会给出一些公共方法来让使用者通过特定方法读取或者操作里面的数据,避免误操作从而保证了数据的安全。
封装步骤一般分为3步,第一步首先修改属性的可见性,即将其设置为private;第二步创建getter/setter方法,用于获取/设置属性值,就是用来读写属性,eclipse中也提供了直接生成变量操作方法的菜单,选择菜单中的Source-》Generate Gette rs and Setters.。。系统就会自动识别属性,我们可以选择创建;第三步是在getter/setter方法中加入属性控制,控制传入参数的合法性,保证数据安全。
简单示例如下:
public class Hello {
private float screen;
private float w idt h;
private float height;
public float getScreen(){
return screen;
}
public void setScreen(float screen){
screen = screen;
}
}
那么我们读写Hello中screen属性是,可以使用我们定义的getScreen和setScreen来进行读和写,这就简单的实现的封装
当然我们在其他方法中也可以对需要的属性进行修改,但是我们专门用于实现读写逻辑时使用getter/setter方法是一个约定俗成的编程习惯
访问修饰符
前面的访问修饰符除了private和public之外,还有protected,还可以什么都不写,他们的权限关系如下图所示:
我们一般对类内部的属性使用private,这个属性保护最强,保护最弱的就是public属性,最常用的属性也就是public和private,访问修饰符一般放在成员最前面。
this关键字
上面的实例中,setScreen方法中的赋值语句,我么使用了screen = screen;这样虽然没什么错误,但编译器会给出警告,原因是方法参数和成员属性名一样,有可能导致混淆,为了区分本类中的属性和参数我们一般使用this关键字,即this.screen = screen;普通方式调用本类中的方法名除了直接写方法之外推荐使用this.func();这种形式调用本类中的方法
Java内部类
Java内部类就是定义在一个类内部的类,包含这个内部类的类就称为外部类
内部类可以实现更好的封装,把内部类隐藏在外部类之中,同一个包中也无法使用
内部类的方法可以直接访问外部类的所有属性,包括私有的
内部类实现的所有功能单类都可以实现,只是有些时候有了内部类更方便一些
内部类分为:成员内部类、静态内部类、方法内部类、匿名内部类
1、成员内部类
成员内部类也就是普通内部类,可以直接访问外部类中的所有成员,不用担心任何权限问题;
但是外部方法不能直接访问成员内部类中的属性或者方法,比如外部类名HelloWorld,内部类名Inner,外部类方法访问内部类成员的方法为:
HelloWorld he = new HelloWorld();
Inner in = he.new Inner();
或者直接用
Inner in = HelloWorld.new Inner();
然后通过in.属性/方法,就可以访问成员内部类了,当编译程序后,会生成2个class文件,一个是内部类生成的,一个是外部类生成的
外部类编译文件名为:HelloWorld.class 注意内部类编译文件名为:HelloWorld$Inner.class
另外内部类和外部类具有相同的成员变量和方法的时候,内部类根据就近原则优先访问自己类中的成员,要想访问外部类中的,需要使用this.成员来实现
2、静态内部类
静态内部类不能像成员内部类一样直接访问外部类中的非静态成员,可以通过new 外部类()。成员来实现访问
静态内部类访问外部类静态成员可以直接使用成员名来访问,重名的话使用下一句的方法访问
如果外部类静态成员和内部类成员重名(注意不仅仅是静态成员),那么可以直接访问内部成员,外部静态成员访问使用 类名。成员 来访问
在外部类中创建静态内部类的对象时,不需要成员内部类那样需要先实例化外部对象,可以直接 内部类 对象名 = new 内部类();来创建内部类的对象
3、方法内部类
方法内部类,就是内部类的定义位置是在外部类的方法中,这个不用考虑太复杂,方法内部类只在该方法内部可见,所以一句话只能在方法内部使用
方法内部使用很简单,直接用 内部类 对象名 = new 内部类();就可以访问内部类成员了
因为方法内部类不能在所属方法以外任何地方访问,因此方法内部类不能使用访问控制符和sta TI c关键字,简单的写法如下:
public class Hello {
public void show(){
//定义方法内部类,不加任何修饰符
class MI nner{
//方法内部类成员,需要加访问修饰符
int a = 3;
public int getA(){
return a + 6;
}
}
//创建方法内部类对象
MInner mi = new MInner();
//调用方法内部类方法
int score = mi.getA();
System.out.println(“调用结果:” + score);
}
public sta TI c void m ai n(String[] args){
// 测试 方法内部类
Hello mo = new Hello();
mo.show();
}
}
通过这个例子,就容易看出方法内部类的使用了
4、匿名内部类
匿名内部类就是没有名字的内部类,只能使用一次,通常连贯起来,用来简化代码的书写,匿名内部类必须继承一个父类或者实现一个接口,后面记录面向对象的继承和多态的时候会提到,这里就不细说了