Java第五課. 類&物件

裝14發表於2020-12-07

Java第五課. 類&物件

回顧

1.	冒泡:概念,實現:2for迴圈分別起的作用
2.	二維陣列可以理解成表格:有行有列,行當成一維陣列,列當成一維陣列中的元素,行有下標(幾個一維陣列),列也有下標(一維陣列中的第一個元素)
3.	定義二維陣列:  資料型別[][] 陣列名=new 資料型別[行數][列數]

1. 類和物件

1.1 類的概念與作用

下表列出了物件導向與程式導向的具體區別:
程式導向C物件導向Java
設計思路自頂向下、層次化、分解自底向上、物件化、綜合
程式單元函式模組物件
設計方法程式 = 演算法 + 資料結構程式 = 物件 = 資料 + 方法
優點相互獨立,程式碼共享,效能高接近人的思維方式 模擬客觀世界,容易維護,擴充套件
缺點資料與程式不一致 維護困難客觀世界的無序性 概念不成熟
物件導向的設計可以理解為:
將資料及對資料的操作封裝在一起,成為一個不可分割的整體。
同時將具有相同特徵的物件抽象成一種新的資料型別---; 
通過物件間的訊息傳遞使整個系統運轉,通過類的繼承實現程式碼重用。
概述:類就是一個模板,它是提供同一類物件的屬性和方法.
舉例子:
  世界盃比賽: 足球 球員  教練  裁判...
C羅:  姓名=C羅  身高 190  體重 150 性別:男    踢球(方法)
梅西:  姓名=梅西  身高 170  體重 130 性別:男    踢球(方法)

以球員為例:
	具有共同的屬性:姓名,性別,身高,體重
	具有共同方法:踢球,射門,投球……..
類是描述物件的“基本原型”,它定義一種物件所能擁有的資料和能完成的操作,在物件導向的程式設計中,類是程式的基本單元,最基本的類由一組結構化的資料和在其上的一組操作構成。
               
將多個物件中公共的部分(只關注其中相同或者相似)提取出來(提取的過程,稱為抽象);形成一個集合,這個集合,理解為一些物件的公共特徵和行為,稱為類; 
類是一個模板,是一個概念性模型,我們可以通過類,得到具體的物件:
分析的過程先有物件後有類,開發過程先有類後有物件;

建立物件的語法:
型別 引用名 = new 類名();

1.2 類中的基本構成元素

1.3 物件的概念與作用

概念:具體”明確”的屬性值和方法的1個實體,物件是類的”例項”:實際的例子
舉例子:
  世界盃比賽: 足球 球員  教練  裁判...
球員這個類可以例項化出哪些物件?
C羅:  姓名=C羅  身高 190  體重 150 性別:男    踢球(方法)
梅西:  姓名=梅西身高 170  體重 130 性別:男    踢球(方法)

在Java中萬事萬物皆物件(存在的可以被描述的任何事物)
現實生活中的物件:在座的各位都是物件,電腦,每一臺電腦都是一個物件;
舉例:
xx:個人基本資訊(靜態的描述)  23歲  性別男  愛好:吃
xx:個人基本資訊(靜態的描述)  26歲  性別男  愛好:睡覺
具體說:
個人特徵稱為:屬性    行為稱為:方法
物件=屬性+方法
物件依賴於類存在(模板-個體例項)
分析過程先有物件後有類,但是開發過程先有類後有物件//重點
型別 引用名 = new 類名(); //

2. 類和物件的宣告

2.1 類的基礎宣告形式

2.2 類名命名規範

1. 類的名字由大寫字母開頭而單詞中的其他字母均為小寫;如果類名稱由多個單片語成,則每個單詞的首字母均應為大寫,把這些單詞連線在一起,即不要使用下劃線分割單詞,例如:OrderList
2. 如果類名稱中包含單詞縮寫,則這個所寫詞的每個字母均應大寫,如:XMLExample
3. 由於類是設計用來代表物件的,所以在命名類時應儘量選擇名詞。 如上例的: Bike

2.3 類成員屬性的宣告、初始化與初始值

/**
 * 這個學生類是一個自定義類,這個類會有學生的特徵:學號,姓名,班級,性別等
 * 動作:學習,玩  玩手機  打遊戲 敲程式碼,換裝
 * @author Administrator
 *
 */
public class Student {
    
	//特徵也可以稱為屬性
	//屬性的語法:  修飾符 資料型別 變數名=值;
	String stuNo;
	String stuName;
	int age;
	
	//這個人會有行為(動作)->方法
	//方法的語法:
	/*訪問修飾符  修飾符 返回值的資料型別(void 無返回值) 方法名(引數列表){
		
	}*/
	public static void main(String[] args) {}
	
	//普通方法
	public void play() {
		System.out.println(stuName+"在玩手機~");
	}
	
}

2.4 例項化類的物件

2.41 new 運算子
new 是“為新建物件開闢記憶體空間”的運算子;它以類為模板,開闢空間並例項化一個物件,返回對該物件的一個引用(即該物件所在的記憶體地址);
類名  引用名 = new 類名();
類名  引用名 = new 類名(引數);
測試類:
/**
 * 類是一個模板,是一種概念性的模型,我們可以通過類,得到具體的物件
 * 型別 引用名=new 型別();
 * @author Administrator
 *
 */
public class TestStudent {
	public static void main(String[] args) {
		//型別 引用名(物件名)=new 型別();
		Student stu1=new Student();
		//給某個物件的屬性賦值
		//語法:物件名.屬性/方法
		stu1.stuNo="001";
		stu1.stuName="小明";
		stu1.age=23;
		
		stu1.play();
		
		//再建立一個物件
		Student stu2=new Student();
		//給某個物件的屬性賦值
		//語法:物件名.屬性/方法
		stu2.stuNo="002";
		stu2.stuName="小華";
		stu2.age=26;
		stu2.play();
	}

}

2.5 類和物件關係與區別

	類是同等物件的集合與抽象。它是一塊建立現實物件的模板。物件是類的例項,物件是物件導向程式設計的核心部分,是實際存在的具體實體,具有明確定義的狀態和行為。
練習:自定義一個pig類,這個類中包含了屬性和方法
/**
 * 自定義一個豬類
 * @author Administrator
 *
 */
public class Pig {

    //屬性
	String name;
	int weight;
	
	/**
	 * 吃的方法
	 */
	public void eat() {
		System.out.println(name+"在吃漢堡");
	}
	/**
	 * 介紹
	 */
	public void showInfo() {
		System.out.println("我是"+name+",我的體重"+weight+"kg");
	}
}
測試類:

public class TestPig {

	public static void main(String[] args) {
		// 建立豬類的物件
		Pig pig=new Pig();
		//呼叫屬性
		pig.name="八戒";
		pig.weight=200;
		
		//呼叫方法
		pig.eat();
		pig.showInfo();
		
		//再建立一個物件
		Pig pig2=new Pig();
		//呼叫屬性
		pig2.name="佩奇";
		pig2.weight=200;
		
		//呼叫方法
		pig2.eat();
		pig2.showInfo();

	}

}

八戒在吃漢堡
我是八戒,我的體重200kg
佩奇在吃漢堡
我是佩奇,我的體重200kg
可以這樣改:
/**
 * 自定義一個豬類
 * @author Administrator
 *
 */
public class Pig2 {

    //屬性
	String name;
	int weight;
	
	/**
	 * 吃,能不能不是所有的物件都吃同樣的事物?需要給這個方法增加一個引數
	 * @param food 引數,表示的是方法要正常執行的"前提條件"
	 */
	public void eat(String food) {
		System.out.println(name+"在吃"+food);
	}
	/**
	 * 介紹
	 */
	public void showInfo() {
		System.out.println("我是"+name+",我的體重"+weight+"kg");
	}
}
測試類:
public class TestPig2 {

	public static void main(String[] args) {
		// 建立豬類的物件
		Pig2 pig=new Pig2();
		//呼叫屬性
		pig.name="八戒";
		pig.weight=200;
		
		//呼叫方法
		pig.eat("人蔘果");
		pig.showInfo();
		
		//再建立一個物件
		Pig2 pig2=new Pig2();
		//呼叫屬性
		pig2.name="佩奇";
		pig2.weight=200;
		
		//呼叫方法
		pig2.eat("草莓蛋糕");
		pig2.showInfo();

	}

}

八戒在吃人蔘果
我是八戒,我的體重200kg
佩奇在吃草莓蛋糕
我是佩奇,我的體重200kg

2.6 方法的基本宣告形式

2.7 類中方法的定義:普通方法

2.71 目的
提取共同的程式碼塊放在一個方法內,可以被重複的呼叫。
2.72 方法型別
無引數無返回值方法
有引數無返回值方法
有引數有返回值方法
無引數有返回值方法
import java.util.Scanner;

/**
 * 定義方法求2個數中最大值
 * @author Administrator
 *
 */
public class TestMethod02 {
	Scanner scanner=new Scanner(System.in);
	
	//1.有引數有返回值
	public double getMax(double a,double b) {
		return a>b?a:b;		
	}
	
	//2.無引數無返回值
	public void  getMax2() {
		System.out.println("請輸入2 個數:");
		double a=scanner.nextDouble();
		double b=scanner.nextDouble();
		double max= a>b?a:b;	
		System.out.println(max);
	}
	//3.無引數有返回值
	public double  getMax3() {
		System.out.println("請輸入2 個數:");
		double a=scanner.nextDouble();
		double b=scanner.nextDouble();
		return a>b?a:b;		
	}
	
	//4.有引數,無返回值]
	public void getMax4(double a,double b) {
		double max= a>b?a:b;	
		System.out.println(max);	
	}
2.73 呼叫類方法
1.通過物件名.方法名(實際引數)進行呼叫
		//物件名.方法名
		TestMethod02 th=new TestMethod02();
		//1.有引數有返回值
		double max=th.getMax(20, 66);
		System.out.println(max);
		
		System.out.println("---------------");
		//2.無引數無返回值
		th.getMax2();
		
		//3.無引數有返回值
		double max2=th.getMax3();
		System.out.println(max2);
		
		//4.有引數,無返回值]
		th.getMax4(34, 89);
2.同一個類中方法之間相互呼叫  通過方法名(實際引數)呼叫
//重點
只有在同一個類當中才可以直接通過方法名呼叫,有種情況繼承可以在別的類中呼叫
那是因為子類繼承了父類所有公共的方法,都等於是呼叫自己類中的方法;
3.方法自己呼叫自己,遞迴呼叫,必須杜絕死迴圈情況。
public class TestMethod03 {
	/**
	 * 遞迴
	 * @param n
	 * @return
	 * 階乘 計算n的階乘 5!=5*4*3*2*1
	 */
	public static int cal(int n) {//5
		if (n==1) {
			return 1;
		}
		return n*cal(n-1);//5*4*3*2*1
	}
}
4.static修飾的方法稱為靜態方法,直接使用 類名.靜態方法名(實際引數)呼叫
public class Test {
	public static void main(String[] args) {
		/*System.out.println("遞迴呼叫");
		TestMethod03 th=new TestMethod03();
		int cal=th.cal(5);
		System.out.println("5的階乘:"+cal);
		
		int cal2=th.cal(10);
		System.out.println("10的階乘:"+cal2);*/
        //這裡因為方法改成了static修飾,用物件.方法名(引數)所以會報錯

		// 類名.靜態方法名
		int cal=TestMethod03.cal(5);
		System.out.println("5的階乘:"+cal);
	}

}

2.8 關於return

1.一個方法中的return最多隻能執行一次,return意味這個方法的執行已經終止;
2.這個方法的後續程式碼將不會執行;
3.通過return語句返回對應型別的結果資料,非void方法必須通過return返回結果;
4.void方法中也可以使用不跟著資料的return,表示直接跳出方法執行;
5.void方法中的return是可選的,方法中的程式碼執行完畢後會自然結束

2.9 自定義方法的語法

訪問修飾符 (修飾符) 返回值型別  方法名(引數列表){
   // 方法體
  //  return  值;
}

1.訪問修飾符:public  protected 預設 private;
2.返回值型別:使用 return 關鍵字返回資料,每一個方法只能有一個返回值,返回值型別根據實際情況決定的,取決於返回的值的資料型別。
如果一個方法沒有返回值,則使用void關鍵字進行定義;
3.引數列表:某一個方法執行的時候需要一些前提條件,此時可以將這些條件理解成引數,從外部傳遞進來。引數列表個數0-N個;
方法名(資料型別 形參名, 資料型別 形參名){....}
2.91 定義方法需思考的三點
1.方法是否有返回的結果,如果有,返回什麼型別的結果?
2.明確方法是否需要引數,如果需要,需要幾個什麼型別的引數?
3.方法如何才能正確得到想要的結果?

2.10 方法體中的區域性變數–>變數的作用域

定義在方法體中的區域性變數和類的成員變數之間存在一些差異:
    1.成員變數:在類中定義,在當前物件的內部是共享的;
  	2.區域性變數:在方法中定義,僅在本方法中有效;
比較成員變數區域性變數
定義位置直接在類中定義定義在方法中
宣告賦值可以在宣告時賦初始值;若不賦值,會有預設初始值,基本資料型別的值為0,引用型別的值為null需要顯式初始化後才能使用
作用域在整個類內部都是可見的,所有成員方法都可以使用它,如果訪問許可權允許,還可以在類外部使用僅限於定義它的方法,在該方法外無法訪問它
注意(1)在同一個方法中,不允許有同名的區域性變數。在不同的方法中,可以有同名的區域性變數 (2)區域性變數可以和成員變數同名,並且在使用時,區域性變數具有更高的優先順序
public class Test_var {
	//屬性:成員變數
	//類成員,整數,沒有賦值,預設值是0
	//這個屬性  在當前物件內部是共享的
    int  n;
    public void t1() {
		System.out.println("n:"+n);//0
		n++;
		System.out.println("n:"+n);//n=1
		
	//區域性變數:在方法中定義,僅在本方法中有效
		int i=8;
		System.out.println("i:"+i);
	}//這個方法結束後,i已經被釋放了,把它銷燬
    
    public void t2() {
		n++;
		System.out.println("n:"+n);// 2 在物件內部共享
	//	System.out.println(i);//報錯,i是區域性變數,僅在本方法中有效
	}
    
    public static void main(String[] args) {
    	Test_var tv=new Test_var();
    	tv.t1();
    	tv.t2();
    	
    	Test_var tv2=new Test_var();
    	tv2.t1();
    	tv2.t2();
	}
}
public class Test_var2 {
	int x=10;
	public void t1() {
		System.out.println(++x);//11
	}
	public void t2() {
		System.out.println(x++);//先直接輸出11,然後再加1  
		System.out.println(x);//12
	}
	public void t3() {
		x++;
		System.out.println(x);
	}
	public void t4() {
		System.out.println(x);
	}
	public void t5() {
		int x=20;
		System.out.println(x);
	}

	public static void main(String[] args) {
		Test_var2 tv=new Test_var2();
		//tv.t1();//單獨呼叫11
		//tv.t2();//單獨呼叫10
		
		tv.t3();//11
		tv.t4();//11
		tv.t5();//20
		System.out.println("----------------------");
		Test_var2 tv2=new Test_var2();
		//tv2.t1();//單獨呼叫11
		//tv2.t2();//單獨呼叫10
		
		tv2.t3();//11
		tv2.t4();//11
		tv2.t5();//20
		
		//類的不同物件操作普通變數不會相互影響
	}

}

2.11 引數傳遞:形參和實參

1. [形參]就是一個普通的臨時變數,位置特殊只是為了跳出方法體的作用域以便能夠獲取實參值;
2. 方法體中的程式碼操作的是形參變數,和實參無關,只不過由於需要藉助於實參的資料值,因此在執行方法第一條語句之前,隱式按照引數的位置關係利用實參對相應位置的實參進行了[賦值]操作;

2.12 可變引數與注意事項

有過C語言學習經歷的同學可能對其中的標準輸出函式 printf()非常熟悉,這個函式有個特點,提供格式字串後,根據格式字串中的佔位符,後面可以根據佔位符的個數提供不同的資料變數以供輸出,這種函式的引數稱為:可變引數;
Java1.5增加了可變引數特性,適用於引數個數不確定,型別確定的情況;
2.121 Java中可變引數的特點:
1. Java把可變引數[當做陣列處理];
2. 可變引數必須位於[最後一項]。當可變引數個數多餘一個時,必將有一個不是最後一項,所以[只支援有一個可變引數]。因為引數個數不定,所以當其後邊還有相同型別引數時,java無法區分傳入的引數屬於前一個可變引數還是後邊的引數,所以只能讓可變引數位於最後一項;
3. 可變引數用...代替標識, ...位於變數型別和變數名之間,前後有無空格都可以;
4. 用可變引數的方法時,編譯器為該可變引數隱含建立一個陣列,在方法體中以陣列的形式訪問可變引數;

相關文章