一、什么是封装?
把客观事物封装成抽象的类,并且类可以把自己的属性和方法只让可信的类或者对象进行操作,对不可信的类或者对象隐藏。通俗就是信息封装起来,只能给自己相信的人看。
封装(Encapsulation)是面向对象编程(OOP)中的一个基本概念,它指的是将对象的状态(数据)和行为(方法)绑定在一起,并对外隐藏对象的内部细节。
在Java中,封装通过使用访问修饰符(如
private
、protected
和public
)来实现,这些修饰符控制类的成员(变量和方法)的可见性和访问级别。
二、封装的分类
属性的封装:只需要使用private(私有)关键字修饰的属性,而且只能在类中使用。
方法的封装:对于方法的封装,将内部可以访问方法设置为public,将内部不能访问的方法设置为private。
1.类的封装
这是最常见的封装形式,通过定义类来封装数据和行为。类中的属性通常被设置为
private
,并通过public
的 getter 和 setter 方法提供对属性的访问和修改。
2.包的封装
Java 通过包(Package)组织类和接口,实现更高层次的封装。包可以将功能相关的类组织在一起,并通过访问修饰符(如
default
和protected
)限制其他包对类成员的访问权限。
// 文件路径:util/ArrayList.class
package util;
public class ArrayList {
// 实现细节...
}
3.子包与并发封装
在复杂的项目中,包可以进一步划分为子包以增强封装性。
// 文件路径:util/concurrent/ConcurrentHashMap.class
package util.concurrent;
//在引用中提到的 concurrent 子包用于处理多线程任务,其中包含了 ConcurrentHashMap 和 Executors 等类。
public class ConcurrentHashMap {
// 并发操作的具体实现...
}
好处:通过子包的划分,可以更好地管理类之间的依赖关系并提升代码的可读性和安全性
4.浏览器组件封装
了解了解即可...
在一些特定的应用场景中,Java 提供了对浏览器组件的封装能力,如 JDIC(Java Desktop Integration Components)项目。它允许 Java 应用程序与本地桌面环境集成,包括嵌入浏览器组件等功能。
// 示例:启动本地浏览器
import org.jdesktop.jdic.desktop.Desktop;
import org.jdesktop.jdic.desktop.InvocationException;
public class BrowserLauncher {
public static void openWebPage(String url) {
try {
Desktop.getDesktop().browse(new URI(url));
} catch (Exception e) {
e.printStackTrace();
}
}
}
此处,类封装主要适用于需要深度整合操作系统功能的桌面应用程序开发。了解即可。
5.接口与抽象类的封装
接口和抽象类是另一种高级封装形式,它们通过定义通用的行为规范,隐藏具体实现细节。
public interface Animal {
void eat();
}
public class Dog implements Animal {
public void eat() {
System.out.println("这只狗狗在吃东西");
}
}
接口和抽象类的封装使代码更加灵活,便于后期扩展和维护。
三、封装的使用
实现封装的方式:
1.声明私有变量:使用 private
修饰符来限制对类成员变量的直接访问。
2.提供公共方法:通过提供 public
方法(getter 和 setter)来允许外部访问和修改私有变量。
实例:
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age > 0 && age < 150) {
this.age = age;
} else {
System.out.println("年龄输入错误");
}
}
}
在这个例子中是最普通的类的封装,其中name
和 age
变量被声明为 private
,这意味着它们只能在 Person
类内部访问。为了允许外部代码访问这些变量,提供了 getName()
、setName()
、getAge()
和 setAge()
方法。
四、封装的优点
-
数据隐藏:通过限制对类成员的直接访问,可以防止外部代码意外或恶意地修改对象的状态。
-
增强安全性:通过提供受控的访问方法,可以确保数据的有效性和一致性。
-
简化调试:由于对象的状态变化被限制在类的内部,因此更容易跟踪和调试问题。