一、封装性的概念
1、封装性是面向对象思想的三大特征之一。
2、封装就是隐藏实现细节,仅对外提供访问接口,是一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。
封装有这几类:
属性的封装、方法的封装、类的封装、组件的封装、模块化封装、系统级封装…
二、封装的好处与缺点
好处:
1、模块化:相互独立,良好的封装能够减少耦合,易于维护;
2、信息隐藏:隐藏细节,隐私更安全;
3、代码重用:直接调用,不必重复写相同的代码,减少时间;
4、插件化易于调试:统一管理,精确控制成员变量,更规范;
5、具有安全性:防止破坏,保护隐私。
坏处:
影响执行效率:层层套皮,安全的同时,也给代码或者程序的执行带来影响(因为要做的事更多了)。
三、如何进行封装
关键字:private(私有的)
之前定义类时,我们通常使用关键字public(公有的),表示共有的,公共的,可以直接调用;代码的编程是对现实世界的抽象解释,JAVA亦如此。
在现实生活中,我们一般有公有的公共设施,比如公园、大马路的路灯、大马路的垃圾桶,等等,可以直接使用。但也有些东西是私有的,比如公园便利店冰箱里面的一瓶水、你家里面新买的垃圾桶、你家卧室里面的灯,等等,是要经过你本人同意,或者与你合法交易的,一般来说就是私有的。
例如:
/**
封装性
如果属性没有封装,那么在本类之外创建对象后,可以直接访问属性
private关键字:访问权限修饰符 public表示公有的,private表示私有的
公有的属性和方法,可以被类外部的其它类访问
私有的属性或方法,只能在本类中访问,不可以被类外部的其他类访问
*/
public class test002{
public static void main(String[] args){
Person h = new Person();
h.name = "我是shy_boy"; //在没有使用private前,我可以调用类Person里的属性
h.age = 18;
System.out.println(h.name);
}
}
class Person{
String name;
int age;
}
结果是:
但此时我们的类Person,没有被封装起来,很容易被调用,或者直接暴力修改,安全性不高。
如果我把Person这个类,封装起来,仅能用我对外提供访问的接口来访问它,那安全性就大大提升了。
/**
封装性
如果属性没有封装,那么在本类之外创建对象后,可以直接访问属性
private关键字:访问权限修饰符 public表示公有的,private表示私有的
公有的属性和方法,可以被类外部的其它类访问
私有的属性或方法,只能在本类中访问,不可以被类外部的其他类访问
*/
public class test002{
public static void main(String[] args){
Person h = new Person();
h.name = "我是shy_boy"; //在使用private后,不可以调用类Person里的属性
h.age = 18;
System.out.println(h.name);
}
}
class Person{
private String name;
private int age;
}
结果是编译错误:
那么问题来了,怎么访问被封装过后的Person呢?通过getter和setter,设置一个接口方法,让别人访问。
/**
封装性
如果属性没有封装,那么在本类之外创建对象后,可以直接访问属性
private关键字:访问权限修饰符 public表示公有的,private表示私有的
公有的属性和方法,可以被类外部的其它类访问
私有的属性或方法,只能在本类中访问,不可以被类外部的其他类访问
通常在一个类中,属性都私有化,并对外提供getter 和 getter方法
*/
public class test002{
public static void main(String[] args){
Person h = new Person();
h.setName("我是shy_boy"); //在使用private后,不可以调用类Person里的属性
h.setAge(18);
System.out.println(h.getName()); //调用getName方法并输出name的值
}
}
class Person{
//属性是成员变量
private String name;
private int age;
//参数及方法内定义的变量是局部变量
//setter 对外提供一个为name属性设值的方法
public void setName(String name){
this.name = name; //就近原则,第二个name是setName()里面的name, this. :当前对象。 所以第一个name是对象h的name.
}
//getter 对外提供一个获取name属性的方法
public String getName(){
return name; //返回name的参数
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return age;
}
}
结果是:
四、成员变量和局部变量
1、在类中的位置不同
成员变量:在类中定义
局部变量:在方法中定义或者方法的参数
2、在内存中的位置不同
成员变量:在堆内存(成员变量属于对象,对象进堆内存)
局部变量:在栈内存(局部变量属于方法,方法进栈内存)
3、生命周期不同
成员变量:随着对象的创建而存在,随着对象的销毁而消失
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
4、初始化值不同
成员变量:有默认初始化值,引用类型默认为null
局部变量:没有默认初始化值,必须定义,赋值,然后才能使用
注意:
局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则。