瘋狂java講義第五章筆記

1 定義類,成員變量和方法

類和對象

定義類

java的類名由一個或者多個有意義的單詞組合而成,每個單詞的首字母大寫,其他的全部消協(xié),并且單詞之間沒有分隔符。
成員變量:用于定義該類或者實例的所包含的狀態(tài)數(shù)據(jù)。
方法:用于定義該類或者實例所包含的功能實現(xiàn)和行為特征。
構(gòu)造器:用于構(gòu)造該類的實例。

  1. 定義成員變量的語法格式:
    [修飾符] 類型 成員變量名;
    1,修飾符可以沒有,也可以是public ,protected,private,static,final.前三個最多出現(xiàn)一個,可以與static final組合起來修飾成員變量
    2,類型:任何類型,
    3,成員變量名,第一個單詞的首字母小寫,其他的大寫,用英文名詞
    4,默認(rèn)值:定義成員變量可以指定一個可選的默認(rèn)值。
  2. 定義方法的語法格式
    [修飾符]返回值類型 方法名(形參列表)

    //由0條或者多條可執(zhí)行的語句構(gòu)成的方法體

    1,修飾符:可以省略,public protected private static final abstract 前三個可以出現(xiàn)一個,final和abstract 只能出現(xiàn)其中之一,他們與static組合起來修飾方法
    2,返回值類型:任何類型。如果生命了返回值類型,必須有有效的return語句,否則用void.
    3,方法名 ,基本和成員變量的一樣,最好用英文動詞。
    4,形參列表:0組到多組的“參數(shù)類型 形參名,參數(shù)類型 形參名,,,”
  3. static關(guān)鍵字
    static修飾的成員表示他是屬于類的,類變量類方法。也叫靜態(tài)。靜態(tài)成員不能直接訪問非靜態(tài)成員。
    static真正的作用是用來區(qū)分成員變量,方法,內(nèi)部類,初始化塊屬于類本身還是屬于實例。
  4. 定義構(gòu)造器語法格式
    [修飾符] 構(gòu)造器名 (形參列表)


    1,修飾符可以是省略,public protected private其中之一
    2,構(gòu)造器名必須與類名相同
    3,與方法的相同
  5. java類的大致作用
    定義變量
    創(chuàng)建對象
    調(diào)用類的類方法,或者訪問類的類變量

創(chuàng)建并使用對象

對象的產(chǎn)生和使用

Person p=new Person();
p.say("你真棒");
p.name(“李剛”);//直接給成員變量賦值

對象和引用

堆里面的對象可以有多個引用。
Person p1=p;
這時p1和p指向同一個對象。
如果希望通知垃圾回收機(jī)制回收某個對象,把引用變量賦值為null

this

this關(guān)鍵字總是指向調(diào)用該方法的對象,誰調(diào)用它,他就指向誰,就可以獲取成員變量和方法。

public class Dog {
    public void jump()
    {
        System.out.println("正在執(zhí)行jump方法");
    }
    public void run()
    {
        //如果想在這個方法里面調(diào)用另一個方法
        //如果沒有this,則必須再創(chuàng)建一個對象
        //有了this,就不需要創(chuàng)建了,因為this就是指向調(diào)用該方法的對象
        this.jump();
        jump();
    }

static修飾的方法,是用類來直接調(diào)用的,因此不需要再創(chuàng)建一個對象,因此也就不使用this,因此static對象不能訪問非靜態(tài)成員

public class StaticAccessNonStatic {
    
    public void info()
    {
        System.out.println("簡單的方法");
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new StaticAccessNonStatic().info();

    }

}

大部分時候,普通方法訪問其他方法,成員變量無需使用this,但是如果方法里面有局部變量和成員變量同名,但是又需要在方法里面訪問,則必須適應(yīng)this
this也可以用于構(gòu)造器作為默認(rèn)引用。代表構(gòu)造器正在初始化的對象。

public class ThisInConstructor {
    //定義一個名為foo的成員變量
    public int foo;
    public ThisInConstructor ()
    {
        // 在構(gòu)造器中又定義了一個foo
        //this代表正在初始化的對象,把他的foo成員變量設(shè)為6
        int foo=0;
        this.foo=6;
    }

this還可以作為普通方法的返回值,表示返回調(diào)用該方法的對象

方法必須屬于類或者對象

java里面的類不能獨立存在,必須放在類里面

方法的所屬性

2 java方法的參數(shù)傳遞機(jī)制

值傳遞

參數(shù)傳遞方式是一種值傳遞方式。也就是實參的副本保存在形參中。如果形參是基本類型,那么方法中對形參的修改不會改變實參;如果形參是引用類型,仍然是指傳遞,由于引用類型是指針,保存的是地址,所以方法中對形參的修改會改變實參的值,但是如果在方法中把形參的引用賦值為null,則實參不會改變。

class DataWrap
{
    int a;
    int b;
}

public class ReferenceTransferTest {
    
    public static void swap(DataWrap dw)
    {
        int temp=dw.a;
        dw.a=dw.b;
        dw.b=temp;
        System.out.println("在swap方法里面a是"+dw.a+"b是"+dw.b);
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ReferenceTransferTest  rf=new ReferenceTransferTest();
        DataWrap dw=new DataWrap();
        dw.a=9;
        dw.b=4;
        rf.swap(dw);
        System.out.println("交換結(jié)束后a是"+dw.a+"b是"+dw.b);
    }
}

參數(shù)個數(shù)可變的方法

在最后一個形參的類型后面加上"...", 表示形參可以接受多個參數(shù)。本質(zhì)上就是一個數(shù)組類型的形參。傳入的實參可以是多個參數(shù),也可以是一個數(shù)組。
但是參數(shù)個數(shù)可變的形參必須處于形參列表的最后,且只能有一個。
如果形參是數(shù)組的話,傳遞的方式是
test(new String[]{"abs","cps"});
如果形參時參數(shù)可變的,傳遞方式除了上邊的方式,還可以是
test("abs","cds");

public class Varargs {
    //定義一個參數(shù)可變的方法
    public static void test(int a,String ...books)
    {
        //books被當(dāng)作數(shù)組處理
        for(String tmp:books)
        {
            System.out.println(tmp);
        }
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        test(4,"ans","csd");
    }
}

3 遞歸方法

定義:一個方法體內(nèi)調(diào)用自身。
只要一個方法的方法體實現(xiàn)中再次調(diào)用了自身方法,就是遞歸。遞歸必須向已知方向遞歸

public class Recursive {
    public static int fn(int n)
    {
        if(n==1)
        {
            return 1;
        }else if(n==2)
        {
            return 2;
        }
        else 
        {
            //方法中調(diào)用自身
            return 2*fn(n-1)+fn(n-2);
        }
        
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println(fn(10));

    }

}

4 方法的重載

“兩同一不同”
同一個類中方法名相同,參數(shù)列表不同。
注意被重載的方法里面包含了參數(shù)可變的形參。

public class OverloadVarargs {
    public void test(String msg)
    {
        System.out.println("只有一個形參的test方法");
    }

    public void test(String ... books)
    {
        System.out.println("多個形參的test方法");
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        OverloadVarargs olV =new OverloadVarargs();
        olV.test("aa");
        olV.test("bb","cc","dd");
        olV.test();
        olV.test(new String[]{"aa"});

    }

}

5 成員變量和局部變量

必須先給方法局部變量和代碼塊局部變量現(xiàn)實初始化,即指定初始值。否則不可以訪問。
一個類不能有兩個同名的成員變量,一個方法也不能有兩個同名的方法局部變量。但是兩個代碼塊里面的代碼塊局部變量可以同名。
如果先定義代碼塊局部變量,后定義方法局部變量。代碼塊和方法里面的局部變量也可以同名。
允許局部變量和成員變量同名。此時局部變量覆蓋成員變量,如果想訪問成員變量,要用this。

成員變量的初始化和內(nèi)存中的運行機(jī)制

類變量和成員變量都在堆中保存。只是不再同一個地方。成員變量屬于實例,類變量屬于類。

局部變量的初始化和內(nèi)存中的運行機(jī)制

局部變量保存在棧中,不需要垃圾回收,占的內(nèi)存很小。直到被付初值才會被分配內(nèi)存

變量的使用規(guī)則

成員變量的使用情形

  1. 某個類或者實例的固有信息。如果個個實例都是一樣的,用類變量。如果不是一樣的,用實例變量。
  2. 保存該類或者實例運行時候的狀態(tài)信息。
  3. 多個方法都要用到。

6 實現(xiàn)良好的封裝

理解封裝

通過訪問控制符把該隱藏的隱藏起來,該暴露的暴露出來。

使用訪問控制符

private 類訪問權(quán)限
default 包訪問權(quán)限
protected 子類訪問權(quán)限
public 公共訪問權(quán)限

關(guān)于訪問控制符的使用

  1. 絕大部分成員變量都用private,只有少部分用static,類似全局變量的成員變量用public。除此之外,輔助實現(xiàn)該類的其他方法的工具類也用private。
  2. 如果某個類主要做其他類的父類,則用protected.
  3. 構(gòu)造器用public。大部分外部類用public。

7 使用package和import

package ,import,import static

  1. 同一個包下的類可以自由訪問,但是子包里面的還是必須要寫全名
  2. import可以導(dǎo)入包下面的全部類,子包單獨import
  3. import static導(dǎo)入靜態(tài)成員變量,方法

java 常用包

8 構(gòu)造器的作用和構(gòu)造器重載

8.1使用構(gòu)造器執(zhí)行初始化

在系統(tǒng)執(zhí)行構(gòu)造器的執(zhí)行體之前,系統(tǒng)已經(jīng)創(chuàng)建了一個對象,只是還不能被外部訪問。

9 繼承的特點和用法

9.1繼承的特點

java是單繼承,只能有一個直接父類,但是可以有多個間接父類。
子類是父類的擴(kuò)展。子類不能獲得父類的構(gòu)造函數(shù)。

10 重寫父類方法

如果子類對于繼承下來的父類的方法不滿意,可以重寫這個方法。
‘兩同兩小一大原則’
“兩同” 方法名相同,參數(shù)列表相同
“兩小” 返回值類型要小,拋出的異常要小
“一大” 權(quán)限要大
重載和重寫:是兩個東西。重載是一個類的多個方法,由于形參列表不同所以不同;重寫是子類又寫了一個和父類對應(yīng)的方法。

11 super關(guān)鍵字的用法

super用來限定該對象調(diào)用父類被覆蓋的實例方法。不能夠用于static修飾的方法中,因為static是作用于類的。
創(chuàng)建一個子類對象時,系統(tǒng)會給該類中定義的實例變量和父類繼承來的實力變量分配內(nèi)存,即使二者同名。

11.2調(diào)用父類構(gòu)造器

用super可以顯式調(diào)用父類構(gòu)造器。必須出現(xiàn)在子類構(gòu)造器執(zhí)行體的第一行,因此不能和this同時出現(xiàn)。
當(dāng)調(diào)用子類構(gòu)造器初始化子類對象,父類構(gòu)造器一定會在子類構(gòu)造器之前執(zhí)行。

12 繼承和多態(tài)

12.1多態(tài)性

java引用變量有兩個類型,一個是編譯時候的類型,一個是運行時候的類型。編譯時候的類型和聲明的類型相同,運行時候的類型由實際賦給該變量的對象決定。稱為多態(tài)。
相同類型的變量,調(diào)用同一個方法時呈現(xiàn)出多種不同的行為特征,這就是多態(tài)。
成員變量不具有多態(tài)性。

12.2 引用變量的強(qiáng)制類型轉(zhuǎn)換

如果想讓引用變量調(diào)用它運行時的類型的方法,則需要強(qiáng)制類型轉(zhuǎn)換。只能是具有繼承關(guān)系的兩個類型之間。如果是兩個沒有任何關(guān)系的,無法通過編譯。如果父類實例轉(zhuǎn)化成子類實例,則這個對象在運行時候必須是子類實例才行,否則會有異常。用instanceof處理。

12.3 instanceof運算符

instanceof運算符前一個是引用變量,后一個是一個類型。用于判斷前面的對象是不是后面的類,或者是不是他的子類,或者實現(xiàn)類的實例。如果是,返回true
前面操作數(shù)的編譯時候的類型要么和后面的類型相同,要么和后面的有父子繼承關(guān)系(不一定是子類,可以是父類),否則編譯有錯誤。
編譯想通過的話,只要有繼承關(guān)系就行。想返回true,前面的不能是后 面的父類。

13 繼承和組合的關(guān)系

13.1 使用繼承的注意點

  1. 盡量隱藏父類的內(nèi)部數(shù)據(jù)
  2. 不要讓子類可以隨便訪問更改父類的方法。輔助方法設(shè)置成private;
    如果父類中的方法需要被外部類調(diào)用,但是又不想讓子類重寫這個方法,可以加final;
    如果希望子類重寫該方法,但是不希望其他類自由調(diào)用,用protected
  3. 父類的構(gòu)造器里面不要有子類會修改的方法。否則容易出現(xiàn)空指針。
    因為創(chuàng)建子類的對象的時候,一定會先調(diào)用父類的構(gòu)造器,構(gòu)造器里面調(diào)用的方法已經(jīng)被子類覆蓋,所以運行時用的方法是子類的方法。但是子類還沒有創(chuàng)建,因此會有空指針的可能性。

什么時候從父類派生子類?

  1. 增加了新的屬性
  2. 增加了新的方法

使用組合來實現(xiàn)復(fù)用

組合是一種“has”的關(guān)系,譬如人有胳膊,腿。
組合和繼承的開銷一樣。
至于怎么用的,書里面寫的太少了。沒有看明白
先定義private的父類的成員變量,然后在子類的構(gòu)造器的形參中加入這個成員變量。然后把父類里面所有的public再寫一次。(父類子類并不是這樣,只是我不知道怎么能夠說清楚)

13 構(gòu)造器和初始化塊的作用及區(qū)別

13.1 使用初始化塊

java類里面可以出現(xiàn)的第四種成員。修飾符只能是static。當(dāng)創(chuàng)建java對象時,總是先調(diào)用該類里面定義的初始化模塊,再調(diào)用構(gòu)造函數(shù)。

13.2 初始化塊和構(gòu)造器

如果兩個構(gòu)造器里面有相同的代碼初始化代碼,且這些初始化代碼無需接受參數(shù),就可以把它們放在初始化塊中定義。

13.3 靜態(tài)初始化塊

如果希望加載類時,對整個類進(jìn)行某些初始化操作,使用static關(guān)鍵字來修飾初始化模塊。叫做類初始化塊。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,836評論 6 540
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,275評論 3 428
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,904評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,633評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,368評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,736評論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,740評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,919評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,481評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,235評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,427評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,968評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,656評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,055評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,348評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,160評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,380評論 2 379

推薦閱讀更多精彩內(nèi)容

  • 1、.java源文件: 一個以”.java“為后綴的源文件:只能有一個與文件名相同的類,可以包含其他類。 2、類方...
    Hughman閱讀 1,496評論 1 9
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,733評論 18 399
  • 一:java概述:1,JDK:Java Development Kit,java的開發(fā)和運行環(huán)境,java的開發(fā)工...
    ZaneInTheSun閱讀 2,685評論 0 11
  • Win7下如何打開DOS控制臺? a:開始--所有程序--附件--命令提示符 b:開始--搜索程序和文件--cmd...
    逍遙嘆6閱讀 1,608評論 4 12
  • 來深多年,一直過著三點一線的職業(yè)生涯,每天在這個陌生而熟悉的城市里來去穿梭,從來沒有好好的欣賞這座城市的美麗風(fēng)景。...
    擁抱太陽的向日葵閱讀 182評論 1 0