局部類
局部類是在塊中定義的類,它是一對(duì)大括號(hào)之間的一組零個(gè)或多個(gè)語(yǔ)句,你通常會(huì)在方法體中找到定義的局部類。
聲明局部類你可以在任何塊中定義局部類(有關(guān)詳細(xì)信息,請(qǐng)參閱表達(dá)式、語(yǔ)句和塊),例如,你可以在方法體、for循環(huán)或if子句中定義局部類。
以下示例LocalClassExample驗(yàn)證兩個(gè)電話號(hào)碼,它在validatePhoneNumber方法中定義了局部類PhoneNumber:
public class LocalClassExample { static String regularExpression = "[^0-9]"; public static void validatePhoneNumber( String phoneNumber1, String phoneNumber2) { final int numberLength = 10; // Valid in JDK 8 and later: // int numberLength = 10; class PhoneNumber { String formattedPhoneNumber = null; PhoneNumber(String phoneNumber){ // numberLength = 7; String currentNumber = phoneNumber.replaceAll( regularExpression, ""); if (currentNumber.length() == numberLength) formattedPhoneNumber = currentNumber; else formattedPhoneNumber = null; } public String getNumber() { return formattedPhoneNumber; } // Valid in JDK 8 and later: // public void printOriginalNumbers() { // System.out.println("Original numbers are " + phoneNumber1 + // " and " + phoneNumber2); // } } PhoneNumber myNumber1 = new PhoneNumber(phoneNumber1); PhoneNumber myNumber2 = new PhoneNumber(phoneNumber2); // Valid in JDK 8 and later: // myNumber1.printOriginalNumbers(); if (myNumber1.getNumber() == null) System.out.println("First number is invalid"); else System.out.println("First number is " + myNumber1.getNumber()); if (myNumber2.getNumber() == null) System.out.println("Second number is invalid"); else System.out.println("Second number is " + myNumber2.getNumber()); } public static void main(String... args) { validatePhoneNumber("123-456-7890", "456-7890"); } }
該示例通過(guò)首先移除電話號(hào)碼中除數(shù)字0到9之外的所有字符來(lái)驗(yàn)證電話號(hào)碼,之后,它會(huì)檢查電話號(hào)碼是否包含十位數(shù)字(北美電話號(hào)碼的長(zhǎng)度),此示例打印以下內(nèi)容:
First number is 1234567890 Second number is invalid訪問(wèn)封閉類的成員
局部類可以訪問(wèn)其封閉類的成員,在前面的示例中,PhoneNumber構(gòu)造函數(shù)訪問(wèn)成員LocalClassExample.regularExpression。
此外,局部類可以訪問(wèn)局部變量,但是,局部類只能訪問(wèn)聲明為final的局部變量,當(dāng)局部類訪問(wèn)封閉塊的局部變量或參數(shù)時(shí),它會(huì)捕獲該變量或參數(shù)。例如,PhoneNumber構(gòu)造函數(shù)可以訪問(wèn)局部變量numberLength,因?yàn)樗宦暶鳛?b>final;numberLength是捕獲的變量。
但是,從Java SE 8開(kāi)始,局部類可以訪問(wèn)final或有效final的封閉塊的局部變量和參數(shù),在初始化之后其值永遠(yuǎn)不會(huì)改變的變量或參數(shù)實(shí)際上是final,例如,假設(shè)變量numberLength未聲明為final,并且你在PhoneNumber構(gòu)造函數(shù)中添加賦值語(yǔ)句,以將有效電話號(hào)碼的長(zhǎng)度更改為7位數(shù):
PhoneNumber(String phoneNumber) { numberLength = 7; String currentNumber = phoneNumber.replaceAll( regularExpression, ""); if (currentNumber.length() == numberLength) formattedPhoneNumber = currentNumber; else formattedPhoneNumber = null; }
由于這個(gè)賦值語(yǔ)句,變量numberLength不再是final,因此,Java編譯器生成類似于“從內(nèi)部類引用的局部變量必須是final或者有效的final”的錯(cuò)誤消息,其中內(nèi)部類PhoneNumber嘗試訪問(wèn)numberLength變量:
if (currentNumber.length() == numberLength)
從Java SE 8開(kāi)始,如果在方法中聲明局部類,它可以訪問(wèn)方法的參數(shù),例如,你可以在PhoneNumber局部類中定義以下方法:
public void printOriginalNumbers() { System.out.println("Original numbers are " + phoneNumber1 + " and " + phoneNumber2); }
printOriginalNumbers方法訪問(wèn)validatePhoneNumber方法的參數(shù)phoneNumber1和phoneNumber2。
遮蔽和局部類在具有相同名稱的封閉范圍內(nèi)的局部類遮蔽聲明中類型的聲明(例如變量),有關(guān)更多信息,請(qǐng)參閱遮蔽。
局部類與內(nèi)部類相似局部類與內(nèi)部類類似,因?yàn)樗鼈儫o(wú)法定義或聲明任何靜態(tài)成員,靜態(tài)方法中的局部類,例如在靜態(tài)方法validatePhoneNumber中定義的類PhoneNumber,只能引用封閉類的靜態(tài)成員。例如,如果未將成員變量regularExpression定義為static,則Java編譯器會(huì)生成類似于“非靜態(tài)變量regularExpression無(wú)法從靜態(tài)上下文引用”的錯(cuò)誤。
局部類是非靜態(tài)的,因?yàn)樗鼈兛梢栽L問(wèn)封閉塊的實(shí)例成員,因此,它們不能包含大多數(shù)類型的靜態(tài)聲明。
你不能在一個(gè)塊內(nèi)聲明一個(gè)接口;接口本質(zhì)上是靜態(tài)的,例如,以下代碼片段不會(huì)編譯,因?yàn)榻涌?b>HelloThere是在方法greetInEnglish的主體內(nèi)定義的:
public void greetInEnglish() { interface HelloThere { public void greet(); } class EnglishHelloThere implements HelloThere { public void greet() { System.out.println("Hello " + name); } } HelloThere myGreeting = new EnglishHelloThere(); myGreeting.greet(); }
你不能在局部類中聲明靜態(tài)初始化或成員接口,以下代碼片段無(wú)法編譯,因?yàn)榉椒?b>EnglishGoodbye.sayGoodbye被聲明為static,當(dāng)遇到此方法定義時(shí),編譯器會(huì)生成類似于“修飾符"static"的錯(cuò)誤,只允許在常量變量聲明中使用”:
public void sayGoodbyeInEnglish() { class EnglishGoodbye { public static void sayGoodbye() { System.out.println("Bye bye"); } } EnglishGoodbye.sayGoodbye(); }
局部類可以具有靜態(tài)成員,前提是它們是常量變量(常量變量是原始類型或類型String的變量,它被聲明為final并使用編譯時(shí)常量表達(dá)式進(jìn)行初始化,編譯時(shí)常量表達(dá)式通常是可在編譯時(shí)計(jì)算的字符串或算術(shù)表達(dá)式,有關(guān)更多信息,請(qǐng)參閱了解類成員),以下代碼片段編譯,因?yàn)殪o態(tài)成員EnglishGoodbye.farewell是一個(gè)常量變量:
public void sayGoodbyeInEnglish() { class EnglishGoodbye { public static final String farewell = "Bye bye"; public void sayGoodbye() { System.out.println(farewell); } } EnglishGoodbye myEnglishGoodbye = new EnglishGoodbye(); myEnglishGoodbye.sayGoodbye(); }上一篇:嵌套類 下一篇:匿名類
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/72336.html
匿名類 匿名類可以使你代碼更簡(jiǎn)潔,它們使你能夠同時(shí)聲明和實(shí)例化一個(gè)類,它們就像局部類,除了它們沒(méi)有名稱,如果你只需要使用局部類一次,請(qǐng)使用它們。 聲明匿名類 雖然局部類是類聲明,但匿名類是表達(dá)式,這意味著你在另一個(gè)表達(dá)式中定義該類,以下示例HelloWorldAnonymousClasses在局部變量frenchGreeting和spanishGreeting的初始化語(yǔ)句中使用匿名類,但使用局部類...
摘要:所以看出和兩個(gè)的對(duì)應(yīng)指針數(shù)一樣,一個(gè)為一個(gè)為這就引出了變量的知識(shí)點(diǎn),如手工畫(huà)的圖二為啥強(qiáng)制子類父類變量名不同阿里巴巴手冊(cè)是這樣寫(xiě)的強(qiáng)制避免在子父類的成員變量之間或者不同代碼塊的局部變量之間采用完全相同的命名方式,那會(huì)導(dǎo)致代碼可讀性降低。 摘要: 原創(chuàng)出處 https://www.bysocket.com 「公眾號(hào):泥瓦匠BYSocket 」歡迎關(guān)注和轉(zhuǎn)載,保留摘要,謝謝! 目錄 父子...
變量 正如你在上一課中所了解到的,對(duì)象將其狀態(tài)存儲(chǔ)在字段中。 int cadence = 0; int speed = 0; int gear = 1; 什么是對(duì)象?討論向你介紹了字段,但你可能還有一些問(wèn)題,例如:命名字段的規(guī)則和約定是什么?除了int之外,還有哪些其他數(shù)據(jù)類型?在聲明字段時(shí)是否必須初始化字段?如果未明確初始化字段,是否為字段分配了默認(rèn)值?我們將在本課中探討這些問(wèn)題的答案,但在我們...
嵌套類 Java編程語(yǔ)言允許你在另一個(gè)類中定義類,這樣的類稱為嵌套類,如下所示: class OuterClass { ... class NestedClass { ... } } 術(shù)語(yǔ):嵌套類分為兩類:靜態(tài)和非靜態(tài),聲明為static的嵌套類稱為靜態(tài)嵌套類,非靜態(tài)嵌套類稱為內(nèi)部類。 class OuterClass { ... stati...
摘要:就等于局部變量類型推斷使用示例既然叫局部變量類型推斷,以只能用在局部變量中,下面給出更多使用示例。,本次局部變量類型推斷實(shí)戰(zhàn)文章就到這里了,后續(xù)帶來(lái)更多的的實(shí)戰(zhàn)方面的文章。 現(xiàn)在 Java 9 被遺棄了直接升級(jí)到了 Java 10,之前也發(fā)過(guò) Java 10 新特性的文章,現(xiàn)在是開(kāi)始實(shí)戰(zhàn) Java 10 的時(shí)候了。 今天要實(shí)戰(zhàn)的是 Java 10 中最重要的特性:局部變量類型推斷,大家...
閱讀 1660·2021-11-12 10:35
閱讀 1611·2021-08-03 14:02
閱讀 2655·2019-08-30 15:55
閱讀 2024·2019-08-30 15:54
閱讀 735·2019-08-30 14:01
閱讀 2421·2019-08-29 17:07
閱讀 2246·2019-08-26 18:37
閱讀 3028·2019-08-26 16:51