패키징은 말 그대로 패키징의 의미로 이해되며, 전문적인 점은 숨겨진 정보를 의미하며 추상적인 데이터 유형을 사용하여 데이터를 묶는 것과 데이터 기반 작업을 함께 사용하는 것을 의미합니다. 데이터는 추상 데이터 유형 내부에서 보호되어 내부 세부 정보를 최대한 숨기고 일부 외부 인터페이스만 유지하여 외부와 연결합니다. 시스템의 다른 개체는 데이터 외부에 래핑된 승인된 작업을 통해서만 이 캡슐화된 개체와 통신하고 상호 작용할 수 있습니다. 즉, 사용자는 객체의 내부 내용을 알 필요는 없지만(물론 알 수 있는 방법은 없지만) 객체가 제공하는 인터페이스를 통해 객체에 접근할 수 있다.
캡슐화의 경우 객체는 자체 속성과 메서드를 캡슐화하므로 다른 객체에 의존하지 않고 자체 작업을 완료할 수 있습니다. ㅋㅋㅋ 끄기 1. 결합으로 인해 캡슐화를 줄일 수 있습니다.
2. 클래스 내부 구조는 자유롭게 변경할 수 있습니다.
3. 회원을 더욱 정확하게 관리할 수 있습니다.
4. 정보를 숨기고 세부정보를 구현합니다.
��
위의 두 가지에서 예시를 보면 Husband의 wife 참조에는 getter()가 없고, wife's age에는 getter() 메서드가 없는 것을 알 수 있습니다. 그 이유는 남자들은 아내를 깊은 집에 숨기고, 여자는 자신의 나이를 다른 사람에게 알리고 싶어하지 않는다는 사실은 누구나 다 알고 있을 것입니다.
따라서 캡슐화는 객체의 속성을 사유화하고 외부 세계에서 액세스할 수 있는 속성에 대한 몇 가지 메서드를 제공합니다. 외부 메서드로 액세스하고 싶지 않으면 외부 액세스를 위한 메서드를 제공할 필요가 없습니다. 그러나 클래스가 외부 액세스를 위한 메서드를 제공하지 않으면 이 클래스는 의미가 없습니다. 예를 들어, 우리는 집을 물건으로 간주합니다. 소파, TV 시리즈, 에어컨, 티 테이블 등과 같은 내부의 아름다운 장식은 집의 사유 재산입니다. 차단하면 다른 사람들이 한눈에 볼 수 있습니다. 아무것도 남지 않은 경우는 어떻습니까? 프라이버시가 전혀 없습니다! 그 차폐벽을 통해 우리는 우리만의 프라이버시를 가질 수 있고, 다른 사람에게 영향을 주지 않고 마음대로 내부 가구를 바꿀 수 있습니다. 하지만 문도 없고 창문도 없다면 촘촘하게 포장된 블랙박스는 무슨 의미가 있을까? 그러므로 다른 사람들도 문과 창문을 통해 내부의 풍경을 볼 수 있습니다. 따라서 문과 창문은 외부 세계에 접근할 수 있도록 남겨진 집 개체의 인터페이스입니다. 이를 통해 우리는 캡슐화의 이점을 제대로 인식할 수 없습니다. 이제 프로그램 관점에서 캡슐화의 이점을 분석합니다. 캡슐화를 사용하지 않으면 객체에 setter() 및 getter()가 없으므로 Husband 클래스는 다음과 같이 작성되어야 합니다.
public class Husband {
/*
* 对属性的封装
* 一个人的姓名、性别、年龄、妻子都是这个人的私有属性
*/
private String name ;
private String sex ;
private int age ;
private Wife wife;
/*
* setter()、getter()是该对象对外开发的接口
*/
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void setWife(Wife wife) {
this.wife = wife;
}
}
하지만 그날 Husband를 수정해야 한다면, 예를 들어 age를 문자열 유형으로 변경해야 한다면 어떻게 될까요? 이 클래스를 한 곳에서만 사용해도 괜찮습니다. 그런 곳이 수십, 심지어 수백 개라면 크래시로 바꾸실 건가요? 캡슐화를 사용하면 어떤 수정도 필요하지 않습니다. Husband 클래스의 setAge() 메서드만 약간 변경하면 됩니다.
public class Husband {
/*
* 对属性的封装
* 一个人的姓名、性别、年龄、妻子都是这个人的私有属性
*/
private String name ;
private String sex ;
private String age ; /* 改成 String类型的*/
private Wife wife;
public String getAge() {
return age;
}
public void setAge(int age) {
//转换即可
this.age = String.valueOf(age);
}
/** 省略其他属性的setter、getter **/
}
其他的地方依然那样引用(husband.setAge(22))保持不变。
到了这里我们确实可以看出,封装确实可以使我们容易地修改类的内部实现,而无需修改使用了该类的客户代码。
我们在看这个好处:可以对成员变量进行更精确的控制。
还是那个Husband,一般来说我们在引用这个对象的时候是不容易出错的,但是有时你迷糊了,写成了这样:
Husband husband = new Husband();
husband.age = 300;
也许你是因为粗心写成了,你发现了还好,如果没有发现那就麻烦大了,逼近谁见过300岁的老妖怪啊!
但是使用封装我们就可以避免这个问题,我们对age的访问入口做一些控制(setter)如:
public class Husband {
/*
* 对属性的封装
* 一个人的姓名、性别、年龄、妻子都是这个人的私有属性
*/
private String name ;
private String sex ;
private int age ; /* 改成 String类型的*/
private Wife wife;
public int getAge() {
return age;
}
public void setAge(int age) {
if(age > 120){
System.out.println("ERROR:error age input...."); //提示錯誤信息
}else{
this.age = age;
}
}
/** 省略其他属性的setter、getter **/
}
上面都是对setter方法的控制,其实通过使用封装我们也能够对对象的出口做出很好的控制。例如性别我们在数据库中一般都是已1、0方式来存储的,但是在前台我们又不能展示1、0,这里我们只需要在getter()方法里面做一些转换即可。
public String getSexName() {
if("0".equals(sex)){
sexName = "女";
}
else if("1".equals(sex)){
sexName = "男";
}
else{
sexName = "人妖???";
}
return sexName;
}
在使用的时候我们只需要使用sexName即可实现正确的性别显示。同理也可以用于针对不同的状态做出不同的操作。
public String getCzHTML(){
if("1".equals(zt)){
czHTML = "<a>启用</a>";
}
else{
czHTML = "<a>禁用</a>";
}
return czHTML;
}
鄙人才疏学浅,只能领悟这么多了,如果文中有错误之处,望指正,鄙人不胜感激!
위 내용은 Java의 세 가지 주요 기능에 대한 캡슐화 예제에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!