Java에서 최종 키워드는 객체에 불변이 없음을 선언하는 데 사용됩니다. 여기의 객체에는 C ++의 Const 키워드와 유사한 변수, 메소드 및 클래스가 포함됩니다.
불변은 객체가 만들어진 후 상태를 변경할 수 없음을 의미합니다. 세 가지 관점에서 최종 키워드를 사용하는 것을 고려할 수 있습니다.
최종 변수
최종 오브젝트 A를 정의하면 A는 한 번만 초기화 할 수 있습니다. 일단 초기화되면 A의 데이터를 수정할 수 없습니다. A가 참조 유형 인 경우 다른 객체를 다시 반드시 할 수 없습니다.
초기화되지 않은 최종 변수를 Blank Final이라고합니다. 멤버 변수 인 경우 생성자에 초기화되거나 할당되어야합니다.
예:
클래스 서클 {정적 최종 이중 pi = 3.1415926; 최종 int 반경 = 5; 최종 INT XPO; 최종 int ypos; 공공 원 (int x, int y) {xpos = x; ypos = y; }} 최종 방법
최종 메소드를 정의하면 메소드를 과부하 할 수 없습니다. 이 방법 설계자는 메소드에 과부하로 인해 다른 관련 기능이 발생하지 않기를 원합니다.
예:
class baseclass {public final void method () {}} class devivedClass는 baseclass {public final void method () {} // 컴파일 오류}를 확장합니다.최종 방법의 정의가 반드시 인라인의 효과를 생성 할 필요는 없다. 왜냐하면 방법이 최종 키워드가 아닌 JVM의 전략에 의존하기 때문에 최종 설계를 통해 방법의 효율성을 향상시키는 것이 부정확하기 때문이다.
최종 수업
최종 클래스 X로 정의 된 최종 클래스 X는 상속받을 수 없습니다.
Java에서 문자열 클래스는 최종으로 설계되었으며 그 정의는 다음과 같습니다.
코드 사본은 다음과 같습니다.
공개 클래스 최종 문자열 확장 객체 구현 직렬화 가능, 비슷한 <string>, charSequence
내부 클래스와 최종
메소드에서 익명의 내부 클래스를 정의 할 때 내부 클래스는 메소드의 최종 유형 변수에만 액세스 할 수 있으므로 Java 컴파일러가 변수의 값을 미리 캡처하고 내부 클래스에 사본을 저장할 수 있습니다. 방법이 파괴되면 내부 클래스의 메모리 공간이 여전히 완료됩니다.
예:
공개 클래스 래퍼 {public static void main (String [] args) {// object obj = null; // 컴파일 오류 최종 객체 obj = null; 새 스레드 (new Runnable () {public void run () {obj = "hello";}}). start (); }} 추신 : 내부 익명 클래스가 외부 비 결합 변수에 액세스 할 수없는 문제
이것은 이야기하기가 조금 어렵지만 실제로는 Java 내부 수업의 일부 기능에 대해 더 많이 이야기하고 싶습니다.
이 질문에 대해 생각하는 이유는 최근 JDK 소스 코드에서 http keepalive에 대한 코드를 읽을 때 소스 파일 중 하나 인 Sun.net.www.protocol.http.httpurlconnection.java가 우연히 다음 코드를 보았 기 때문입니다.
최종 부울 결과 [] = {false}; java.security.accesscontroller.doprivileged (new java.security.privilegedAction () {public object run () {try {inetAddress a1 = inetAddress.getByName (h1); inetAddress a2 = inetAddress.getmeam (h2); a1. equals (a2)} catch (unknownhostexception e) {return return null};Java의 익명 내부 클래스는 해당 함수의 비 결합 변수에 액세스 할 수 없습니다. 외부 로컬 변수에 액세스하려면이 변수는 먼저 fianl로 정의되어야합니다. 그러나 일단 최종으로 정의되면 익명의 내부 클래스 에서이 변수의 값을 수정할 수 없으므로 익명 내부 클래스에서 유용한 값을 반환하는 것은 쉽지 않습니다. 이 코드는이 제한을 우회하기 위해 배열을 사용하여 매우 영리한 방법을 사용합니다. 변수 결과에 대한 참조를 수정할 수는 없지만 결과적으로 가리키는 배열의 내용을 수정할 수 있습니다.
내부 익명 클래스로 외부 변수를 수정하기위한 약간의 트릭을 기록하고 싶습니다. 그러나 여기에 도착 했으므로 내부 클래스의 기능이나 제한 사항을 계속 볼 수도 있습니다.
이 기사를 계속하기 전에이 기사와 관련된 Java 용어를 명확히해야한다고 생각합니다. 이 용어는 중국어로 번역하기가 쉽지 않으므로 여전히 영어로 설명 할 것입니다.
// 이것은 classpublic class javaterm {// 필드 또는 멤버 변수 개인 int 필드입니다. // 생성자 public javaterm () {} // 메소드 public void method () {// 로컬 변수 int localvariable = 0; // 로컬 클래스 클래스 LocalClass {public localclass () {}} // 익명 클래스 new runnable () {public void run () {}}; }}오늘날 우리는 지역 계급과 익명 수업에 더 집중할 것입니다.
Java를 사용하면 중첩 클래스라고하는 클래스에서 다른 클래스를 정의 할 수 있으며 중첩 클래스는 두 가지 범주로 나눌 수 있으며, 하나는 정적 중첩 클래스이며, 다른 하나는 내부 클래스라고도 알려진 비 정적 중첩 클래스입니다. 내부 수업은 또한 로컬 클래스 및 익명 수업으로 나눌 수도 있습니다.
익명 클래스의 일부 제한