Java8의 국부 내부 클래스에 접근하는 국부 변수는final로 수식할 필요가 없습니다

1498 단어 기초 문법
다음 코드는 Java8에서 정확합니다.
public class Demo {

public static void main(String[] args) {
Outer o = new Outer();
o.method();//         ,       ,  method  (method    show           )
}

}

class Outer {
private int num = 10;//    

void method() {
int num2 = 20;//    
class Inner {
void show() {
System.out.println(num);
System.out.println(num2);

}
}
Inner i = new Inner();//          :            ,              
i.show();
}
}

그러나 Java7에서는 이 코드를 컴파일할 수 없으며 다음과 같은 오류가 발생합니다. Cannot refer to a non-final variable word You Say inside an inner class defined in a different method.
오류 원인: o.method () 방법의 실행이 끝난 후 국부 변수num2는 사라지지만, method () 방법에서 inner i = new Inner () 로 생성된 i 대상에 인용 inner가 존재하면 대상이 존재하지 않는 변수에 접근할 수 없습니다. 이것은 허용되지 않습니다.이런 모순은 국부 내부 클래스가 국부 변수에 접근할 수 있지만 국부 내부 클래스 대상(창고 메모리)과 국부 변수의 생명 주기가 다르기 때문에 발생한다.국부 변수의 생명기: 이 방법이 호출되었을 때 이 방법의 국부 변수는 창고에서 생성되고 방법 호출이 끝났을 때 창고에서 퇴장하면 이 국부 변수는 모두 죽는다.내부 클래스 대상의 생명기는 다른 클래스와 마찬가지로 국부 내부 클래스 대상을 만든 후에 다른 사람이 그것을 인용하지 않을 때만 사망할 수 있다.그래서 완전히 하나의 방법이 이미 호출되어 끝났을 수도 있지만 (국부 변수는 이미 죽었다), 이 국부 클래스의 대상은 여전히 살아 있다.즉, 국부류의 대상의 생명기는 국부변수를 초과할 수 있다.
jdk8 이전에final로 국부 변수를 수식해야 했는데 이를 상수로 바꾸어 값이 변하지 않고 모순을 없애기 위해서였다.실제 버전 8은 당신이 수동으로final 수식 국부 변수를 추가할 필요가 없는 이유는 jvm가 자동으로 밑에final 수식자, 즉'어법사탕'을 추가하는 것을 도와주기 때문이다.컴파일러의 실현 방법: 모든 국부 내부 클래스 대상이 방문할final형 국부 변수를 이 내부 클래스 대상의 데이터 구성원으로 복사합니다.이렇게 하면 창고에서 국부 변수(final 포함)가 이미 사망하였음에도 불구하고final이기 때문에 그 값은 영원히 변하지 않기 때문에 국부 내부류 대상은 변수가 사망한 후에final형 국부 변수에 접근할 수 있다

좋은 웹페이지 즐겨찾기