1. 程式人生 > >Java學習軌跡【面向對象】(持續更新)

Java學習軌跡【面向對象】(持續更新)

一個 調用構造 用法 可見 返回 java編譯 ted 條件 targe

其中部分內容為其他博主所作,侵刪
6月12日-7月每日更新

Java學習軌跡
一、面向對象
類和對象
1. new關鍵字所完成的事情
1)為對象開辟了新的內存空間
2)調用類的構造方法
3)返回生成對象的地址
Dog dog=new Dog();
dog是引用,new Dog()生成了一個Dog對象,引用dog指向所生成對象的地址

2.構造方法
1)構造方法必須與類名相同
2)構造方法沒有返回值【且不能使用void作返回值】
3)如果在定義類的時候沒有為類聲明構造方法java編譯器會自動為類添加一個沒有參數且方法體為空的默認構造方法,若聲明了構造方法,則編譯器不再自動添加默認構造方法
4)不能顯式的調用類的構造方法,通常

是用new關鍵字隱式的調用構造方法,也就是在new一個對象的時候調用
5)構造方法可重載:方法名相同,但參數不同,調用時會自動根據不同的參數選擇相應的方法。
3. 成員變量和局部變量
1)成員變量不必賦初值,默認會賦上初值
2)局部變量必賦初值

4.static的用法
1)static靜態變量(類成員)
①它屬於整個類所有,而不是某個對象所有,被類的所有對象所共享。
②靜態成員可使用類名直接訪問,也可以使用對象名進行訪問。
③靜態成員屬於整個類,當系統第一次使用該類時,就會為其分配內存空間直到該類被卸載才會進行資源回收。
2)static靜態方法(類方法)
①靜態方法中可以直接調用同類中的靜態成員,但不能直接調用非靜態成員。
②如果系統在靜態方法中調用非靜態變量,可通過創建類的對象,然後通過對象來訪問非靜態變量。
③在普通成員方法中,則可以直接訪問同類的非靜態變量和靜態變量。
④靜態方法中不能直接調用非靜態方法,需要通過對象來訪問非靜態方法。
static修飾的變量是類變量,只有一處內存空間,類變量一旦在其他方法被修改,類變量也會改變;


static修飾的方法是類方法,當一個類創建一個對象後,就會調用這個類方法
3)初始化塊
普通初始化塊

    {
    /****
                 ****/
    }

靜態初始化塊

static{
    /****
                 ****/
    }

封裝:即將類的某些信息隱藏在類內部,不允許外部程序直接訪問,而是通過該類提供的方法類實現對隱藏信息的操作和訪問。

  1. 封裝的好處:只能同規定的方法訪問數據,隱藏類的實現細節,方便修改和實現。即(①降低耦合(關聯)率②可重復調用類中的屬性③提高安全性)
  2. 實現封裝的步驟:
    1)修改屬性的可見性(private),限制訪問。
    2)設置屬性的讀取方法( 創建getter/setter方法)。
    3)在讀取屬性的方法中,添加對屬性讀取的限制。(在getter/setter方法中加入屬性控制語句:對屬性值的合法性進行判斷)
  3. 訪問修飾符:修飾屬性和方法,設置權限
    1)private:只能在本類中訪問和使用。
    2)默認:能在本類和同包中訪問和使用。
    3)protected:能在本類、同包、子類中使用。
    4)public:在本類、同包、子類、其它類中使用。
    註意:① final修飾的類不能被繼承,沒有子類。
       ②abstract修飾的類不能被實例化,必須被子類繼承。類只要有一個抽象方法就必定是抽象類,但抽象類不一定要有抽象方法。
      
  4. this:代表當前對象
  5. 內部類:一個類的定義放在另一個類的內部,這個類就叫做內部類。 (仍然是一個獨立的類,在編譯之後內部類會被編譯成獨立的.class文件,但是前面冠以外部類的類名和$符號 。)
    使用內部類的好處:
    1)內部類可以很好的實現隱藏,一般的非內部類,是不允許有 private 與protected權限的,但內部類可以
    2)內部類擁有外圍類的所有元素的訪問權限(若內部類聲明成靜態的,就不能隨便的訪問外部類的成員變量了,此時內部類只能訪問外部類的靜態成員變量 。)
    3)是實現多重繼承
    4)可以避免修改接口而實現同一個類中兩種同名方法的調用。

內部類分為四種:
①成員內部類:最普通的內部類【註意:定義了成員內部類後,必須使用外部類對象來創建內部類對象,而不能直接去new一個內部類對象。】

public class Outer{
    int outi=0;
    private int prii=0;
    private class Inner{
    int inni=0;
    outi++;
    prii++;
    public void seeOut{
        System.out.println(outi+prii);
    }
}   
}

其中,Inner類中可以調用Outer類中的任意變量(outi,prii),而Outer類中不能調用Inner類的變量(inni)
②方法內部類:把類放在方法內
(1)、方法內部類只能在定義該內部類的方法內實例化,不可以在此方法外對其實例化。
(2)、方法內部類對象不能使用該內部類所在方法的非final局部變量。

public class Outer{
public void go(){
    final int outi=0;
    private class Inner{
        public void seeOut(){
        System.out.println(outi);
        }
    }
}
Inner in=new Inner();
in.seeOut();
public static void main(String[] args) {
    Outer out = new Outer();
    out.go();
}
}

這段代碼供大家自行體會
③靜態內部類(由static關鍵字修飾)
1)靜態內部類不能直接訪問外部類的非靜態成員,但可通過”new 外部類().成員”的方式訪問
2)如果外部類的靜態成員與內部類的成員名稱相同,可通過”類名.靜態成員”訪問外部類的靜態成員;如果外部類的靜態成員與內部類的成員名稱不相同,則可通過”成員名” 直接調用。
3)創建靜態內部類的對象時,不需要外部類的對象,可以直接創建:內部類 對象名 = new 內部類();

public class Outer{
        static class Inner{}
}
public class{
        public static void main(String[] args){
                Outer.Inner n = new Outer.Inner();
        }
}

上述代碼表明:靜態的含義是該內部類可以像其他靜態成員一樣,沒有外部類對象時,也能夠訪問它。

④匿名內部類:當程序中使用匿名內部類時,在定義匿名內部類的地方往往直接創建該類的一個對象。

new ParentName(){
...// 內部類的定義
}

匿名內部類就是沒有名字的內部類。什麽情況下需要使用匿名內部類?如果滿足下面的一些條件,使用匿名內部類是比較合適的:
·只用到類的一個實例 。
·類在定義後馬上用到。
·類非常小(SUN推薦是在4行代碼以下)
·給類命名並不會導致你的代碼更容易被理解。
在使用匿名內部類時,要記住以下幾個原則:
·匿名內部類不能有構造方法。
·匿名內部類不能定義任何靜態成員、靜態方法。
·匿名內部類不能是public,protected,private,static。
·只能創建匿名內部類的一個實例。
·一個匿名內部類一定是在new的後面,用其隱含實現一個接口或實現一個類。
·因匿名內部類為局部內部類,所以局部內部類的所有限制都對其生效。
目前還沒有具體使用過匿名內部類,對它不是很了解,有些地方表述有偏差請指出

Java學習軌跡【面向對象】(持續更新)