final關鍵字、static關鍵字、匿名對象與內部類

        final關鍵字        有些類在描述完之後,不想被繼承,或者有些類中的部分方法功能是固定的,不想讓子類重寫。這時需要用到一個關鍵字final,final的意思爲最終,不可變。

        final是個修飾符,可以用來修飾類,類的成員,以及局部變量。

        final修飾類不可以被繼承,但是可以繼承其他類

class Yy {}
final class Fu extends Yy{} //可以繼承Yy類
class Zi extends Fu{} //不能繼承Fu類

        final修飾的方法不可以被覆蓋,但父類中沒有被final修飾方法,子類覆蓋後可以加final。

class Fu {
	// final修飾的方法,不可以被覆蓋,但可以繼承使用
    public final void method1(){}
    public void method2(){}
}
class Zi extends Fu {
	//重寫method2方法
	public final void method2(){}
}

        final修飾的變量稱爲常量,這些變量只能被賦值一次。

final int i = 20;
i = 30; //賦值報錯,final修飾的變量只能賦值一次

        引用類型的變量值爲對象地址值,地址值不能更改,但是地址內的對象屬性值可以修改。

final Person p = new Person();
Person p2 = new Person();
p = p2; //final修飾的變量p,所記錄的地址值不能改變
p.name = "小明";//可以更改p對象中name屬性值

        修飾成員變量,需要在創建對象前賦值,否則報錯。

class Demo {
	//直接賦值
	final int m = 100;
	
	//final修飾的成員變量,需要在創建對象前賦值,否則報錯。
	final int n; 
	public Demo(){
		//可以在創建對象時所調用的構造方法中,爲變量n賦值
		n = 2016;
	}
}

        static關鍵字        當在定義類的時候,類中都會有相應的屬性和方法。而屬性和方法都是通過創建本類對象調用的。當在調用對象的某個方法時,這個方法沒有訪問到對象的特有數據時,方法創建這個對象有些多餘。不創建對象方法又調用不了。可以通過static關鍵字來實現不創建對象就可以調用方法。

        static是靜態修飾符,一般用來修飾類中的成員。

        被static修飾的成員變量屬於類,不屬於這個類的某個對象。(也就是說,多個對象在訪問或修改static修飾的成員變量時,其中一個對象將static成員變量值進行了修改,其他對象中的static成員變量值跟着改變,即多個對象共享同一個static成員變量

class Demo {
	public static int num = 100;
}

class Test {
	public static void main(String[] args) {
		Demo d1 = new Demo();
		Demo d2 = new Demo();
		d1.num = 200;
		System.out.println(d1.num); //結果爲200
		System.out.println(d2.num); //結果爲200
	}
}

        被static修飾的成員可以並且建議通過類名直接訪問。訪問靜態變量的格式:

        類名.靜態成員變量名

        類名.靜態成員方法名(參數)

        對象名.靜態成員變量名     ------不建議使用該方式,會出現警告

        對象名.靜態成員方法名(參數) ------不建議使用該方式,會出現警告

class Demo {
	//靜態成員變量
	public static int num = 100;
	//靜態方法
	public static void method(){
		System.out.println("靜態方法");
	}
}
class Test {
	public static void main(String[] args) {
		System.out.println(Demo.num);
		Demo.method();
	}
}

        靜態內容是優先於對象存在,只能訪問靜態,不能使用this/super。靜態修飾的內容存在於靜態區。

class Demo {
	//成員變量
	public int num = 100;
	//靜態方法
	public static void method(){
		//this.num; 不能使用this/super。
		System.out.println(this.num);
	}
}

        同一個類中,靜態成員只能訪問靜態成員

class Demo {
	//成員變量
	public int num = 100;
	//靜態成員變量
	public static int count = 200;
	//靜態方法
	public static void method(){
		//System.out.println(num); 靜態方法中,只能訪問靜態成員變量或靜態成員方法
		System.out.println(count);
	}
}

        main方法爲靜態方法僅僅爲程序執行入口,不屬於任何一個對象,可以定義在任意類中。

        定義靜態常量        通常使用public static final 修飾的變量 來完成靜態常量的定義。此時變量名用全部大寫,多個單詞使用下劃線連接。定義格式: public static final 數據類型 變量名 = 值;

class Company {
	public static final String COMPANY_NAME = "紅後科技";
	public static void method(){
		System.out.println("一個靜態方法");
	}
}

        當想使用類的靜態成員時,不需要創建對象,直接使用類名來訪問即可。

System.out.println(Company.COMPANY_NAME); //打印“紅後科技”
Company.method(); // 調用一個靜態方法

        注意:接口中的每個成員變量都默認使用public static final 修飾。

                  所有接口中的成員變量已是靜態常量,由於接口沒有構造方法,所以必須顯示賦值。可以直接用接口名訪問。

interface Inter {
	public static final int COUNT = 100;
}

//訪問接口中的靜態變量
Inter.COUNT

        匿名對象        匿名對象是指創建對象時,只有創建對象的語句,卻沒有把對象地址值賦值給某個變量。

        已經存在的類:

public class Person{
	public void eat(){
		System.out.println();
}
}

        創建一個普通對象:

Person p = new Person();

        創建一個匿名對象:

new Person();

        匿名對象的特點

        創建匿名對象直接使用,沒有變量名。

new Person().eat()  //eat方法被一個沒有名字的Person對象調用了。

        匿名對象在沒有指定其引用變量時,只能使用一次。

new Person().eat(); 創建一個匿名對象,調用eat方法
new Person().eat(); 想再次調用eat方法,重新創建了一個匿名對象

        匿名對象可以作爲方法接收的參數、方法返回值使用

class Demo {
	public static Person getPerson(){
		//普通方式
		//Person p = new Person();	
		//return p;
		
		//匿名對象作爲方法返回值
		return new Person(); 
	}
	
	public static void method(Person p){}
}

class Test {
	public static void main(String[] args) {
		//調用getPerson方法,得到一個Person對象
		Person person = Demo.getPerson();
		
		//調用method方法
		Demo.method(person);
		//匿名對象作爲方法接收的參數
		Demo.method(new Person());
	}
}

        內部類        將類寫在其他類的內部,可以寫在其他類的成員位置和局部位置,這時寫在其他類內部的類就稱爲內部類。其他類也稱爲外部類。

        在描述事物時,若一個事物內部還包含其他可能包含的事物,比如在描述汽車時,汽車中還包含發動機,這時發動機就可以使用內部類來描述。

class 汽車 { //外部類
	class 發動機 { //內部類
}
}

        內部類分爲成員內部類與局部內部類。定義內部類時,就是一個正常定義類的過程,同樣包含各種修飾符、繼承與實現關係等。        在內部類中可以直接訪問外部類的所有成員。      

        成員內部類,定義在外部類中的成員位置。與類中的成員變量相似,可通過外部類對象進行訪問

        定義格式:
class 外部類 { 
	修飾符 class 內部類 {
		//其他代碼
}
}

        訪問方式:外部類名.內部類名 變量名 = new 外部類名().new 內部類名();

        局部內部類,定義在外部類方法中的局部位置。與訪問方法中的局部變量類似,可通過調用方法進行訪問。

        定義格式:

class 外部類 { 
	修飾符 返回值類型 方法名(參數) {
class 內部類 {
//其他代碼
}
}
}
        訪問方式:在外部類方法中,創建內部類對象,進行訪問

        匿名內部類        是創建某個類型子類對象的快捷方式。

        格式:

new 父類或接口(){
	//進行方法重寫
};

        使用匿名對象的方式,將定義子類與創建子類對象兩個步驟由一個格式一次完成,。雖然是兩個步驟,但是兩個步驟是連在一起完成的。

        匿名內部類如果不定義變量引用,則也是匿名對象。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章