a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

0009 封裝

2019-11-14 10:23:42
字體:
供稿:網(wǎng)友

封裝的定義

  面向?qū)ο笥腥筇匦裕?strong>封裝、繼承、多態(tài)。

  封裝就是將類的信息隱藏在類的內(nèi)部,不允許外部程序直接訪問,而是通過該類提供的方法來實(shí)現(xiàn)對(duì)隱藏信息的操作和訪問。那這樣的好處是什么呢?

   1. 只能通過規(guī)定的方法訪問數(shù)據(jù)

   2. 隱藏類的實(shí)例細(xì)節(jié),方便修改和實(shí)現(xiàn)。

  我們?cè)陂_汽車的時(shí)候,只用去關(guān)注如何開車,我們并不在意車子是如何實(shí)現(xiàn)的,這就是封裝。

如何去實(shí)現(xiàn)類的封裝呢?

修改屬性的可見性,在屬性的前面添加修飾符

創(chuàng)建 getter/setter 方法,用來讀寫屬性

在 getter/setter 方法里加入屬性的控制語句,例如我們可以加一個(gè)判斷語句,對(duì)于非法輸入給予否定。

封裝的步驟

package com.shiyanlou;public class People {//屬性(成員變量)有什么,前面添加了訪問修飾符PRivate//變成了私有屬性,必須通過方法調(diào)用    private double height;     //身高//屬性已經(jīng)封裝好了,如果用戶需要調(diào)用屬性//必須用getter和setter方法進(jìn)行調(diào)用//getter和setter方法需要程序員自己定義    public double getHeight(){        //getter 方法命名是get關(guān)鍵字加屬性名(屬性名首字母大寫)    //getter 方法一般是為了得到屬性值        return height;    }//同理設(shè)置我們的setter方法//setter 方法命名是set關(guān)鍵字加屬性名(首字母大寫)//setter 方法一般是給屬性值賦值,所以有一個(gè)參數(shù)    public void setHeight(double newHeight){        height = newHeight;    }}

然后在我們的 main 函數(shù)里的對(duì)象,不能再直接調(diào)用屬性了,只能通過gettersetter方法進(jìn)行調(diào)用。

package com.shiyanlou;public class LiLei {    public static void main(String[] args) {        // TODO Auto-generated method stub        People LiLei = new People();    //創(chuàng)建了一個(gè)People對(duì)象LiLei        //利用setter方法為屬性賦值        LiLei.setHeight(170.0);        //利用getter方法取屬性值        System.out.println("LiLei的身高是"+LiLei.getHeight());    }}

  我有時(shí)候在封裝的時(shí)候會(huì)遇到這樣的問題,就是我們的類名可能是重復(fù)的。這時(shí)候我們就可以用的概念來解決我們的問題。

  包的作用就是管理java文件,解決同名文件沖突。這和我們生活當(dāng)中的管理相類似。我們的衣柜是不是有不同的隔斷和抽屜,我們將衣服分門別類地放好,是不是有利于我們管理。

  我們?cè)谝郧熬蛯W(xué)習(xí)過了如何定義一個(gè)包,我們使用package關(guān)鍵字,加上我們的包名。

定義包語法:

package 包名//注意:必須放在源程序的第一行,包名可用"."號(hào)隔開

例如:

//我們?cè)诙x文件夾的時(shí)候利用"/"來區(qū)分層次//包中我們用"."來分層package com.shiyanlou.Java

  比如我們?cè)?a >游戲里會(huì)用到音樂類,在電影里我們也會(huì)用到音樂類,但是他們的類又不相同,我們就可以利用包進(jìn)行區(qū)分。

  不僅是我們這樣利用包名來區(qū)分類,系統(tǒng)也是這樣做的。

Java系統(tǒng)中的包

  那我們?cè)趺丛诓煌惺褂昧硪粋€(gè)文件中的類呢?這時(shí)候就需要用到import關(guān)鍵字。比如我們要導(dǎo)入實(shí)驗(yàn)樓下People這個(gè)類。import com.shiyanlou.Peole,同時(shí)如果import com.shiyanlou.*這是將包下的所有文件都導(dǎo)入進(jìn)來。

  這里要注意一點(diǎn),包的命名規(guī)范是全小寫字母拼寫。

Java 中的訪問修飾符

  訪問修飾符可以用來修飾屬性和方法的訪問范圍。

訪問范圍

  如圖所示,代表了不同的訪問修飾符的訪問范圍,比如private修飾的屬性或者方法,只能在本類中訪問或者使用。默認(rèn)是什么修飾符都不加,默認(rèn)在當(dāng)前類中和同一包下都可以訪問和使用。

  我們可以舉一個(gè)例子,比如 money,如果我們用private修飾代表著這是私有的,只能我自己可以使用。如果是protected代表著我可以使用,和我有關(guān)系的人,比如兒子也可以用。如果是public就代表了所有人都可以使用。

Java 中的 this 關(guān)鍵字

  我們?cè)跁鴮懘a的過程中常常會(huì)用到this關(guān)鍵字,this關(guān)鍵字代表當(dāng)前對(duì)象。使用this.屬性操作當(dāng)前對(duì)象的屬性,this.方法調(diào)用當(dāng)前對(duì)象的方法。

  當(dāng)我們封裝對(duì)象屬性的時(shí)候,經(jīng)常會(huì)使用this關(guān)鍵字。

  接下來我們來看看代碼中是怎么實(shí)現(xiàn)的吧。在上面我們講了用private修飾的屬性,我們利用對(duì)象訪問的時(shí)候,必須定義getter和setter方法,其實(shí)在Eclipse中可以自動(dòng)幫我們定義。

1、首先在菜單欄里點(diǎn)擊Source也可以在左側(cè)右擊選擇Source

創(chuàng)建getter和setter方法

2、選擇Grenerate Getters and Setters

創(chuàng)建getter和setter方法

3、系統(tǒng)會(huì)自動(dòng)幫我們檢測(cè)需要?jiǎng)?chuàng)建getter和setter方法的屬性,我們根據(jù)需要勾選就行了。

  當(dāng)系統(tǒng)幫我們創(chuàng)建好了getter和setter方法后,我們會(huì)發(fā)現(xiàn)系統(tǒng)創(chuàng)建的方法中參數(shù)名和我們的屬性名一樣。為了區(qū)分參數(shù)名和我們的屬性名,我們?cè)趯傩悦懊嫣砑恿?code>this關(guān)鍵字。

public void setAge(int age) {        this.age = age;    }

  此時(shí)就代表我們將一個(gè)參數(shù)的值賦給我們當(dāng)前對(duì)象的屬性。同理this關(guān)鍵字可以調(diào)用當(dāng)前對(duì)象的方法。

Java 中的內(nèi)部類

  從字面意思我們就可以知道,內(nèi)部類( Inner Class )就是定義在另外一個(gè)類里面的類,而包含內(nèi)部類的類被稱為外部類。

內(nèi)部類的主要作用如下:

內(nèi)部類提供了更好的封裝,可以把內(nèi)部類隱藏在外部類之內(nèi),不允許同一個(gè)包中的其他類訪問該類

內(nèi)部類的方法可以直接訪問外部類的所有數(shù)據(jù),包括私有的數(shù)據(jù)

內(nèi)部類所實(shí)現(xiàn)的功能使用外部類同樣可以實(shí)現(xiàn),只是有時(shí)使用內(nèi)部類更方便

我們通過代碼來詳細(xì)學(xué)習(xí)一下內(nèi)部類吧!

成員內(nèi)部類:

package com.shiyanlou;//外部類Peoplepublic class People {    private String name = "LiLei";         //外部類的私有屬性    //內(nèi)部類Student    public class Student {        String ID = "20151234";               //內(nèi)部類的成員屬性        //內(nèi)部類的方法        public void stuInfo(){            System.out.println("訪問外部類中的name:" + name);            System.out.println("訪問內(nèi)部類中的ID:" + ID);        }    }    //測(cè)試成員內(nèi)部類    public static void main(String[] args) {        People a = new People();     //創(chuàng)建外部類對(duì)象,對(duì)象名為a        Student b = a.new Student(); //使用外部類對(duì)象創(chuàng)建內(nèi)部類對(duì)象,對(duì)象名為b        b.stuInfo();   //調(diào)用內(nèi)部對(duì)象的suInfo方法    }}

由此,我們可以知道,成員內(nèi)部類的使用方法:

Student 類相當(dāng)于 People 類的一個(gè)成員變量,所以 Student 類可以使用任意訪問修飾符

Student 類在 People 類里,所以訪問范圍在類里的所有方法均可以訪問 People 的屬性(即內(nèi)部類里可以直接訪問外部類的方法和屬性,反之不行)

定義成員內(nèi)部類后,必須使用外部類對(duì)象來創(chuàng)建內(nèi)部類對(duì)象,即 內(nèi)部類 對(duì)象名 = 外部類對(duì)象.new 內(nèi)部類();

如果外部類和內(nèi)部類具有相同的成員變量或方法,內(nèi)部類默認(rèn)訪問自己的成員變量或方法,如果要訪問外部類的成員變量,可以使用 this 關(guān)鍵字

靜態(tài)內(nèi)部類:

package com.shiyanlou;//外部類Peoplepublic class People {    private String name = "LiLei";         //外部類的私有屬性/*外部類的靜態(tài)變量。Java 中被 static 修飾的成員稱為靜態(tài)成員或類成員。它屬于整個(gè)類所有,而不是某個(gè)對(duì)象所有,即被類的所有對(duì)象所共享。靜態(tài)成員可以使用類名直接訪問,也可以使用對(duì)象名進(jìn)行訪問。/*    static String ID = "510xxx199X0724XXXX";     //靜態(tài)內(nèi)部類Student    public static class Student {        String ID = "20151234";               //內(nèi)部類的成員屬性        //內(nèi)部類的方法        public void stuInfo(){            System.out.println("訪問外部類中的ID:" + People.ID);            System.out.println("訪問內(nèi)部類中的ID:" + ID);        }    }    //測(cè)試成員內(nèi)部類    public static void main(String[] args) {        Student b = new Student();   //直接創(chuàng)建內(nèi)部類對(duì)象,對(duì)象名為b        b.stuInfo();                 //調(diào)用內(nèi)部對(duì)象的suInfo方法    }}

靜態(tài)內(nèi)部類是 static 修飾的內(nèi)部類,這種內(nèi)部類的特點(diǎn)是:

靜態(tài)內(nèi)部類不能直接訪問外部類的非靜態(tài)成員,但可以通過 new 外部類().成員 的方式訪問

如果外部類的靜態(tài)成員與內(nèi)部類的成員名稱相同,可通過類名.靜態(tài)成員訪問外部類的靜態(tài)成員;如果外部類的靜態(tài)成員與內(nèi)部類的成員名稱不相同,則可通過成員名直接調(diào)用外部類的靜態(tài)成員

創(chuàng)建靜態(tài)內(nèi)部類的對(duì)象時(shí),不需要外部類的對(duì)象,可以直接創(chuàng)建 內(nèi)部類 對(duì)象名= new 內(nèi)部類();

方法內(nèi)部類

  方法內(nèi)部類就是定義在外部類的方法中的內(nèi)部類,方法內(nèi)部類只在該方法的內(nèi)部可見,即只在該方法內(nèi)可以使用。

例如:

package com.shiyanlou;//外部類Peoplepublic class People {        //外部類中的方法    public void peopleInfo() {        final String sex = "man";  //外部類方法中的常量        class Student {            String ID = "20151234"; //內(nèi)部類中的常量            public void print() {                System.out.println("訪問外部類的方法中的常量sex:" + sex);                System.out.println("訪問內(nèi)部類中的變量ID:" + ID);            }        }        Student a = new Student();  //創(chuàng)建方法內(nèi)部類的對(duì)象        a.print();//調(diào)用內(nèi)部類的方法    }    //測(cè)試方法內(nèi)部類    public static void main(String[] args) {        People b = new People(); //創(chuàng)建外部類的對(duì)象        b.peopleInfo();  //調(diào)用外部類的方法    }}

運(yùn)行結(jié)果:

運(yùn)行結(jié)果


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 古风h啪肉1v1摄政王 | 日本免费一区二区视频 | 97在线超碰 | 国产精品综合一区二区 | 日韩精品第一区 | 黄色av网 | 欧美大片在线看免费观看 | 午夜欧美一区二区三区在线播放 | 国产欧美在线观看 | 久久久九九九九 | 不卡久久 | 成人一区二区三区四区 | 成人影院欧美黄色 | 欧美久久一级特黄毛片 | 在线观看91| 午夜理伦三级 | 久久久久av | 欧美激情视频一区二区三区在线播放 | 国产精品国产成人国产三级 | 最新黄色av | 亚洲精品自在在线观看 | 国产精品一区免费在线观看 | 国产福利视频 | 国产视频一二区 | 在线观看免费av网 | 国产成人自拍一区 | 日韩欧美一区二区三区免费观看 | 91视频免费观看网址 | 日韩免费在线播放 | 国产精品片一区二区三区 | 日韩免费视频一区二区 | 999久久久国产精品 heyzo在线观看 | 日本在线观看一区 | 国产区精品 | 久久99精品久久久久久琪琪 | 国产精品伦一区二区三级视频 | 亚洲三级视频 | 成人av免费在线观看 | 日韩三区在线观看 | 成人午夜视频在线观看 | 玖玖成人 |