Java封裝的實(shí)現(xiàn)訪問(wèn)限定符、包
一. 封裝
封裝是面向?qū)ο蟮娜筇匦灾唬?strong>面向?qū)ο蟪绦蛉筇匦裕悍庋b、繼承、多態(tài) 。
封裝:將數(shù)據(jù)和操作數(shù)據(jù)的方法進(jìn)行有機(jī)結(jié)合,隱藏對(duì)象的屬性和實(shí)現(xiàn)細(xì)節(jié),僅對(duì)外公開(kāi)接口來(lái)和對(duì)象進(jìn)行交互(簡(jiǎn)單來(lái)說(shuō)就是套殼屏蔽細(xì)節(jié))。
用生活中的實(shí)物來(lái)理解封裝,比如電腦:
對(duì)于電腦這樣一個(gè)復(fù)雜的設(shè)備,提供給用戶(hù)的就只是:開(kāi)關(guān)機(jī)、通過(guò)鍵盤(pán)輸入,顯示器,USB插孔等,讓用戶(hù)來(lái)和計(jì)算機(jī)進(jìn)行交互,完成日常事務(wù)。
但實(shí)際上:電腦真正工作的卻是CPU、顯卡、內(nèi)存等一些硬件元件。對(duì)于計(jì)算機(jī)使用者而言,不用關(guān)心內(nèi)部核心部件,比如主板上線路是如何布局的,CPU內(nèi)部是如何設(shè)計(jì)的等,用戶(hù)只需要知道,怎么開(kāi)機(jī)、怎么通過(guò)鍵盤(pán)和鼠標(biāo)與計(jì)算機(jī)進(jìn)行交互即可。因此計(jì)算機(jī)廠商在出廠時(shí),在外部套上殼子,將內(nèi)部實(shí)現(xiàn)細(xì)節(jié)隱藏起來(lái),僅僅對(duì)外提供開(kāi)關(guān)機(jī)、鼠標(biāo)以及鍵盤(pán)插孔等,讓用戶(hù)可以與計(jì)算機(jī)進(jìn)行交互即可。
二. 訪問(wèn)限定符(修飾符)
Java中主要通過(guò)類(lèi)和訪問(wèn)權(quán)限來(lái)實(shí)現(xiàn)封裝:類(lèi)可以將數(shù)據(jù)以及封裝數(shù)據(jù)的方法結(jié)合在一起,更符合人類(lèi)對(duì)事物的認(rèn)知,而訪問(wèn)權(quán)限用來(lái)控制類(lèi)或者類(lèi)中方法或者字段能否直接在類(lèi)外使用。Java中提供了四種訪問(wèn)限定符:
public:公開(kāi)的,可以理解為一個(gè)人的外貌特征,誰(shuí)都可以看得到
protected:受保護(hù)的,涉及到繼承中的知識(shí),繼承博客中詳細(xì)介紹
default: 什么都不寫(xiě)時(shí)的默認(rèn)權(quán)限,對(duì)于自己家族中(同一個(gè)包中)不是什么秘密,對(duì)于其他人來(lái)說(shuō)就是隱私了
private:私有的,只有自己知道,其他人都不知道
通過(guò)下面給出的代碼示例理解封裝:
class Person { private String name; //private修飾的成員變量只能在本類(lèi)中訪問(wèn) private int age; String sex; //這里不加修飾符即為默認(rèn)權(quán)限,默認(rèn)是default權(quán)限 public String getName() { return name; } //在其他類(lèi)中不能直接訪問(wèn)name和age, //但可以在本類(lèi)中提供公開(kāi)的(public修飾)訪問(wèn)方法和外界進(jìn)行交互 //這里就是對(duì)成員變量進(jìn)行了封裝 public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void show() { System.out.println("姓名:"+name+" 年齡: "+age); } } public class Test { public static void main(String[] args) { Person person = new Person(); //person.name = "bit";//不能直接進(jìn)行訪問(wèn) person.setName("XIN-XIANG榮"); person.setAge(21); //通過(guò)提供Person類(lèi)中提供的方法間接進(jìn)行訪問(wèn) System.out.println(person.getName()+" => "+person.getAge()); } }
一般情況下成員變量設(shè)置為private,成員方法設(shè)置為public,通過(guò)這個(gè)例子就可以很好的理解封裝了,這里對(duì) 類(lèi) 內(nèi)部的實(shí)現(xiàn)細(xì)節(jié)進(jìn)行了隱藏/封裝,對(duì) 外 只提供一些公開(kāi)的方法供其他用戶(hù)進(jìn)行訪問(wèn)。
【訪問(wèn)限定符的使用場(chǎng)景】:
- 我們希望類(lèi)要盡量做到 “封裝”, 即隱藏內(nèi)部實(shí)現(xiàn)細(xì)節(jié), 只暴露出 必要 的信息給類(lèi)的調(diào)用者.
- 因此我們?cè)谑褂玫臅r(shí)候應(yīng)該盡可能的使用 比較嚴(yán)格 的訪問(wèn)權(quán)限;例如如果一個(gè)方法能用 private, 就盡量不要用 public.
- 另外, 還有一種 簡(jiǎn)單粗暴 的做法: 將所有的字段設(shè)為 private, 將所有的方法設(shè)為 public. 不過(guò)這種方式屬于是對(duì)訪問(wèn)權(quán)限的濫用, 不過(guò)最好寫(xiě)代碼的時(shí)候思考該類(lèi)提供的字段方法到底給 “誰(shuí)” 使用(是類(lèi)內(nèi)部自己用, 還是類(lèi)的調(diào)用者使用, 還是子類(lèi)使用)
三. 包
1. 包的概念
在面向?qū)ο篌w系中,提出了一個(gè)軟件包的概念,即:為了更好的管理類(lèi),把多個(gè)類(lèi)收集在一起成為一組,稱(chēng)為軟件包。 有點(diǎn)類(lèi)似于目錄。比如:為了更好的管理電腦中的圖片,一種好的方式就是將相同屬性的圖片放在相同文件下,也可以對(duì)某個(gè)文件夾下的圖片進(jìn)行更詳細(xì)的分類(lèi) 。
在Java中也引入了包,包是對(duì)類(lèi)、接口等的封裝機(jī)制的體現(xiàn),是一種對(duì)類(lèi)或者接口等的很好的組織方式,比如:一個(gè)包中的類(lèi)不想被其他包中的類(lèi)使用。包還有一個(gè)重要的作用:在同一個(gè)工程中允許存在相同名稱(chēng)的類(lèi),只要處在不同的包中即可。
2. 導(dǎo)入包中的類(lèi)
2.1 導(dǎo)入方法一
Java 中已經(jīng)提供了很多現(xiàn)成的類(lèi)供我們使用. 例如Date類(lèi):可以使用 java.util.Date
導(dǎo)入 java.util 這個(gè)包中的 Date類(lèi).
public class Test1 { public static void main(String[] args) { java.util.Date date = new java.util.Date(); // 得到一個(gè)毫秒級(jí)別的時(shí)間戳 System.out.println(date.getTime()); } }
2.2 導(dǎo)入方法二
但是這種寫(xiě)法比較麻煩一些, 可以使用 import語(yǔ)句導(dǎo)入包
import java.util.Date; public class Test1 { public static void main(String[] args) { Date date = new Date(); // 得到一個(gè)毫秒級(jí)別的時(shí)間戳 System.out.println(date.getTime()); } }
2.3 導(dǎo)入方法三
如果需要使用 java.util 中的其他類(lèi), 可以使用 import java.util.*
,這里可以導(dǎo)入java.util這個(gè)包中的所有類(lèi),但要注意不是一下子將所有類(lèi)都導(dǎo)進(jìn)來(lái),在代碼中用到誰(shuí)就會(huì)導(dǎo)入誰(shuí)。
import java.util.*; public class Test1 { public static void main(String[] args) { Date date = new Date(); // 得到一個(gè)毫秒級(jí)別的時(shí)間戳 System.out.println(date.getTime()); } }
但是更建議顯式的指定要導(dǎo)入的類(lèi)名. 否則還是容易出現(xiàn)沖突的情況.
import java.util.*; import java.sql.*; public class Test1 { public static void main(String[] args) { // util 和 sql 中都存在一個(gè) Date 這樣的類(lèi), 此時(shí)就會(huì)出現(xiàn)歧義, 編譯出錯(cuò) Date date = new Date(); System.out.println(date.getTime()); } } // 編譯出錯(cuò) //Error:(5, 9) java: 對(duì)Date的引用不明確 //java.sql 中的類(lèi) java.sql.Date 和 java.util 中的類(lèi) java.util.Date 都匹配
在這種情況下需要使用完整的類(lèi)名
import java.util.*; import java.sql.*; public class Test1 { public static void main(String[] args) { java.util.Date date = new java.util.Date(); System.out.println(date.getTime()); } }
2.4 導(dǎo)入靜態(tài)的方法和字段
import static java.lang.Math.*; public class Test { public static void main(String[] args) { double x = 30; double y = 40; // 靜態(tài)導(dǎo)入的方式寫(xiě)起來(lái)更方便一些. // double result = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)); double result = sqrt(pow(x, 2) + pow(y, 2)); System.out.println(result); } } //對(duì)比正常的導(dǎo)入和使用 import java.lang.Math; public class Test1 { public static void main(String[] args) { double x = 30; double y = 40; double result = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)); System.out.println(result); } }
3. 自定義包
3.1 基本使用規(guī)則:
- 在文件的最上方加上一個(gè) package 語(yǔ)句指定該代碼在哪個(gè)包中.
- 包名需要盡量指定成唯一的名字, 通常會(huì)用公司域名的顛倒形式(例如com.bat.demo1 ).
- 包名要和代碼路徑相匹配. 例如創(chuàng)建 com.bat.demo1 的包, 那么會(huì)存在一個(gè)對(duì)應(yīng)的路徑 com/bat/demo1 來(lái)存儲(chǔ)代碼
- 如果一個(gè)類(lèi)沒(méi)有 package 語(yǔ)句, 則該類(lèi)被放到一個(gè)默認(rèn)包中
3.2 IDEA中創(chuàng)鍵自定義包
在 IDEA 中先新建一個(gè)包: 右鍵 src -> 新建 -> 包
在彈出的對(duì)話框中輸入包名, 例如 com.bat.demo1 ,敲入回車(chē)即可
在包中創(chuàng)建類(lèi), 右鍵包名 -> 新建 -> 類(lèi), 然后輸入類(lèi)名回車(chē)即可.
此時(shí)可以看到我們的磁盤(pán)上的目錄結(jié)構(gòu)已經(jīng)被 IDEA 自動(dòng)創(chuàng)建出來(lái)了
同時(shí)我們也看到了, 在新創(chuàng)建的 Test.java 文件的最上方, 就出現(xiàn)了一個(gè) package 語(yǔ)句
4. 不同包中的訪問(wèn)權(quán)限控制
Computer類(lèi)位于com.bat.demo1包中,TestComputer位置com.bat.demo2包中
package com.bat.demo1; public class Computer { private String cpu; // cpu private String memory; // 內(nèi)存 public String screen; // 屏幕 String brand; // 品牌 public Computer(String brand, String cpu, String memory, String screen) { this.brand = brand; this.cpu = cpu; this.memory = memory; this.screen = screen; } public void Boot() { System.out.println("開(kāi)機(jī)~~~"); } public void PowerOff() { System.out.println("關(guān)機(jī)~~~"); } public void SurfInternet() { System.out.println("上網(wǎng)~~~"); } }
注意:如果去掉Computer類(lèi)之前的public修飾符,Computer類(lèi)為默認(rèn)權(quán)限,只能在同一包中訪問(wèn),代碼也會(huì)編譯失敗
5. 常見(jiàn)的包
- java.lang:系統(tǒng)常用基礎(chǔ)類(lèi)(String、Object),此包從JDK1.1后自動(dòng)導(dǎo)入。
- java.lang.reflect:java 反射編程包;
- java.net:進(jìn)行網(wǎng)絡(luò)編程開(kāi)發(fā)包。
- java.sql:進(jìn)行數(shù)據(jù)庫(kù)開(kāi)發(fā)的支持包。
- java.util:是java提供的工具程序包;(集合類(lèi)等) 非常重要
- java.io:I/O編程開(kāi)發(fā)包。
總結(jié)
到此這篇關(guān)于Java封裝實(shí)現(xiàn)訪問(wèn)限定符、包的文章就介紹到這了,更多相關(guān)Java訪問(wèn)限定符 包內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Swift洗牌動(dòng)畫(huà)效果的實(shí)現(xiàn)方法
這篇文章主要介紹了Swift洗牌動(dòng)畫(huà)效果的實(shí)現(xiàn)方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2016-12-12springboot中不能獲取post請(qǐng)求參數(shù)的解決方法
這篇文章主要介紹了springboot中不能獲取post請(qǐng)求參數(shù)的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06SSH框架網(wǎng)上商城項(xiàng)目第15戰(zhàn)之線程、定時(shí)器同步首頁(yè)數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了SSH框架網(wǎng)上商城項(xiàng)目第15戰(zhàn)之線程、定時(shí)器同步首頁(yè)數(shù)據(jù),感興趣的小伙伴們可以參考一下2016-06-06詳解RSA加密算法的原理與Java實(shí)現(xiàn)
這篇文章主要和大家分享非對(duì)稱(chēng)加密中的一種算法,那就是 RSA 加密算法。本文介紹了RSA算法的原理與Java實(shí)現(xiàn),感興趣的小伙伴可以嘗試一下2022-10-10