2학년 때 자바를 접한지 거의 3년이 되어갑니다. 가장 기본적인 HTML과 CSS부터 최종 SSH까지 단계별로 진행하면서 기쁘기도 하고, 실망하기도 하고, 외로웠어요. 그는 중도 승려 임에도 불구하고 자신의 노력으로 '공부'를 완성했습니다. 이 기간 동안 훈련기관에 참여했지만 그런 훈련 방법이 너무 마음에 들지 않아 포기하고 독학을 선택했습니다(불쌍하게도 6,000위안을 지불했습니다). 그게 더 재미있었어요. 노력과 이득은 오직 당신 자신이 알잖아요. Huang Tian은 열심히 일했지만 나는 바보입니다. 4학년 첫 학기에 그는 마침내 혼자서 Java를 완성했고(그는 우회하여 반년을 낭비했습니다) 그것으로 좋은 직업을 얻었습니다. 당신은 정말!
가십이 너무 많아요! 화제가 되면서 LZ는 최근 디자인 패턴 리딩을 마쳤으며 많은 소감을 전하고 있습니다. 그리고 작업 과정에서 Java의 기초가 충분히 견고하지 않다는 것을 깊이 느낍니다. 예를 들어 IO에 익숙하지 않고, 가비지 수집, 다형성, 반사를 이해하지 못하고 가장 기본적인 세 가지 기능조차 혼동됩니다. 나! 그래서 나는 Java 기초를 보충하기로 결심했습니다! 첫 번째 강의부터---Encapsulation!!!!!!
3대 특징 중 하나---Encapsulation
Encapsulation은 말 그대로 포장을 뜻하며, 전문적인 포인트는 정보 은폐, 추상 데이터 유형을 사용하여 데이터 및 데이터 기반 작업을 캡슐화하여 분리할 수 없는 독립적인 엔터티를 형성하는 것을 의미합니다. 데이터는 추상 데이터 유형 내부에서 보호되어 내부 세부 정보를 최대한 숨기고 일부 외부 인터페이스만 유지합니다. 외부 세계와 소통합니다. 시스템의 다른 개체는 데이터 외부에 래핑된 승인된 작업을 통해서만 이 캡슐화된 개체와 통신하고 상호 작용할 수 있습니다. 즉, 사용자는 객체의 내부 내용을 알 필요는 없지만(물론 알 수 있는 방법은 없지만) 객체가 제공하는 인터페이스를 통해 객체에 접근할 수 있다.
캡슐화의 경우 객체는 자체 속성과 메서드를 캡슐화하므로 다른 객체에 의존하지 않고 자체 작업을 완료할 수 있습니다.
캡슐화를 사용하면 세 가지 주요 이점이 있습니다.
1. 좋은 캡슐화는 결합을 줄일 수 있습니다.
2. 클래스 내부 구조는 자유롭게 변경할 수 있습니다.
3. 회원을 더욱 정확하게 관리할 수 있습니다.
4. 정보를 숨기고 세부정보를 구현합니다.
먼저 두 클래스를 살펴보겠습니다: Husband.java, Wife.java
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의 wife 참조에는 getter가 없음을 알 수 있습니다. (), 그리고 동시에 아내의 나이에 대한 getter() 메소드가 없습니다. 그 이유는 남자가 아내를 깊은 집에 숨기고, 여자는 자신의 나이를 다른 사람이 알기를 원하지 않는다는 사실은 누구나 다 알고 있을 것입니다.
따라서 캡슐화는 객체의 속성을 사유화하고 외부 세계에서 액세스할 수 있는 속성에 대한 몇 가지 메서드를 제공합니다. 외부 메서드에서 액세스하지 않으려면 메서드를 제공할 필요가 없습니다. 외부 접근을 위해. 그러나 클래스가 외부 액세스를 위한 메서드를 제공하지 않으면 이 클래스는 의미가 없습니다. 예를 들어, 우리는 집을 물건으로 간주합니다. 소파, TV 시리즈, 에어컨, 티 테이블 등과 같은 내부의 아름다운 장식은 집의 사유 재산입니다. 차단하면 다른 사람들이 한눈에 볼 수 있습니다. 아무것도 남지 않은 경우는 어떻습니까? 프라이버시가 전혀 없습니다! 그 차폐벽을 통해 우리는 우리만의 프라이버시를 가질 수 있고, 다른 사람에게 영향을 주지 않고 마음대로 내부 가구를 바꿀 수 있습니다. 하지만 문도 없고 창문도 없다면 촘촘하게 포장된 블랙박스는 무슨 의미가 있을까? 그러므로 다른 사람들도 문과 창문을 통해 내부의 풍경을 볼 수 있습니다. 따라서 문과 창문은 외부 세계에 접근할 수 있도록 남겨진 집 개체의 인터페이스입니다.
이를 통해 우리는 캡슐화의 이점을 제대로 인식할 수 없습니다. 이제 프로그램 관점에서 캡슐화의 이점을 분석합니다. 캡슐화를 사용하지 않으면 객체에 setter() 및 getter()가 없으며 Husband 클래스는 다음과 같이 작성되어야 합니다:
public class Wife { private String name; private int age; private String sex; private Husband husband; 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 void setAge(int age) { this.age = age; } public void setHusband(Husband husband) { this.husband = husband; } public Husband getHusband() { return husband; } }
다음과 같이 사용해야 합니다:
public class Husband { public String name ; public String sex ; public int age ; public Wife wife; }
하지만 그날 Husband를 수정해야 한다면, 예를 들어 age를 문자열 유형으로 변경하면 어떨까요? 이 클래스를 한 곳에서만 사용해도 괜찮습니다. 그런 곳이 수십, 심지어 수백 개라면 크래시로 바꾸실 건가요? 캡슐화를 사용하면 어떤 수정도 필요하지 않습니다. Husband 클래스의 setAge() 메서드만 약간 변경하면 됩니다. }
Husband husband = new Husband(); husband.age = 30; husband.name = "张三"; husband.sex = "男"; //貌似有点儿多余
다른 곳에서는 여전히 참조(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 href='javascript:void(0)' onclick='qy("+id+")'>启用</a>"; } else{ czHTML = "<a href='javascript:void(0)' onclick='jy("+id+")'>禁用</a>"; } return czHTML; }
鄙人才疏学浅,只能领悟这么多了,如果文中有错误之处,望指正,鄙人不胜感激!
以上就是 java提高篇(一)-----理解java的三大特性之封装的内容,更多相关内容请关注PHP中文网(www.php.cn)!