Java提高篇 —— Java三大特性之封裝

?

一、封裝

?

? ? ? ?封裝從字面上來理解就是包裝的意思,專業點就是信息隱藏,是指利用抽象數據類型將數據和基于數據的操作封裝在一起,使其構成一個不可分割的獨立實體,數據被保護在抽象數據類型的內部,盡可能地隱藏內部的細節,只保留一些對外接口使之與外部發生聯系。系統的其他對象只能通過包裹在數據外面的已經授權的操作來與這個封裝的對象進行交流和交互。也就是說用戶是無需知道對象內部的細節(當然也無從知道),但可以通過該對象對外的提供的接口來訪問該對象。

? ? ? ?對于封裝而言,一個對象它所封裝的是自己的屬性和方法,所以它是不需要依賴其他對象就可以完成自己的操作。

使用封裝的好處:

? ? ? ?1、良好的封裝能夠減少耦合。

? ? ? ?2、類內部的結構可以自由修改。

? ? ? ?3、可以對成員進行更精確的控制。

? ? ? ?4、隱藏信息,實現細節。

?

首先我們先來看兩個類:

Husband.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;}
}

Wife.java?

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;}}

? ? ? ?從上面兩個實例我們可以看出Husband里面wife引用是沒有getter()的,同時wife的age也是沒有getter()方法的。至于理由我想各位都懂的,男人嘛深屋藏嬌妻嘛,沒有那個女人愿意別人知道她的年齡。

? ? ? ?所以封裝把一個對象的屬性私有化,同時提供一些可以被外界訪問的屬性的方法,如果不想被外界方法,我們大可不必提供方法給外界訪問。但是如果一個類沒有提供給外界訪問的方法,那么這個類也沒有什么意義了。比如我們將一個房子看做是一個對象,里面的漂亮的裝飾,如沙發、電視劇、空調、茶桌等等都是該房子的私有屬性,但是如果我們沒有那些墻遮擋,是不是別人就會一覽無余呢?沒有一點兒隱私!就是存在那個遮擋的墻,我們既能夠有自己的隱私而且我們可以隨意的更改里面的擺設而不會影響到其他的。但是如果沒有門窗,一個包裹的嚴嚴實實的黑盒子,又有什么存在的意義呢?所以通過門窗別人也能夠看到里面的風景。所以說門窗就是房子對象留給外界訪問的接口。

? ? ? ?通過這個我們還不能真正體會封裝的好處。現在我們從程序的角度來分析封裝帶來的好處。如果我們不使用封裝,那么該對象就沒有setter()和getter(),那么Husband類應該這樣寫:

public class Husband {public String name ;public String sex ;public int age ;public Wife wife;
}

? ? ? ?我們應該這樣來使用它:

Husband husband = new Husband();husband.age = 30;husband.name = "張三";husband.sex = "男";    //貌似有點兒多余

? ? ? ?但是那天如果我們需要修改Husband,例如將age修改為String類型的呢?你只有一處使用了這個類還好,如果你有幾十個甚至上百個這樣地方,你是不是要改到崩潰。如果使用了封裝,我們完全可以不需要做任何修改,只需要稍微改變下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即可實現正確的性別顯示。

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/446959.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/446959.shtml
英文地址,請注明出處:http://en.pswp.cn/news/446959.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

sqlite3的backup和restore函數的使用

參考代碼 第一段這個親測可以使用 #include <sqlite3.h> #include <iostream> /* ** Perform an online backup of database pDb to the database file named ** by zFilename. This function copies 5 database pages from pDb to ** zFilename, then unlocks pD…

Java提高篇 —— Java三大特性之繼承

一、前言 在《Think in java》中有這樣一句話&#xff1a;復用代碼是Java眾多引人注目的功能之一。但要想成為極具革命性的語言&#xff0c;僅僅能夠復制代碼并對加以改變是不夠的&#xff0c;它還必須能夠做更多的事情。在這句話中最引人注目的是“復用代碼”,盡可能的復用代碼…

Java提高篇 —— Java三大特性之多態

一、前言 面向對象編程有三大特性&#xff1a;封裝、繼承、多態。 封裝&#xff1a;隱藏了類的內部實現機制&#xff0c;可以在不影響使用的情況下改變類的內部結構&#xff0c;同時也保護了數據。對外界而已它的內部細節是隱藏的&#xff0c;暴露給外界的只是它的訪問方法。 繼…

光盤刻錄制作Ubuntu等操作系統的啟動盤

前提條件 軟媒刻錄 空白光盤&#xff08;至少4.7G&#xff09;電腦&#xff08;最好使用外置的光驅&#xff09;系統鏡像&#xff08;ISO格式&#xff09; 具體操作 打開軟媒魔方選擇光盤刻錄按照標紅的進行選擇選擇鏡像->選擇或者拖拽都可以選擇刻錄機->如果使用外部刻…

Java提高篇 —— 抽象類與接口

一、前言 接口和內部類為我們提供了一種將接口與實現分離的更加結構化的方法。 抽象類與接口是java語言中對抽象概念進行定義的兩種機制&#xff0c;正是由于他們的存在才賦予java強大的面向對象的能力。他們兩者之間對抽象概念的支持有很大的相似&#xff0c;甚至可以互換&…

C++ const相關內容學習

const 作用 修飾變量&#xff0c;說明變量不可以被修改修飾指針&#xff0c;分為指向常量的指針&#xff08;pointer to const&#xff09;和自身是常量的指針&#xff08;常量指針&#xff0c;const pointer&#xff09;修飾引用&#xff0c;指向常量的引用&#xff08;refe…

Java提高篇 —— Java淺拷貝和深拷貝

一、前言 我們知道在Java中存在這個接口Cloneable&#xff0c;實現該接口的類都會具備被拷貝的能力&#xff0c;同時拷貝是在內存中進行&#xff0c;在性能方面比我們直接通過new生成對象來的快&#xff0c;特別是在大對象的生成上&#xff0c;使得性能的提升非常明顯。然而我們…

openssl里面AES算法主要函數的參數的介紹

注意事項 使用API的時候&#xff0c;需要特別小心數據長度&#xff0c;一般沒有指定長度的參數&#xff0c;默認都是16&#xff08;AES_BLOCK_SIZE&#xff09;個字節。輸出數據的長度一般都是16字節的倍數&#xff0c;否則會出現數組越界訪問。以下API中&#xff0c;encrypt表…

Java提高篇 —— Java內部類詳解

一、簡介 內部類是一個非常有用的特性但又比較難理解使用的特性。 內部類我們從外面看是非常容易理解的&#xff0c;無非就是在一個類的內部在定義一個類。 public class OuterClass {private String name ;private int age;public String getName() {return name;}public voi…

Ubuntu修改界面的大小

命令 xrandr 就會顯示ubuntu支持的屏幕比例使用命令 xrandr --size 1680x1050 切換屏幕大小

Java提高篇 —— String緩沖池

一、String緩沖池 首先我們要明確&#xff0c;String并不是基本數據類型&#xff0c;而是一個對象&#xff0c;并且是不可變的對象。查看源碼就會發現String類為final型的&#xff08;當然也不可被繼承&#xff09;&#xff0c;而且通過查看JDK文檔會發現幾乎每一個修改String對…

C++最新使用開源openssl實現輸入是文件,輸出是文件的AES加解密的代碼

AES.h頭文件 #include <cstring> #include <fstream> #include <iostream> #include <openssl/aes.h>//AES文件加密函數 int aes_encrypt_file(const std::string &original_backup_file_path,const std::string &encrypted_file_path,const …

Java基礎 —— JVM內存模型與垃圾回收

目錄一、概述二、運行時數據區方法區運行時常量池堆棧本地方法棧程序計數器三、對象訪問四、垃圾回收如何定義垃圾1、引用計數法2、可達性分析垃圾回收方法1、Mark-Sweep標記-清除算法2、Copying復制算法3、Mark-Compact標記-整理算法4、Generational Collection 分代收集垃圾收…

Report Design

ERP_ENT_STD-CSDN博客

規范化流程化提交自己代碼到遠程gitlab服務器

流程 進入到build目錄使用make命令進行編譯 make -j 6&#xff0c;前提是cmake命令已經執行../format.py rungit add .. 添加文件git checkout -b xxx 創建xxx分支&#xff0c;其中xxx是分支名字git branch 查看分支git commit -m "[chy/backup] modify parameters for…

Java提高篇 ——Java注解

目錄一、注解注解的定義注解的應用元注解RetentionDocumentedTargetInheritedRepeatable注解的屬性Java 預置的注解DeprecatedOverrideSuppressWarningsSafeVarargsFunctionalInterface二、注解的提取三、注解與反射四、注解的使用場景五、親手自定義注解完成某個目的六、注解應…

linux使用openssl查看文件的md5數值

代碼 #include <stdio.h> #include <openssl/md5.h>std::string get_file_md5(const char *path){unsigned char digest [MD5_DIGEST_LENGTH];std::ifstream file(path, std::ios::in | std::ios::binary); //打開文件MD5_CTX md5_ctx;MD5_Init(&md5_ctx);cha…

Android 性能優化四個方面總結

目錄一、四個方面二、卡頓優化1、Android系統顯示原理2、卡頓根本原因3、性能分析工具&#xff08;1&#xff09;Profile GPU Rendering&#xff08;2&#xff09;TraceView&#xff08;3&#xff09;Systrace UI 性能分析4、優化建議&#xff08;1&#xff09;布局優化&#x…

pycharm/clion/idea等產品多含代碼左移右移操作

左移 選中多行代碼后&#xff0c;按下Tab鍵&#xff0c;一次縮進四個字符 右移 鼠標選中多行代碼后&#xff0c;同時按住shiftTab鍵&#xff0c;一次左移四個字符

Android 開源框架選擇

目錄一、前言二、APP的整體架構三、技術選型的考量點四、日志記錄能力五、JSON解析能力1、gson2、jackson3、Fastjson4、LoganSquare六、數據庫操作能力1、ActiveAndroid2、ormlite3、greenDAO4、Realm七、網絡通信能力1、android-async-http2、OkHttp3、Volley4、Retrofit八、…