隨筆(二)

一:方法的重寫(兩同兩小一大!)

1.方法名和參數列表相同,子類返回值的類型應該<=父類的,子類拋出的異常類型應該<=父類的,子類的訪問權限應該   >=父類的

2.如果父類的方法被private修飾了,則子類訪問不到,所以也就不能被重寫
  因此,如果這時子類中有一個跟父類中private方法一模一樣的,那也不是重寫,只是子類的一個新方法!

二:靜態方法中爲什麼不能有this和super?(爲什麼被static修飾的方法,代碼塊不能出現實例變量?)

1.因爲static修飾的方法是屬於類的,該方法的調用者可能是一個類,而不是一個對象,
而thissuper是分別是子類對象和父類對象的引用!

2.因爲被static修飾的成員是屬於類的,類成員的作用域比實例成員的作用域更大,
因此完全可能出現類成員已經初始化完成,但實例成員還不曾初始化,如果允許類成員訪問實例成員將會引起錯誤!!

三:多態:

1.java引用變量有兩個類型,一個是編譯時的類型,一個運行時的類型,如果兩個類型不一致,就會出現多態!
  也就是所說的父類引用指向子類對象!(向上轉型!)
  方法具備多態性,但屬性不具備!

2.引用變量只能調用它編譯時類型的方法,而不能直接調用它運行時類型的方法,
  但如果實在想調用運行時類型的方法,就只能強制轉換了!

3.如果想強轉成子類,那麼必須滿足編譯時的類型是父類類型,而運行時類型是該子類類型
  例如:想強轉成String,因爲obj運行時類型就是String類型的,所以可以強轉
  Object obj = "hello world";
  String str = (String)obj;
======================================
  Object obj = 123;
  String str = (String)obj;
  這樣就會報: ClassCastException!
=====================================
爲了避免這種情況,應該使用instanceOf關鍵字
dog instanceOf Animal 用於判斷dog對象是否是Animal類的子類或者實現類的實例! 
Object obj = 123;//你想要強轉成String,那我先判斷你,是不是String這種類型的
if(obj instanceOf String){
	String str = (String)obj;
}

四:final修飾基本數據類型和引用數據類型的區別!

1.final修飾基本數據類型的變量時,不能再對該變量重新賦值了,而且final修飾基本數據類型的變量,在編譯時   就可以確定該變量的值!所以也可以說被final修飾的變量,也就是個常量,因此變量名也可以像常量一樣大寫,單   詞之間用_連接!!
  例如:public static final int   MIN_VALUE = 0x80000000;

2.final修飾的是引用類型的變量,它保存的也就是一個對象的引用,就是一個地址值,final只保證這個引用的地   址不會改變,即一直引用該對象,但該對象是可以改變的!,當final修飾的是引用類型的變量時,由於不能在編譯   時就獲取值,因此不需要採用常量規則定義
  例如:final List list = new ArrayList();

3.final修飾的成員變量
  實例變量:要麼在定義該變量的時候賦初始值!,要麼在構造代碼塊中,要麼在構造器中,不能不賦值!
  類變量:要麼在定義該變量的時候賦初始值!,要麼在靜態代碼塊中。
  
4.final修飾的類:不能有子類,比如:String,Math類,和基本類型的包裝類!
public class Demo {
	
	private String name;
	
	public void setName(String name) {
		this.name = name;
	}
	
	public String getName() {
		return name;
	}

	public static void main(String[] args) {
		final int a = 10;
//		a = 20; 報錯!
		
		final int[] arr = {1,2,3};
		arr[1] = 20;
//		arr = null; //報錯!
		
		final Demo demo = new Demo();
		demo.setName("tom");
		System.out.println(demo.getName());
		
//		demo = null; //報錯!
		
		//總結:被final修飾的變量,一定被賦值了,那麼該變量的“=”就不能再次使用了!,注意是針對於該變量!
	}

}

五:不可變類!

不可變類:就是創建該類的實例後,該實例中的屬性是不可改變的!

如果想自定義不可變類
1.使用privatefinal修飾符來修飾該類的成員變量!
2.提供有參構造,根據傳入的參數來初始化類中的屬性!,不要提供無參構造!
3.只提供get方法,不提供set方法,因爲普通方法也無法修改final修飾的屬性
4.如果有必要就重寫hashcode和equals方法!
注:String類就是這樣做的!
public class Test {

	public static void main(String[] args) {
		//
		/**
		 * 構造器這裏爲成員變量初始化,那麼肯定有一個實例變量來接收這個值,
		 * 查看源碼,發現Double類中定義了private final double value;
		 * 它也沒爲這個變量提供set方法,你操作不到這個變量,所以該成員變量的值你是無法改變的!
		 * 所以Double是一個良好的不可變類!
		 */
		Double d = new Double(6.5);
	}
}

六:abstract不能和哪些關鍵字同時使用

1.abstract爲什麼不能和final同時使用?
因爲abstract修飾的類,表明這個類需要被繼承,abstract修飾方法,表明該方法應該被重寫!
而final修飾的類不能被繼承,final修飾的方法不能被重寫!

2.abstract爲什麼不能和static同時修飾一個方法?
因爲abstract修飾的方法是一個抽象方法,而static修飾的方法是一個類方法,
類方法一般通過類來調用,當類調用一個沒有方法體的方法是會報錯的。

3.abstract爲什麼不能和private同時使用?
因爲abstract修飾的方法,就是希望被子類重寫,這樣纔有意義,否則這個方法永遠不會有方法體!
如果被private修飾,那麼子類根本訪問不到該方法,又何來的重寫呢?,因此abstract不能和private同時修飾一個方法!

來自:雖然帥,但是菜的cxy

​ 每天進步一點點

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