java基礎彙總(二)

讓我們再來總結一下java中的基礎知識,有什麼不對的地方希望大家可以給我指正。

1.在java函數參數傳遞中,只有值傳遞。這裏結合對象的創建在內存中的處理比較好理解。

下面用一個例子來看一下:

class student{
	public String Name;
	public int age;
	public student(String name,int age){
		this.Name=name;
		this.age=age;
		
	}
	public void study(){
		
	System.out.println("好好學習!");
	}
   public String toString(){

	   return "姓名:"+Name +"   年齡:"+ age;
	   
   }
}

public class test{
	public void swap_object(student a,student b){//這裏是交換的整個對象
		   student st;
		   st=a;
		   a=b;
		   b=st;
		}
   public void swap_attribute(student a,student b){
			int age;
			age=a.age;
			a.age=b.age;
			b.age=age;
		}
  public static	void main (String args[]){
	   test t=new test();
	   student student1=new student("小明",18);
	   student student2=new student("小峯",15);
	   //交換前
	   System.out.println("-----------交換前--------------");
	   System.out.println(student1.toString());
	   System.out.println(student2.toString());
	   //第一種交換後
	   System.out.println("-----------第一種交換後--------------");
	   t.swap_object(student1,student2);
	   System.out.println(student1.toString());
	   System.out.println(student2.toString());
	   //第二種交換後
	   System.out.println("-----------第二種交換後--------------");
	   t.swap_attribute(student1, student2);
	   System.out.println(student1.toString());
	   System.out.println(student2.toString());
		
	}	
}
輸出的結果爲:

-----------交換前--------------
姓名:小明   年齡:18
姓名:小峯   年齡:15
-----------第一種交換後--------------
姓名:小明   年齡:18
姓名:小峯   年齡:15
-----------第二種交換後--------------
姓名:小明   年齡:15
姓名:小峯   年齡:18
從結果中我們也看出來了,在第一種交換後結果並沒有發生改變,第二種卻發生了改變,下面我劃一下內存圖來看一下或許會更明白爲什麼是值傳遞了



由圖我們可以把變量student1與變量student2看做爲指針(不知道這樣說對不對),在我們調用swap方法時我們傳遞了這兩個變量,而這兩個變量存儲的是對象的地址,當調用函數時,函數會在內存中開闢兩塊空間做這兩個變量的副本,在第一中方法中我們在函數內申請了一個對象變量,然後將副本中的內容作了對換,但是對實參沒有產生影響,所以結果還是交換前的結果。第二種方式,雖然還是會在內存分配副本,但是我們操作的是副本里的值(副本的值跟實參的值是一樣的,都是對象的地址)所指向的對象的成員變量,操作後的結果就是對對象實際的操作,故我們會看到第二種結果中年齡交換了。

對於函數參數爲基本類型的那更容易理解,就是創建實參的副本,進行操作。實際上並沒有改變實參本身。

2.抽象類中的知識點

抽象類是指在class前有關鍵字abstract的類,這種類有些地方需要我們注意。

(1)抽象類可以定義構造方法,但是不能抽調用自身的構造方法,必須通過子類來創建對象。即抽象類不能實例化

(2)抽象類可以沒有抽象方法,若一個類中有抽象方法,那麼這個類一定要聲明爲抽象類。

(3)抽象方法只允許定義方法,不允許實現方法,也就是不能有方法體。

(4)若一個類繼承了抽象類,那麼子類必須實現父類的全部方法,否則一定要聲明爲抽象類。

(5)抽象類中的抽象方法不能爲private類型的。

(6)測試了一下,抽象類中可以有static成員方法,但是不能有抽象的靜態方法。

總結5,6點就是說明抽象方法是要被繼承來重寫的,所以不能爲private類型的跟static類型的,因爲private類型的不可以被繼承,static的不可以被重寫。
3.接口知識點

(1)接口是公開的,接口的屬性都是public static final類型的常量。方法都是public abstract類型的抽象方法。也就是沒有成員變量跟非抽象成員函數。

(2)接口可以實現多繼承,通過關鍵字extends繼承多個接口,但是不能繼承類或者是抽象類。

(3)允許抽象類實現接口,但是不允許抽象類繼承接口。

(4)接口沒有構造方法,也不能定義構造方法。

(5)當實現某個接口時,必須實現接口的所有抽象方法,否則該類必須聲明爲抽象類。

(6)當實現接口方法時,子類方法一定是public類型的。


上次時間問題,內部類的注意事項沒來得及寫,今天補上

4.內部類的一些知識點。

外部類與內部類是相對而言,一旦編譯成功,就會成爲完全不同的兩類。對於一個名爲outer的外部類和其內部定義的名爲inner的內部類。編譯完成後出現outer.class和outer$inner.class兩類。

(1)對於內部類來說可以分爲局部內部類(在方法中寫的類)跟成員內部類,成員內部類又可以分爲實例內部類跟靜態內部類

(2)內部類可以訪問外部類的所有成員,包括私有成員。對於靜態內部類來說只能訪問外部類的靜態成員。

(2)實例內部類中不能有靜態變量跟靜態方法,爲什麼呢? 這是因爲內部類對象的實例化與外部類的對象有關,必須在獲得外部類實例的前提下纔可以實例化內部類。

舉例來說外部類爲Outer類,其內部類爲Inner類 ,如果在外部類以外的類中獲得內部類對象必須這樣獲得: Outer.Inner object=new Outer().new Inner();

(3)靜態內部類不需要通過外部類的實例來創建。Outer.Inner object=new Outer.Inner(); 所以靜態內部類中可以有非靜態成員與靜態成員

(4)局部內部類是指在方法中定義的類,其可以訪問外部類中的成員,但只能訪問所在方法中的final類型的參數或者是變量。局部內部類只在該方法中有效,不能被外部類跟外部類以外的其他類訪問。局部內部類沒有訪問修飾符(public,private)跟static關鍵字修飾,這跟局部變量是一樣的。

(5)既然內部類只是形式上在內部,編譯完後成爲兩個類,那麼外部類與內部類就可以定義名字相同的成員,而區分相同名稱的變量要加上類名來區別。

例如:外部類Outer與內部類Inner都定義了變量x,在內部類Inner中訪問自身的x可以用this.x或者是Inner.this.x;如果是訪問外部類中的變量x,則這樣訪問Outer.this.x;

(6)關於匿名類要注意的是 其形式:new 類名/或者是接口 {}的形式,如果是new的抽象類或者是接口,一定要實現抽象方法。也可以重寫類中的方法。匿名類不會自動結成object類,匿名類沒有構造方法。如果匿名類定義在方法中時,也跟局部內部類一樣訪問方法中的參數或者是變量必須是final類型的。

發佈了31 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章