封装
为何要封装?
1.安全
2.复用代码
3.隐藏内部细节,只对外暴露你想让用户使用的东西
哪里可以用到封装?
1.属性封装
实体类中存有age这一属性,我们不想让它随意地被外界直接调用和赋值,所以把它以private修饰。但是外界需要用到这一属性,所以我们添加了get和set方法,以供外界调用。但是,众所周知,人的年龄在[0,150]这个区间内,超出这个年龄的就是非法值。如果set方法得到了一个非法值怎么办?所以在setAge方法中添加了条件判断,超出[0,150]的范围,将age置为0
/**
* 用户年龄
*/
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
if(0>age || 150<age){
this.age = 0;
}
this.age = age;
}
2.方法封装
有一个代码块,用以完成特定的求和功能,此时我们就可以把这段代码写在方法内,需要调用时用方法名add就可调用这个代码块,便利,又可复用
public int add(int a, int b){
return a+b;
}
3.构造方法封装
我们创建了一个类,由于某种原因,我们不想让外界能够直接地创建它的对象,并且,只允许创建一个对象
//私有构造方法
private Test(){
}
//创建test,置为null
private static Test test = null;
//创建公有静态方法供外界调用
public static Test createTest(){
//在创建对象之前进行检查,如果test为空,给予创建,否则不创建
if(test == null){
test = new Test();
}
return test;
}
经过以上的对构造方法的封装,外界只可通过createTest方法创建Test类的对象,并且只可创建一次,我们来检查一下
Test t1 =Test.createTest();
Test t2 = Test.createTest();
我们使用createTest方法创建了两个Test类的对象 t1 和 t2,但真的是两个对象吗?
看下图,这是Debug模式下的变量表,t1和t2的地址是相同的,也就是说,他们指向堆内存中的同一对象。由此可见,我们对构造方法的封装目的达到了!
5.类封装
通常项目中的核心代码,需要提高其的安全性,会使用内部类,对其进行高封装。
车中最核心的部分莫过于引擎,我们在创建Car之后,将引擎部分封装为类Engine
public class Car {
private String brand;
private String color;
public Car(String brand, String color) {
this.brand = brand;
this.color = color;
}
public class Engine{
//转速
private int speed;
public Engine(int speed) {
this.speed = speed;
}
/**
* 启动引擎
*/
public void launch(){
System.out.println(brand+"引擎正在启动");
System.out.println("转速是"+speed);
}
}
/**
* 车启动的时候调用引擎的launch()方法
*/
public void start(int speed){
System.out.println(brand+"引擎正在启动...");
System.out.println("转速是"+speed);
}
}
调用内部类Engine时,只可以通过外部类对象来调用,直接创建会报编译错误!
//创建外部类对象
//第一种写法
Car car = new Car("宝马","黑色");
//使用外部类对象,创建内部类对象
Car.Engine e1 = car.new Engine(20);
e1.launch;
//第二种写法
Car.Engine e2 = new Car("奔驰","白色").new Engine(10);
e2.launch;
内部类博大精深,分为:局部内部类、静态内部类、成员内部类、匿名内部类
如果理解不了可以先放着
以上就是封装的基本思想和方法
总结一下
比如我们使用的电脑,制造商只暴露给我们开机键,USB接口和充电接口,其他的我们无需知道的内部细节,厂商为了安全和避免不必要的麻烦,全部封装了起来。
封装思想也是如此!只给外界看你想给他看的,只给外界用你想给他用的,其他的一切,全部封装起来!
如有错误,感谢指出!