四、三大特性
封装
说到封装,基本上是个程序员都用过。我们在写一个方法的时候,不会将一个方法体写的特别长,
而是选择将方法拆解成好几个方法,将不同逻辑的方法进行封装。Java 的封装比一般的方法封装更加系统化一些。
概念:将类的成员变量隐藏在类的内部不允许外部程序直接访问,仅可通过该类提供的方法来实现对隐藏信息的操作和访问。
封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。要访问该类的代码和数据,必须通过严格的接口控制。封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。适当的封装可以让代码更容易理解和维护,也加强了代码的安全性。
优点:
- 良好的封装能够减少耦合;
- 类内部的结构可以自由修改;
- 可以对成员变量进行更精确的控制;
- 隐藏信息,实现细节
措施:
1、访问修饰符
访问修饰符 | 本类 | 本包 | 子类 | 其他 |
---|---|---|---|---|
private | Y | N | N | N |
默认 | Y | Y | N | N |
protected | Y | Y | Y | N |
public | Y | Y | Y | Y |
从 private 到 public ,封装性越来越差
2、this 关键字
使用 this 关键字是为了区别类提供的公共方法中对于函数参数和成员参数名的区别,如
public void setName(String name){
this.name = name;
}
3、Java 中的内部类
Java 内部类提供了更好的封装,可以将内部类隐藏在外部类之内,不允许同一个包中的其他类直接访问内部类。
根据内部类的实现方式,我们将内部类分为:成员内部类、静态内部类、方法内部类以及匿名内部类。内部类和接口的配合,很好地实现了多继承的效果。
成员内部类
成员内部类是最常见的内部类,代码如下:
public class OutterClass {
public String outterName = "OutterClass";
private String outterSecret = "outterSecret";
public static String method = "test";
public Integer age = 2;
public void test() {
// 外部类无法直接调用内部类的属性和方法
// System.out.println(innerName);
}
public class InnerClass{
public String innerName = "InnerClass";
private String innerSecret = "innersecret";
public Integer age = 1;
public void test() {
// 可以访问外部类的成员属性,public、private 修饰的都可以
System.out.println(outterName);
System.out.println(outterSecret);
// 内部类和外部类存在相同名称属性的情况
System.out.println(age);
System.out.println(this.age);
System.out.println(OutterClass.this.age);
}
}
public static void main(String[] args) {
OutterClass outterClass = new OutterClass();
// 通过实例化内部类的方式调用内部类方法,成员内部类没有 static 属性和方法
InnerClass innerClass = outterClass.new InnerClass();
innerClass.test();
}
}
从上面代码可以看到成员内部类的使用方法和注意事项:
- 成员内部类如同外部类的成员一样定义
- 成员内部类可以调用外部类的属性和方法,即便是 private 修饰的变量
- 外部类无法直接调用成员内部类的属性和方法,只能通过实例化成员内部类的方式调用