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