Java學習軌跡【面向對象】(持續更新)
其中部分內容為其他博主所作,侵刪
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)不能顯式的調用類的構造方法,通常
5)構造方法可重載:方法名相同,但參數不同,調用時會自動根據不同的參數選擇相應的方法。
3. 成員變量和局部變量
1)成員變量不必賦初值,默認會賦上初值
2)局部變量必賦初值
4.static的用法
1)static靜態變量(類成員)
①它屬於整個類所有,而不是某個對象所有,被類的所有對象所共享。
②靜態成員可使用類名直接訪問,也可以使用對象名進行訪問。
③靜態成員屬於整個類,當系統第一次使用該類時,就會為其分配內存空間直到該類被卸載才會進行資源回收。
2)static靜態方法(類方法)
①靜態方法中可以直接調用同類中的靜態成員,但不能直接調用非靜態成員。
②如果系統在靜態方法中調用非靜態變量,可通過創建類的對象,然後通過對象來訪問非靜態變量。
③在普通成員方法中,則可以直接訪問同類的非靜態變量和靜態變量。
④靜態方法中不能直接調用非靜態方法,需要通過對象來訪問非靜態方法。
static修飾的變量是類變量,只有一處內存空間,類變量一旦在其他方法被修改,類變量也會改變;
static修飾的方法是類方法,當一個類創建一個對象後,就會調用這個類方法
3)初始化塊
普通初始化塊
{
/****
****/
}
靜態初始化塊
static{
/****
****/
}
封裝:即將類的某些信息隱藏在類內部,不允許外部程序直接訪問,而是通過該類提供的方法類實現對隱藏信息的操作和訪問。
- 封裝的好處:只能同規定的方法訪問數據,隱藏類的實現細節,方便修改和實現。即(①降低耦合(關聯)率②可重復調用類中的屬性③提高安全性)
- 實現封裝的步驟:
1)修改屬性的可見性(private),限制訪問。
2)設置屬性的讀取方法( 創建getter/setter方法)。
3)在讀取屬性的方法中,添加對屬性讀取的限制。(在getter/setter方法中加入屬性控制語句:對屬性值的合法性進行判斷) - 訪問修飾符:修飾屬性和方法,設置權限
1)private:只能在本類中訪問和使用。
2)默認:能在本類和同包中訪問和使用。
3)protected:能在本類、同包、子類中使用。
4)public:在本類、同包、子類、其它類中使用。
註意:① final修飾的類不能被繼承,沒有子類。
②abstract修飾的類不能被實例化,必須被子類繼承。類只要有一個抽象方法就必定是抽象類,但抽象類不一定要有抽象方法。
- this:代表當前對象
- 內部類:一個類的定義放在另一個類的內部,這個類就叫做內部類。 (仍然是一個獨立的類,在編譯之後內部類會被編譯成獨立的.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學習軌跡【面向對象】(持續更新)