JavaRush /Java Blog /Random-KO /그럼 최종적으로...
Алексей
레벨 32

그럼 최종적으로...

Random-KO 그룹에 게시되었습니다
java - 키워드가 있습니다 final. 클래스, 메소드, 변수(메소드 인수 포함)에 적용할 수 있습니다. 그럼 마지막으로... - 1클래스의 경우 이는 클래스가 하위 클래스를 가질 수 없음을 의미합니다. 상속은 금지되어 있습니다. 이는 (불변) 객체(예: 로 선언된 immutable클래스)를 생성할 때 유용합니다 . Stringfinal
public final class String{
}

class SubString extends String{ //Compilation error
}
또한 수정자는 키워드를 사용하여 추상 클래스에 적용할 수 없다는 점에 유의해야 합니다 abstract. final이는 상호 배타적인 개념입니다. 메서드의 경우 final하위 클래스에서 재정의할 수 없다는 의미입니다. 이는 원래 구현을 재정의하지 않으려는 경우에 유용합니다.
public class SuperClass{
    public final void printReport(){
        System.out.println("Report");
    }
}

class SubClass extends SuperClass{
    public void printReport(){  //Compilation error
        System.out.println("MyReport");
    }
}
기본 유형 변수의 경우 이는 일단 할당되면 값을 변경할 수 없음을 의미합니다. 참조 변수의 경우 이는 개체가 할당되면 해당 개체에 대한 참조를 변경할 수 없음을 의미합니다. 그건 중요해! 링크는 변경할 수 없지만 개체의 상태는 변경할 수 있습니다. Java 8에서는 개념이 나타났습니다 effectively final. 변수(메서드 인수 포함)에만 적용됩니다. 요점은 키워드가 명백히 없음에도 불구하고 final초기화 후에 변수 값이 변경되지 않는다는 것입니다. 즉, final컴파일 오류 없이 해당 변수를 단어로 대체할 수 있습니다. 변수는 로컬 클래스( ), 익명 클래스( ), 스트림(Stream API) effectively final내에서 사용할 수 있습니다 .Local Inner ClassesAnonymous Inner Classes
public void someMethod(){
    // In the example below, both a and b are effectively final, since the values ​​are set once:
    int a = 1;
    int b;
    if (a == 2) b = 3;
    else b = 4;
    // c is NOT effectively final because value changes
    int c = 10;
    c++;

    Stream.of(1, 2).forEach(s-> System.out.println(s + a)); //Ок
    Stream.of(1, 2).forEach(s-> System.out.println(s + c)); //Compilation error
}
이제 간단한 인터뷰를 해보자. 결국, JavaRush 과정을 수강하는 목표는 Java 개발자가 되어 흥미롭고 보수가 좋은 직업을 얻는 것입니다. 그럼 시작해 보겠습니다.
  1. 배열이 선언될 때 배열에 대해 무엇을 말할 수 있습니까 final?

  2. 클래스는 선언되고 String문자열 값은 키워드로 표시된 배열에 저장되는 것으로 알려져 있습니다 .immutablefinalcharfinal

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];
String(객체에 대한 참조를 변경하지 않고) 객체의 값을 바꾸는 것이 가능합니까 ? 실제 면접질문입니다. 그리고 실습에서 알 수 있듯이 많은 사람들이 잘못 대답합니다. 특히 참조 변수의 경우 키워드 사용을 이해하는 것이 final매우 중요합니다. 당신이 생각하는 동안 JavaRush 팀에 대한 간단한 여담입니다. 콘텐츠를 숨길 수 있는 블록을 텍스트 편집기에 추가하고, 클릭하면 이 콘텐츠가 표시됩니다. 답변:
  1. 왜냐하면 배열은 객체입니다. 즉 final, 객체에 참조를 할당한 후에는 더 이상 변경할 수 없지만 객체의 상태는 변경할 수 있습니다.

    final int[] array = {1,2,3,4,5};
    array[0] = 9;	//ok, because change the contents of the array - {9,2,3,4,5}
    array = new int[5]; //compile error
  2. 그래 넌 할수있어. 핵심은 물체에 가시가 있는 단어의 사용을 이해하는 것입니다 final. ReflectionAPI를 사용하여 값을 바꿉니다.

import java.lang.reflect.Field;

class B {
    public static void main(String[] args) throws Exception {
        String value = "Old value";
        System.out.println(value);

        //Get the value field in the String class
        Field field = value.getClass().getDeclaredField("value");
        //Let's change it
        field.setAccessible(true);
        //Set new value
        field.set(value, "JavaRush".toCharArray());

        System.out.println(value);

        /* Вывод:
         * Old value
         * JavaRush
         */
    }
}
이러한 방식으로 기본 유형의 최종 변수를 변경하려고 하면 아무 것도 작동하지 않습니다. 예를 들어 final int필드가 포함된 Java 클래스를 만들고 Reflection API를 통해 해당 값을 변경해 보세요. 모두에게 행운을 빕니다!
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION