天天看點

java 局部内部類 使用局部變量,Java 為什麼局部内部類對調用的局部變量一定要求為final類型...

Java 為什麼局部内部類對調用的局部變量一定要求為final類型

當局部内部類通路同屬于一個方法内的局部變量一定要求這個局部變量為final類型,或者這個局部變量是事實不變的呢

解釋:類new出來的對象是存在于堆當中的,而局部變量是跟着方法走的,存在于棧當中的,這就意味着對象的生命周期是大于堆中的方法的;

局部變量用完了之後就會被記憶體彈棧回收,若對象想在局部變量被回收完成後再調用局部變量,就需要對之前的局部變量進行拷貝再使用,

假若局部變量不是final型的,當num發生了變化,則會導緻對象再次使用num的時候産生資料拷貝錯誤導緻程式運作結果不正确,這是不容許發生的。

是以局部内部類在調用局部變量的時候,一定要求局部變量要為final類型的。

自Java 8開始,IDE允許省略final關鍵字,但是一定要注意:局部變量仍然要求不可以改變。

public class InnerLocalVariable {

public void methodOuter(){

class Inner{//因為你是局部内部類,隻能在這個方法塊内起作用,是以沒有必要也不能寫修飾類修飾權限

final int num=10;

public void method(){

System.out.println(num);

}

}

Inner inner=new Inner();

inner.method();

}

}

Java 為什麼局部内部類對調用的局部變量一定要求為final類型 相關文章

Java方法詳解

1.何為方法 Java方法是語句的集合,它們在一起執行一個功能 方法是解決一切問題的步驟的有序組合 方法包含于類或對象中 方法在程式中被建立,在其他地方被引用 設計方法的原則:方法的本意是功能塊,就是實作某個功能的語句塊的集合,我們設計方法的時候,最

JAVA基礎(三)—— 輸入輸出處理

JAVA基礎(三)—— 輸入輸出處理 1 輸入解析 //Scanner擷取輸入import java.util.Scanner;Scanner s = new Scanner(System.in);String input = s.nextLine() ; s.close();String [] a = input.split(" ");//多次換行輸入for (int i=0;i7;i++) String string

Java基礎學習08--JDK1.8特性

1.Lambda表達式 Lambda表達式時特殊的匿名内部類,文法更簡潔。它允許把函數作為一個方法的參數(函數作為方法參數傳遞),将代碼像資料一樣傳遞。 1 package com.example.jdk8; 2 3 import java.util.Comparator; 4 import java.util.TreeSet; 5 6 public cla

java web應用連接配接access資料庫的方法

1、下載下傳ucanaccess驅動jar包,下載下傳位址是https://sourceforge.net/projects/ucanaccess/,将下載下傳後解壓得到的幾個jar檔案導入到web應用的WEB-INF/lib檔案夾下。共有ucanaccess-5.0.1.jar、commons-lang3-3.8.1.jar、commons-logging-1.2.jar、hsqldb-2.5.0.j

你真的知道為什麼要使用void(0)代替undefined嗎

我們平時用到的\(\color{#FF3030}{undefined}\)隻是\(\color{#FF3030}{window}\)對象下的一個屬性。 Object.getOwnPropertyDescriptor(window, undefined);//{value: undefined, writable: false, enumerable: false, configurable: false} 也正是因為如此,

Java實作八大排序算法(轉)

1、直接插入排序 ①、基本思想 通常人們整理橋牌的方法是一張一張的來,将每一張牌插入到其他已經有序的牌中的适當位置。在計算機的實作中,為了要給插入的元素騰出空間,我們需要将其餘所有元素在插入之前都向右移動一位。 ②、算法描述 一般來說,插入排序

Shiro的 rememberMe 功能使用指導(為什麼rememberMe設定了沒作用)

原了解釋 shiro對cookie做了什麼 其實你設定了這個rememberMe之後shiro還是有做一點事情的,它會生成一個cookie值叫 rememberMe 并儲存在你的浏覽器裡面,而且這個參數會随着你調用 subject.logout() 會被自動清除。這個參數的值是一串很長的Base64加密過的

Redis學習(六)----主從複制、讀寫分離

1、為什麼要主從複制、讀寫分離 Redis在作為緩存的時候,随着項目通路量的增加,對Redis伺服器的操作也越加頻繁,雖然Redis讀寫速度都很快,但是一定程度上也會造成一定的延時,甚至出現當機的可能性,這時候就出現了“單點故障”,那麼為了解決通路量大的問

前端異常處理

#前言為什麼要處理前端異常,有以下幾方面的原因:1.提高代碼健壯性:對于開發人員來說,這點很重要,代碼的健壯性越好,系統越不容易崩潰;2.提升系統穩定性:異常會導緻正常流程無法進行、頁面樣式錯亂、崩潰甚至白屏等問題,嚴重的會給業務造成損失;3.增

JavaScript周遊對象的幾種方法

作為經常使用對象的我們,在有些業務場景下需要對對象的屬性進行周遊,下面我總結了幾種常用的 JS 周遊對象屬性的方法。 太長不看版: JS 周遊對象的主要方法有 for...in 、Object.keys()、Object.getOwnPropertyNames()、Object.getOwnPropertySymbols()、R