Java第五課. 類&物件
回顧
1. 冒泡:概念,實現:2個for迴圈分別起的作用
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 類成員屬性的宣告、初始化與初始值
public class Student {
String stuNo;
String stuName;
int age;
public static void main(String[] args) {}
public void play() {
System.out.println(stuName+"在玩手機~");
}
}
2.4 例項化類的物件
2.41 new 運算子
new 是“為新建物件開闢記憶體空間”的運算子;它以類為模板,開闢空間並例項化一個物件,返回對該物件的一個引用(即該物件所在的記憶體地址);
類名 引用名 = new 類名();
類名 引用名 = new 類名(引數);
測試類:
public class TestStudent {
public static void main(String[] args) {
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類,這個類中包含了屬性和方法
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
可以這樣改:
public class Pig2 {
String name;
int weight;
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;
public class TestMethod02 {
Scanner scanner=new Scanner(System.in);
public double getMax(double a,double b) {
return a>b?a:b;
}
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);
}
public double getMax3() {
System.out.println("請輸入2 個數:");
double a=scanner.nextDouble();
double b=scanner.nextDouble();
return a>b?a:b;
}
public void getMax4(double a,double b) {
double max= a>b?a:b;
System.out.println(max);
}
2.73 呼叫類方法
1.通過物件名.方法名(實際引數)進行呼叫
TestMethod02 th=new TestMethod02();
double max=th.getMax(20, 66);
System.out.println(max);
System.out.println("---------------");
th.getMax2();
double max2=th.getMax3();
System.out.println(max2);
th.getMax4(34, 89);
2.同一個類中方法之間相互呼叫 通過方法名(實際引數)呼叫
只有在同一個類當中才可以直接通過方法名呼叫,有種情況繼承可以在別的類中呼叫
那是因為子類繼承了父類所有公共的方法,都等於是呼叫自己類中的方法;
3.方法自己呼叫自己,遞迴呼叫,必須杜絕死迴圈情況。
public class TestMethod03 {
public static int cal(int n) {
if (n==1) {
return 1;
}
return n*cal(n-1);
}
}
4.用static修飾的方法稱為靜態方法,直接使用 類名.靜態方法名(實際引數)呼叫
public class Test {
public static void main(String[] args) {
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 自定義方法的語法
訪問修飾符 (修飾符) 返回值型別 方法名(引數列表){
}
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 {
int n;
public void t1() {
System.out.println("n:"+n);
n++;
System.out.println("n:"+n);
int i=8;
System.out.println("i:"+i);
}
public void t2() {
n++;
System.out.println("n:"+n);
}
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);
}
public void t2() {
System.out.println(x++);
System.out.println(x);
}
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.t3();
tv.t4();
tv.t5();
System.out.println("----------------------");
Test_var2 tv2=new Test_var2();
tv2.t3();
tv2.t4();
tv2.t5();
}
}
2.11 引數傳遞:形參和實參
1. [形參]就是一個普通的臨時變數,位置特殊只是為了跳出方法體的作用域以便能夠獲取實參值;
2. 方法體中的程式碼操作的是形參變數,和實參無關,只不過由於需要藉助於實參的資料值,因此在執行方法第一條語句之前,隱式按照引數的位置關係利用實參對相應位置的實參進行了[賦值]操作;
2.12 可變引數與注意事項
有過C語言學習經歷的同學可能對其中的標準輸出函式 printf()非常熟悉,這個函式有個特點,提供格式字串後,根據格式字串中的佔位符,後面可以根據佔位符的個數提供不同的資料變數以供輸出,這種函式的引數稱為:可變引數;
Java1.5增加了可變引數特性,適用於引數個數不確定,型別確定的情況;
2.121 Java中可變引數的特點:
1. Java把可變引數[當做陣列處理];
2. 可變引數必須位於[最後一項]。當可變引數個數多餘一個時,必將有一個不是最後一項,所以[只支援有一個可變引數]。因為引數個數不定,所以當其後邊還有相同型別引數時,java無法區分傳入的引數屬於前一個可變引數還是後邊的引數,所以只能讓可變引數位於最後一項;
3. 可變引數用...代替標識, ...位於變數型別和變數名之間,前後有無空格都可以;
4. 用可變引數的方法時,編譯器為該可變引數隱含建立一個陣列,在方法體中以陣列的形式訪問可變引數;