5.1封装
封装是面向对象编程的三大特性之一(另外两个是继承和多态),其核心思想是将数据(属性)和行为(方法)捆绑在一个单元(类)中,并对外隐藏内部实现细节。通过封装,可以控制对类中数据的访问权限,防止外部代码直接修改内部状态,从而提高代码的安全性和可维护性。
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。
Java中主要通过类和访问权限来实现封装的:类可以将数据以及封装数据的方法结合在一起,而访问权限永安里控制方法或者字段能否直接在类外使用。并且提供了4中访问限定符。
5.2访问限定符
public: 是最开放的访问级别,被修饰的成员或类可以被任何其他类访问。
protected: 修饰的成员可以被同一包内的其他类访问,也可以被不同包中的子类访问。
default: 不使用任何访问修饰符时,成员或类具有包私有访问权限,只能在同一个包内访问。
private: 最严格的访问级别,被修饰的成员只能在定义它们的类内部访问。
修饰符 | 同类 | 同包 | 子类 | 不同包 |
---|---|---|---|---|
public | ✓ | ✓ | ✓ | ✓ |
protected | ✓ | ✓ | ✓ | ✗ |
default | ✓ | ✓ | ✗ | ✗ |
private | ✓ | ✗ | ✗ | ✗ |
说明:
- 优先使用最严格的访问级别,遵循最小权限原则
- 成员变量通常设为
private
,通过公共方法提供访问 - 仅在必要时使用
public
修饰类和方法 protected
主要用于需要被子类继承修改的成员- 包私有适用于只在包内使用的实现细节
例:
public class Computer {
private String cpu;
public String screen;
String brand;
//构造方法
public Computer(String cpu, String screen, String brand) {
this.cpu = cpu;
this.screen = screen;
this.brand = brand;
}
//提供公共方法
public String getCpu() {
return cpu;
}
public void setCpu(String cpu) {
this.cpu = cpu;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
}
public class Test {
public static void main(String[] args) {
Computer p1 = new Computer("i9","16g","2k","hw");
//System.out.println(p1.cpu);
System.out.println(p1.screen);
System.out.println(p1.brand);
}
}
以上代码只演示了private,public,default ;
注意:以上代码分为两个不同的类,如果在同一个类中,则可以调用main方法;一般情况下成员变量设为private,成员方法设置为public。
5.3封装的关键步骤
①使用访问修饰符
通过private,protected,public等修饰符控制访问权限
②提供公共方法(Getter/Setter)
通过公共方法 ( 如getCpu(),setCpu(......) ) 间接访问私有属性,可在方法中添加逻辑控制
③提供构造方法封装
通过构造方法初始化对象时,可以强制校验参数或限制创建条件。
5.4包的概念
包是对类,接口等的封装机制的体现。
作用:在同一个工程中,允许存在相同名称的类,同时提高代码的可维护性。
命名:通常采用反转域名的方式(.com.101.www)
包的目录结构:
src/
└── com/
└── example/
└── mypackage/
└── MyClass.java
①导入其他包的类或接口时使用 import
语句:
import java.util.List; // 导入单个类
import java.util.*; // 导入整个包(不推荐,可能引发冲突)
②通过 static import
直接导入类的静态成员(方法或字段):
import static java.lang.Math.PI;
System.out.println(PI); // 无需写 Math.PI
常用内置包示例:
java.lang
:核心类(自动导入,如String
、System
)。java.util
:集合框架(List
、Map
)。java.io
:输入输出流。java.net
:网络编程。