堅持學習Java100天第006天 面向物件

類和物件概述

類是一類具有相同特性的事物的抽象描述,是一組相關屬性和行為的集合。屬性就是該事物的狀態資訊。行為就是在你這個程式中,該狀態資訊要做什麼操作,或者基於事物的狀態能做什麼。

物件是一類事物的一個具體個體(物件並不是找個女朋友)。即物件是類的一個例項,必然具備該類事物的屬性和行為。

需要注意的是,面向物件是一種思想,需要大家話時間沉澱。前期剛開始學的時候,主要還是以理解為主,瞭解程式碼的寫法,掌握大概的思路,多模仿。

學生類

類具備屬性和行為,還可以根據類建立物件。比如我們根據學生抽象出學生類,學生的屬性包括姓名,年齡,性別這些靜態的東西;學生的行為包括學習,考試,上課這些動態的東西。

我們知道了怎麼抽象以後,還需要知道如何透過程式實現。

示例程式碼:

方法的引數和返回值

方法可以傳遞引數,也可以返回內容。比如我們定義一個加法,這個加法可以傳遞要相加的兩個數作為引數,然後將相加的結果返回。

示例程式碼:

可變引數

可變引數,就是支援任意多個同類型的引數。比如實現任意個整數的相加。

示例程式碼:

構造方法和員工類

構造方法是用於輔助建立物件的特殊方法。在IDEA中,可以透過alt+insert快捷鍵快速生成構造方法。

示例:宣告員工類Employee,包含屬性:編號、姓名、年齡、薪資,在main方法中,建立2個員工物件,併為屬性賦值,並列印兩個員工的資訊。

三角形類

宣告一個三角形類Triangle,包含屬性:a,b,c,都是double型別,表示三條邊,包含幾個方法:

lboolean isTriangle():判斷是否是一個三角形

lboolean isRightTriangle():判斷是否是一個直角三角形

lboolean isIsoscelesTriangle():判斷是否是一個等腰三角形

lboolean isEquilateralTriangle():判斷是否是一個等邊三角形

ldouble area():根據三條邊,用海倫公式求面積

ldouble perimeter():求周長

在main方法中建立三角形物件,將三角形的三條邊設定為3,4,5,呼叫方法測試。

示例程式碼:

日期類

宣告一個日期類MyDate,包含屬性:年、月、日。包含以下方法:

lboolean isLeapYear():判斷是否是閏年

lString monthName():根據月份值,返回對應的英語單詞

lint totalDaysOfMonth():返回這個月的總天數

lint totalDaysOfYear():返回這一年的總天數

lint daysOfTheYear():返回這一天是當年的第幾天

在main方法中,建立MyDate物件,賦值為當天日期值,呼叫方法測試。

示例程式碼:

陣列工具類

宣告一個數組工具類ArrayTools,包含如下方法:

lint[] randArr(int min, int max, int length):生成指定區間,指定元素個數的隨機陣列

lint sum(int[] arr):求所有元素總和

lint max(int[] arr):求所有元素的最大值

lint indexOf(int[] arr, int value):查詢value在arr陣列中第一次出現的下標,如果不存在返回-1

lint lastIndexOf(int[] arr, int value):查詢value在arr陣列中最後一次出現的下標,如果不存在返回-1

lvoid sort(int[] arr):對資料進行從小到大排序

lint binaryFind(int[] arr, int value):從排序的陣列中查詢指定值的索引

在的main方法中,呼叫方法測試。

示例程式碼:

方法的過載

Java中的方法是可以過載的。過載是Java中獨有的特性,在其他的程式語言中很少見到這個特性。過載就是同一個方法,引數可以不同,但是返回值相同。好處是呼叫的時候,可以只記住方法名,而不關心引數型別。

這個特性在Python和JavaScript中沒有是可以理解的,因為這兩個語言都是弱型別語言,引數本身就可以是任意型別。

透過以下示例,掌握過載的用法。

宣告MathTools工具類,包含:

lint compare(int a, int b):比較兩個整數大小關係,如果第一個整數比第二個整數大,則返回正整數,如果第一個整數比第二個整數小,則返回負整數,如果兩個整數相等則返回;

lint compare(double a, double b):比較兩個小數大小關係,如果第一個小數比第二個小數大,則返回正整數,如果第一個小數比第二個小數小,則返回負整數,如果兩個小數相等則返回;

lint compare(char a, char b):比較兩個字元大小關係,如果第一個字元比第二個字元編碼值大,則返回正整數,如果第一個字元比第二個字元編碼值小,則返回負整數,如果兩個字元相等則返回;

示例程式碼:

遞迴方法

遞迴方法就是在方法的內部,有呼叫了方法本身。比如,我們透過一個求階乘的方法感受一下。

示例:求n的階乘。

走臺階問題

問題:有n級臺階,一次只能上1步或2步,共有多少種走法?

這個問題需要反過來思考才能比較容易的找到規律。總共有N級臺階,因為每次要麼上1級要麼上2級,因此對於第N級臺階來說,它的前一步要麼是在N-1級處要麼是在N-2級處。在N-1級處時上1級到N級臺階,在N-2級處時上2級到N級臺階。因此,可以用公式表示為

f(n)=f(n-1)+f(n-2)

,其中f(n)表示從第一級開始到第n級有多少種走法。

當然,除了逆向思考外,也可以正面尋找規律。因為每次要不上1級要不上2級,那麼在剛開始時,有兩種選擇,1或2,如果上1級,那麼還剩n-1級,如果上2級,那麼還剩n-2級,所以跟逆向思維一樣得到

f(n)=f(n-1)+f(n-2)

。這就是一個典型的遞迴問題了。像這種公式,在數列中有一個比較著名的數列叫做“斐波那契數列”。

對於這種問題,如果沒有思路,記住公式也可以,就跟學數學一樣。

示例程式碼:

猴子吃桃問題

問題:猴子吃桃子問題,猴子第一天摘下若干個桃子,當即吃了所有桃子的一半,還不過癮,又多吃了一個。第二天又將僅剩下的桃子吃掉了一半,又多吃了一個。以後每天都吃了前一天剩下的一半多一個。到第十天,只剩下一個桃子。試求第一天共摘了多少桃子?

示例程式碼:

學生陣列

生成20個學生資訊,包括姓名,年齡,性別和成績。按照學生的成績排序,然後在控制檯輸出。

示例程式碼:

實現排序功能的關鍵:繼承Comparable介面,實現compareTo方法。如果是升序,使用this減去obj,如果是降序,使用obj減去this。

有了這個基礎以後,我們就可以很好的實現下面的案例了,實現撲克牌的排序。

鬥地主案例升級

生成52張的撲克牌,加上大王和小王,打亂牌的順序。假設有三個人要鬥地主,寫一個程式,給這三個人按照牌的順序每人發17張牌,最後還剩下三張底牌,留給叫地主的人。在控制檯輸出三個玩家的牌和底牌。

升級:在上述需求的基礎上,實現每個玩家手中撲克牌的排序,安裝3、4、5、6、7、8、9、10、J,Q,K,A,2升序。

透過本示例,演示內部類的用法,物件排序的用法,陣列的用法等。大家儘量自己實現幾遍,如果不會,就抄幾遍程式碼,然後再嘗試自己寫。

示例程式碼:

TAG: 示例intlint方法返回