類
在標(biāo)題為面向?qū)ο蟮木幊谈拍钫n程中對面向?qū)ο蟾拍畹慕榻B以自行車課為例,以賽車,山地自行車和雙人自行車為子類,下面是可能實(shí)現(xiàn)Bicycle類的示例代碼,為你提供類聲明的概述,本課程的后續(xù)部分將逐步備份和解釋類聲明,目前,不要關(guān)心細(xì)節(jié)。
public class Bicycle { // the Bicycle class has // three fields public int cadence; public int gear; public int speed; // the Bicycle class has // one constructor public Bicycle(int startCadence, int startSpeed, int startGear) { gear = startGear; cadence = startCadence; speed = startSpeed; } // the Bicycle class has // four methods public void setCadence(int newValue) { cadence = newValue; } public void setGear(int newValue) { gear = newValue; } public void applyBrake(int decrement) { speed -= decrement; } public void speedUp(int increment) { speed += increment; } }
作為Bicycle的子類的MountainBike類的類聲明可能如下所示:
public class MountainBike extends Bicycle { // the MountainBike subclass has // one field public int seatHeight; // the MountainBike subclass has // one constructor public MountainBike(int startHeight, int startCadence, int startSpeed, int startGear) { super(startCadence, startSpeed, startGear); seatHeight = startHeight; } // the MountainBike subclass has // one method public void setHeight(int newValue) { seatHeight = newValue; } }
MountainBike繼承了Bicycle的所有字段和方法,并增加了seatHeight和設(shè)置它的方法(山地自行車有座位,可以根據(jù)地形要求上下移動)。
聲明類你已經(jīng)看到以下列方式定義的類:
class MyClass { // field, constructor, and // method declarations }
這是一個類聲明,類主體(大括號之間的區(qū)域)包含為從類創(chuàng)建的對象的生命周期提供的所有代碼:用于初始化新對象的構(gòu)造函數(shù),提供類及其對象狀態(tài)的字段的聲明,以及實(shí)現(xiàn)類及其對象行為的方法。
前面的類聲明是最小的,它僅包含類聲明所需的那些組件,你可以在類聲明的開頭提供有關(guān)該類的更多信息,例如其超類的名稱,是否實(shí)現(xiàn)任何接口等等,例如:
class MyClass extends MySuperClass implements YourInterface { // field, constructor, and // method declarations }
表示MyClass是MySuperClass的子類,它實(shí)現(xiàn)了YourInterface接口。
你也可以在最開始添加public或private等修飾符 — 這樣你就可以看到類聲明的開頭行可能變得非常復(fù)雜,public和private修飾符決定了其他類可以訪問MyClass的內(nèi)容,本課程稍后將對此進(jìn)行討論。關(guān)于接口和繼承的課程將解釋如何以及為什么在類聲明中使用extends和implements關(guān)鍵字,目前你不需要擔(dān)心這些額外的。
通常,類聲明可以按順序包含這些組件:
修飾符,例如public、private以及稍后你將遇到的許多其他修飾符。
類名,首字母大寫。
類的父級(超類)的名稱(如果有)以關(guān)鍵字extends開頭,一個類只能extend(子類)一個父類。
由類實(shí)現(xiàn)的以逗號分隔的接口列表(如果有),前面是關(guān)鍵字implements,一個類可以implement多個接口。
類體,被括號圍繞,{}。
聲明成員變量有幾種變量:
類中的成員變量 — 這些變量稱為字段。
方法或代碼塊中的變量 — 這些變量稱為局部變量。
方法聲明中的變量 — 這些變量稱為參數(shù)。
Bicycle類使用以下代碼行來定義其字段:
public int cadence; public int gear; public int speed;
字段聲明按順序由三個部分組成:
零個或多個修飾符,例如public或private。
該字段的類型。
該字段的名稱。
Bicycle的字段被命名為cadence、gear和speed,并且都是整數(shù)數(shù)據(jù)類型(int),public關(guān)鍵字將這些字段標(biāo)識為公共成員,可由任何可以訪問該類的對象訪問。
訪問修飾符使用的第一個(最左側(cè))修飾符允許你控制哪些其他類可以訪問成員字段,目前,只考慮public和private,其他訪問修飾符將在后面討論。
public修飾符 — 可以從所有類訪問該字段。
private修飾符 — 該字段只能在其自己的類中訪問。
本著封裝的精神,將字段設(shè)為private是很常見的,這意味著它們只能從Bicycle類直接訪問,但是,我們?nèi)匀恍枰L問這些值,這可以通過添加為我們獲取字段值的公共方法間接完成:
public class Bicycle { private int cadence; private int gear; private int speed; public Bicycle(int startCadence, int startSpeed, int startGear) { gear = startGear; cadence = startCadence; speed = startSpeed; } public int getCadence() { return cadence; } public void setCadence(int newValue) { cadence = newValue; } public int getGear() { return gear; } public void setGear(int newValue) { gear = newValue; } public int getSpeed() { return speed; } public void applyBrake(int decrement) { speed -= decrement; } public void speedUp(int increment) { speed += increment; } }類型
所有變量都必須具有類型,你可以使用原始類型,如int、float、boolean等,或者你可以使用引用類型,例如字符串、數(shù)組或?qū)ο蟆?/p> 變量名
所有變量(無論是字段、局部變量還是參數(shù))都遵循“語言基礎(chǔ)”課程“變量命名”中介紹的相同命名規(guī)則和約定。
在本課程中,請注意相同的命名規(guī)則和約定用于方法和類名稱,除了:
類名的第一個字母應(yīng)該大寫。
方法名稱中的第一個(或唯一)單詞應(yīng)該是動詞。
定義方法以下是典型方法聲明的示例:
public double calculateAnswer(double wingSpan, int numberOfEngines, double length, double grossTons) { //do the calculation here }
方法聲明中唯一必需的元素是方法的返回類型、名稱、一對圓括號()和大括號之間的主體{}。
更一般地,方法聲明有六個組件,順序如下:
修飾符 — 例如public、private和其他你將在稍后了解的內(nèi)容。
返回類型 — 方法返回的值的數(shù)據(jù)類型,如果方法未返回值,則返回void。
方法名稱 — 字段名稱的規(guī)則也適用于方法名稱,但約定略有不同。
括號中的參數(shù)列表 — 以逗號分隔的輸入?yún)?shù)列表,前面是數(shù)據(jù)類型,括在括號中(),如果沒有參數(shù),則必須使用空括號。
一個異常列表 — 稍后討論。
括號之間的方法體 — 方法的代碼,包括局部變量的聲明,在這里。
修飾符、返回類型和參數(shù)將在本課程的后面部分討論,異常將在后面的課程中討論。
定義:方法聲明的兩個組件包括方法簽名 — 方法的名稱和參數(shù)類型。
上面聲明的方法的簽名是:
calculateAnswer(double, int, double, double)命名方法
雖然方法名稱可以是任何合法標(biāo)識符,但代碼約定限制方法名稱,按照慣例,方法名稱應(yīng)該是小寫的動詞或以小寫的動詞開頭的多單詞名稱,后跟形容詞、名詞等。在多單詞名稱中,第二個和后面每個單詞的第一個字母應(yīng)該大寫,這里有些例子:
run runFast getBackground getFinalData compareTo setX isEmpty
通常,方法在其類中具有唯一名稱,但是,由于方法重載,方法可能與其他方法具有相同的名稱。
重載方法Java編程語言支持重載方法,Java可以區(qū)分具有不同方法簽名的方法,這意味著如果類中的方法具有不同的參數(shù)列表,則它們可以具有相同的名稱(有一些條件,將在標(biāo)題為“接口和繼承”的課程中討論)。
假設(shè)你有一個類可以使用書法來繪制各種類型的數(shù)據(jù)(字符串、整數(shù)等),并且包含繪制每種數(shù)據(jù)類型的方法,為每個方法使用新名稱很麻煩 — 例如,drawString、drawInteger、drawFloat等等。在Java編程語言中,你可以對所有繪圖方法使用相同的名稱,但是為每個方法傳遞不同的參數(shù)列表,因此,數(shù)據(jù)繪圖類可能會聲明四個名為draw的方法,每個方法都有一個不同的參數(shù)列表。
public class DataArtist { ... public void draw(String s) { ... } public void draw(int i) { ... } public void draw(double f) { ... } public void draw(int i, double f) { ... } }
重載方法由傳遞給方法的參數(shù)的數(shù)量和類型區(qū)分,在代碼示例中,draw(String s)和draw(int i)是不同且唯一的方法,因?yàn)樗鼈冃枰煌膮?shù)類型。
你不能聲明具有相同名稱和相同數(shù)量和類型的參數(shù)的多個方法,因?yàn)榫幾g器無法區(qū)分它們。
在區(qū)分方法時編譯器不考慮返回類型,因此即使它們具有不同的返回類型,也不能聲明具有相同簽名的兩個方法。
注意:應(yīng)謹(jǐn)慎使用重載方法,因?yàn)樗鼈儠勾a的可讀性降低。為你的類提供構(gòu)造函數(shù)
類包含被調(diào)用以從類藍(lán)圖創(chuàng)建對象的構(gòu)造函數(shù),構(gòu)造函數(shù)聲明看起來像方法聲明 — 除了它們使用類的名稱并且沒有返回類型,例如,Bicycle有一個構(gòu)造函數(shù):
public Bicycle(int startCadence, int startSpeed, int startGear) { gear = startGear; cadence = startCadence; speed = startSpeed; }
要創(chuàng)建一個名為myBike的新Bicycle對象,new運(yùn)算符將調(diào)用構(gòu)造函數(shù):
Bicycle myBike = new Bicycle(30, 0, 8);
new Bicycle(30, 0, 8)為對象創(chuàng)建內(nèi)存空間并初始化其字段。
雖然Bicycle只有一個構(gòu)造函數(shù),但它可能有其他構(gòu)造函數(shù),包括一個無參構(gòu)造函數(shù):
public Bicycle() { gear = 1; cadence = 10; speed = 0; }
Bicycle yourBike = new Bicycle();調(diào)用無參構(gòu)造函數(shù)來創(chuàng)建一個名為yourBike的新Bicycle對象。
兩個構(gòu)造函數(shù)都可以在Bicycle中聲明,因?yàn)樗鼈兙哂胁煌膮?shù)列表,與方法一樣,Java平臺根據(jù)列表中的參數(shù)數(shù)量及其類型來區(qū)分構(gòu)造函數(shù)。你不能為相同類編寫兩個具有相同參數(shù)數(shù)量和類型的構(gòu)造函數(shù),因?yàn)槠脚_無法區(qū)分它們,這樣做會導(dǎo)致編譯時錯誤。
你不必為你的類提供任何構(gòu)造函數(shù),但在執(zhí)行此操作時必須小心,編譯器自動為沒有構(gòu)造函數(shù)的任何類提供無參數(shù)的默認(rèn)構(gòu)造函數(shù),此默認(rèn)構(gòu)造函數(shù)將調(diào)用超類的無參數(shù)構(gòu)造函數(shù),在這種情況下,如果超類沒有無參數(shù)構(gòu)造函數(shù),編譯器將會報錯,因此你必須驗(yàn)證它是否有,如果你的類沒有顯式的超類,那么它有一個隱式的超類Object,它有一個無參數(shù)的構(gòu)造函數(shù)。
你可以自己使用超類構(gòu)造函數(shù),本課開頭的MountainBike類就是這樣做的,稍后將在有關(guān)接口和繼承的課程中對此進(jìn)行討論。
你可以在構(gòu)造函數(shù)的聲明中使用訪問修飾符來控制哪些其他類可以調(diào)用構(gòu)造函數(shù)。
注意:如果另一個類不能調(diào)用MyClass構(gòu)造函數(shù),則無法直接創(chuàng)建MyClass對象。將信息傳遞給方法或構(gòu)造函數(shù)
方法或構(gòu)造函數(shù)的聲明聲明該方法或構(gòu)造函數(shù)的參數(shù)的數(shù)量和類型,例如,以下是根據(jù)貸款金額、利率、貸款期限(期數(shù))和貸款的未來價值計算住房貸款的每月付款的方法:
public double computePayment( double loanAmt, double rate, double futureValue, int numPeriods) { double interest = rate / 100.0; double partial1 = Math.pow((1 + interest), - numPeriods); double denominator = (1 - partial1) / interest; double answer = (-loanAmt / denominator) - ((futureValue * partial1) / denominator); return answer; }
此方法有四個參數(shù):貸款金額、利率、未來價值和期數(shù),前三個是雙精度浮點(diǎn)數(shù),第四個是整數(shù),參數(shù)在方法體中使用,并且在運(yùn)行時將采用傳入的參數(shù)的值。
注意:參數(shù)是指方法聲明中的變量列表,參數(shù)是調(diào)用方法時傳遞的實(shí)際值,調(diào)用方法時,使用的參數(shù)必須與聲明參數(shù)的類型和順序匹配。參數(shù)類型
你可以將任何數(shù)據(jù)類型用于方法或構(gòu)造函數(shù)的參數(shù),這包括原始數(shù)據(jù)類型,如在computePayment方法中看到的雙精度數(shù)、浮點(diǎn)數(shù)和整數(shù),以及引用數(shù)據(jù)類型,如對象和數(shù)組。
這是一個接受數(shù)組作為參數(shù)的方法示例,在此示例中,該方法創(chuàng)建一個新的Polygon對象,并從Point對象數(shù)組中初始化它(假設(shè)Point是一個表示x,y坐標(biāo)的類):
public Polygon polygonFrom(Point[] corners) { // method body goes here }
注意:如果要將方法傳遞給方法,請使用lambda表達(dá)式或方法引用。任意數(shù)量的參數(shù)
你可以使用名為可變參數(shù)的構(gòu)造將任意數(shù)量的值傳遞給方法,當(dāng)你不知道將多少特定類型的參數(shù)傳遞給該方法時,你可以使用可變參數(shù),這是手動創(chuàng)建數(shù)組的快捷方式(前一種方法可以使用可變參數(shù)而不是數(shù)組)。
要使用可變參數(shù),你通過省略號跟隨最后一個參數(shù)的類型(三個點(diǎn),...),然后是空格和參數(shù)名稱,然后可以使用任何數(shù)量的參數(shù)調(diào)用該方法,包括無參數(shù)。
public Polygon polygonFrom(Point... corners) { int numberOfSides = corners.length; double squareOfSide1, lengthOfSide1; squareOfSide1 = (corners[1].x - corners[0].x) * (corners[1].x - corners[0].x) + (corners[1].y - corners[0].y) * (corners[1].y - corners[0].y); lengthOfSide1 = Math.sqrt(squareOfSide1); // more method body code follows that creates and returns a // polygon connecting the Points }
你可以看到,在方法內(nèi)部,corners被視為數(shù)組,可以使用數(shù)組或參數(shù)序列調(diào)用該方法,在任何一種情況下,方法體中的代碼都會將參數(shù)視為數(shù)組。
你最常見的是使用打印方法的可變參數(shù),例如,這個printf方法:
public PrintStream printf(String format, Object... args)
允許你打印任意數(shù)量的對象,它可以像這樣調(diào)用:
System.out.printf("%s: %d, %s%n", name, idnum, address);
或者像這樣:
System.out.printf("%s: %d, %s, %s, %s%n", name, idnum, address, phone, email);
或者還有不同數(shù)量的參數(shù)。
參數(shù)名向方法或構(gòu)造函數(shù)聲明參數(shù)時,為該參數(shù)提供名稱,此名稱在方法體內(nèi)用于引用傳入的參數(shù)。
參數(shù)的名稱在其范圍內(nèi)必須是唯一的,它不能與同一方法或構(gòu)造函數(shù)的另一個參數(shù)的名稱相同,也不能是方法或構(gòu)造函數(shù)中的局部變量的名稱。
參數(shù)可以與類的某個字段具有相同的名稱,如果是這種情況,則稱該參數(shù)遮蔽該字段,遮蔽字段可能使你的代碼難以閱讀,并且通常僅在設(shè)置特定字段的構(gòu)造函數(shù)和方法中使用,例如,考慮以下Circle類及其setOrigin方法:
public class Circle { private int x, y, radius; public void setOrigin(int x, int y) { ... } }
Circle類有三個字段:x,y和radius,setOrigin方法有兩個參數(shù),每個參數(shù)與其中一個字段具有相同的名稱,每個方法參數(shù)都會影響共享其名稱的字段,因此,在方法體內(nèi)使用簡單名稱x或y是指參數(shù),而不是字段。要訪問該字段,你必須使用限定名稱,這將在本課程后面的“使用this關(guān)鍵字”一節(jié)中討論。
傳遞原始數(shù)據(jù)類型參數(shù)原始參數(shù)(如int或double)按值傳遞給方法,這意味著對參數(shù)值的任何更改都僅存在于方法的范圍內(nèi),方法返回時,參數(shù)消失,對它們的任何更改都將丟失,這是一個例子:
public class PassPrimitiveByValue { public static void main(String[] args) { int x = 3; // invoke passMethod() with // x as argument passMethod(x); // print x to see if its // value has changed System.out.println("After invoking passMethod, x = " + x); } // change parameter in passMethod() public static void passMethod(int p) { p = 10; } }
運(yùn)行此程序時,輸出為:
After invoking passMethod, x = 3傳遞引用數(shù)據(jù)類型參數(shù)
引用數(shù)據(jù)類型參數(shù)(如對象)也按值傳遞給方法,這意味著當(dāng)方法返回時,傳入的引用仍然引用與以前相同的對象,但是,如果對象的字段的值具有適當(dāng)?shù)脑L問級別,則可以在該方法中更改它們的值。
例如,考慮任意類中移動Circle對象的方法:
public void moveCircle(Circle circle, int deltaX, int deltaY) { // code to move origin of circle to x+deltaX, y+deltaY circle.setX(circle.getX() + deltaX); circle.setY(circle.getY() + deltaY); // code to assign a new reference to circle circle = new Circle(0, 0); }
使用這些參數(shù)調(diào)用該方法:
moveCircle(myCircle, 23, 56)
在方法內(nèi)部,circle最初引用的是myCircle,該方法將circle引用的對象(即myCircle)的x和y坐標(biāo)分別改變23和56,方法返回時,這些更改將保持不變。然后circle被賦予新的Circle對象的引用,其中x = y = 0,但是,這種重新分配沒有永久性,因?yàn)橐檬前粗祩鬟f的,不能更改,在該方法中,circle指向的對象已更改,但是,當(dāng)方法返回時,myCircle仍然引用與調(diào)用方法之前相同的Circle對象。
上一篇:控制流語句 下一篇:對象文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/72306.html
Java? 教程 Java教程是為JDK 8編寫的,本頁面中描述的示例和實(shí)踐沒有利用在后續(xù)版本中引入的改進(jìn)。 Java教程是希望使用Java編程語言創(chuàng)建應(yīng)用程序的程序員的實(shí)用指南,其中包括數(shù)百個完整的工作示例和數(shù)十個課程,相關(guān)課程組被組織成教程。 覆蓋基礎(chǔ)知識的路徑 這些教程以書籍的形式提供,如Java教程,第六版,前往Amazon.com購買。 入門 介紹Java技術(shù)和安裝Java開發(fā)軟件并使用...
摘要:所以看出和兩個的對應(yīng)指針數(shù)一樣,一個為一個為這就引出了變量的知識點(diǎn),如手工畫的圖二為啥強(qiáng)制子類父類變量名不同阿里巴巴手冊是這樣寫的強(qiáng)制避免在子父類的成員變量之間或者不同代碼塊的局部變量之間采用完全相同的命名方式,那會導(dǎo)致代碼可讀性降低。 摘要: 原創(chuàng)出處 https://www.bysocket.com 「公眾號:泥瓦匠BYSocket 」歡迎關(guān)注和轉(zhuǎn)載,保留摘要,謝謝! 目錄 父子...
使用包成員 組成包的類型稱為包成員。 要從其包外部使用公共包成員,你必須執(zhí)行以下操作之一: 通過其完全限定名稱引用該成員 導(dǎo)入包成員 導(dǎo)入成員的整個包 每種情況都適用于不同的情況,如以下各節(jié)所述。 通過其完全限定名稱引用包成員 到目前為止,本教程中的大多數(shù)示例都通過簡單名稱引用類型,例如Rectangle和StackOfInts,如果你編寫的代碼與該成員位于同一個包中,或者已導(dǎo)入該成員,則可以...
管理源文件和類文件 Java平臺的許多實(shí)現(xiàn)依賴于分層文件系統(tǒng)來管理源文件和類文件,盡管Java語言規(guī)范不要求這樣做,策略如下。 將類、接口、枚舉或注解類型的源代碼放在文本文件中,該文件的名稱是類型的簡單名稱,其擴(kuò)展名為.java,例如: //in the Rectangle.java file package graphics; public class Rectangle { ... ...
自動裝箱和拆箱 自動裝箱是Java編譯器在基元類型和相應(yīng)的對象包裝類之間進(jìn)行的自動轉(zhuǎn)換,例如,將int轉(zhuǎn)換為Integer,將double轉(zhuǎn)換為Double,依此類推,如果轉(zhuǎn)換是另一種方式,則稱為拆箱。 以下是自動裝箱的最簡單示例: Character ch = a; 本節(jié)中的其余示例使用泛型,如果您還不熟悉泛型的語法,請參閱泛型課程。 考慮以下代碼: List li = new ArrayLis...
閱讀 921·2023-04-25 18:51
閱讀 1875·2021-09-09 11:39
閱讀 3285·2019-08-30 15:53
閱讀 2104·2019-08-30 13:03
閱讀 1314·2019-08-29 16:17
閱讀 587·2019-08-29 11:33
閱讀 1888·2019-08-26 14:00
閱讀 2126·2019-08-26 13:41