CodeGym /Java Blog /무작위의 /Java Core에 대한 상위 50개의 면접 질문 및 답변. 1 부
John Squirrels
레벨 41
San Francisco

Java Core에 대한 상위 50개의 면접 질문 및 답변. 1 부

무작위의 그룹에 게시되었습니다
소프트웨어 엔지니어 여러분, 안녕하세요! 면접 질문에 대해 알아보겠습니다. 준비해야 할 사항과 알아야 할 사항에 대해. 이것은 처음으로 이러한 점을 검토하거나 연구하기에 좋은 시간입니다. Java Core에 대한 상위 50개의 면접 질문 및 답변.  파트 1 - 1 OOP, Java 구문, Java 예외, 컬렉션 및 다중 스레딩에 대한 다소 광범위한 자주 묻는 질문 모음으로 끝났으며 편의를 위해 여러 부분으로 나눌 것입니다. 한 번에 모든 내용을 다루기는 어렵지만 이 자료가 프로그래머로서의 첫 직장을 준비하는 분들에게 좋은 밑거름이 되었으면 합니다. 최상의 이해와 보존을 위해 다른 소스도 살펴보는 것이 좋습니다. 여러 각도에서 접근하여 개념을 더 깊이 이해할 수 있습니다. 중요한:우리는 버전 8 이전의 Java에 대해서만 이야기할 것입니다. 버전 9, 10, 11, 12 및 13에서 제공된 모든 혁신은 여기에서 고려되지 않습니다. 답변을 개선하는 방법에 대한 아이디어/의견을 환영합니다 . 독서를 즐기십시오. 갑시다!

Java 인터뷰: OOP에 대한 질문

1. 자바의 특징은 무엇인가?

답변:
  1. OOP 개념:

    1. 객체 지향
    2. 계승
    3. 캡슐화
    4. 다형성
    5. 추출
  2. 교차 플랫폼: Java 프로그램은 변경 없이 모든 플랫폼에서 실행할 수 있습니다. 물론 이를 위해서는 JVM(Java Virtual Machine)이 설치되어 있어야 합니다.

  3. 고성능: JIT(Just-In-Time) 컴파일러는 고성능을 가능하게 합니다. JIT 컴파일러는 바이트 코드를 기계 코드로 변환한 다음 JVM이 실행을 시작합니다.

  4. 멀티스레딩: JVM은 main thread. 프로그래머는 Thread 클래스에서 파생하거나 Runnable인터페이스를 구현하여 여러 스레드를 만들 수 있습니다.

2. 상속이란?

상속은 한 클래스가 다른 클래스를 상속할 수 있음을 의미합니다( extends 키워드 사용). 즉, 상속받은 클래스의 코드를 재사용할 수 있습니다. 기존 클래스는 로 알려져 superclass있으며 새로 생성된 클래스는 입니다 subclass. 사람들은 또한 부모 및 이라는 용어를 사용한다고 말합니다 child.

public class Animal {
   private int age;
}

public class Dog extends Animal {

}
Animal는 어디에 있고 parentDog입니다 child.

3. 캡슐화란?

이 질문은 Java 개발자 직책에 대한 인터뷰에서 자주 묻는 질문입니다. 캡슐화는 액세스 수정자, 게터 및 세터를 사용하여 구현을 숨깁니다. 이는 개발자가 필요하다고 생각하는 모든 곳에서 외부 액세스를 방지하기 위해 수행됩니다. 실생활의 간단한 예는 자동차입니다. 우리는 엔진 작동에 직접 접근할 수 없습니다. 우리가 해야 할 일은 키를 점화 장치에 넣고 엔진을 켜는 것뿐입니다. 후드 아래에서 발생하는 프로세스는 우리의 일이 아닙니다. 또한 엔진의 활동에 간섭하면 예측할 수 없는 상황이 발생하여 차량이 손상되고 인명피해가 발생할 수 있습니다. 프로그래밍에서도 똑같은 일이 일어납니다. 이것은 Wikipedia 에 잘 설명되어 있습니다.. CodeGym 의 캡슐화에 대한 기사도 있습니다 .

4. 다형성이란 무엇입니까?

다형성은 객체의 특정 유형에 대한 정보 없이 동일한 인터페이스를 가진 객체를 동일한 방식으로 처리하는 프로그램의 기능입니다. 속담처럼 "하나의 인터페이스 — 많은 구현". 다형성을 사용하면 공유 동작을 기반으로 다양한 유형의 개체를 결합하고 사용할 수 있습니다. 예를 들어 Dog와 Cat이라는 두 개의 자손이 있는 Animal 클래스가 있습니다. 일반 Animal 클래스에는 모든 사람이 공유하는 동작, 즉 소리를 낼 수 있는 기능이 있습니다. Animal 클래스를 상속하고 "make sound" 메소드를 실행하는 모든 것을 수집해야 할 때 다형성 기능을 사용합니다. 다음과 같이 표시됩니다.

List<Animal> animals = Arrays.asList(new Cat(), new Dog(), new Cat());
animals.forEach(animal -> animal.makeSound());
즉, 다형성이 도움이 됩니다. 그리고 이것은 다형성(오버로드된) 메서드에도 적용됩니다. 다형성을 사용하는 방법

Java 구문에 대한 인터뷰 질문

5. Java에서 생성자란 무엇입니까?

생성자는 다음과 같은 특징이 있습니다.
  1. 새 객체가 생성되면 프로그램은 적절한 생성자를 사용하여 객체를 생성합니다.
  2. 생성자는 메소드와 같습니다. 반환 값(void 포함)이 없고 클래스 이름과 이름이 같다는 점이 특징입니다.
  3. 생성자가 명시적으로 생성되지 않으면 빈 생성자가 자동으로 생성됩니다.
  4. 생성자는 재정의할 수 있습니다.
  5. 매개변수가 있는 생성자를 선언했지만 매개변수가 없는 생성자도 필요한 경우 자동으로 생성되지 않으므로 별도로 생성해야 합니다.

6. 객체를 상속하지 않는 두 클래스는 무엇입니까?

속임수 질문에 속지 마십시오. 그런 수업은 없습니다. 모든 클래스는 직접 또는 조상을 통해 Object 클래스를 상속합니다!

7. 지역변수란?

이것은 Java 개발자에게 인기 있는 또 다른 인터뷰 질문입니다. 지역 변수는 메서드 내부에 정의되어 메서드가 실행되는 동안 존재하는 변수입니다. 실행이 종료되는 즉시 로컬 변수는 더 이상 존재하지 않습니다. 다음은 main() 메서드에서 helloMessage라는 지역 변수를 사용하는 프로그램입니다.

public static void main(String[] args) {
   String helloMessage;
   helloMessage = "Hello, World!";
   System.out.println(helloMessage);
}

8. 인스턴스 변수란 무엇입니까?

인스턴스 변수는 클래스 내부에서 선언되는 변수입니다. 객체가 존재하는 한 존재합니다. 예를 들어 nectarLoad와 maxNectarLoad라는 두 개의 인스턴스 변수가 있는 Bee 클래스가 있습니다.

public class Bee {

   /**
    * Current nectar load
    */
   private double nectarLoad;

   /**
    * Maximum nectar that can the bee can collect.
    */
   private double maxNectarLoad = 20.0;
 
  ...
}

9. 액세스 한정자는 무엇입니까?

액세스 한정자는 클래스, 메서드 및 변수에 대한 액세스를 사용자 지정하기 위한 메커니즘입니다. 액세스 증가 순서대로 나열된 수정자는 다음과 같습니다.
  1. private— 이 액세스 수정자는 메서드, 필드 및 생성자에서 사용됩니다. 액세스는 선언된 클래스로 제한됩니다.
  2. package-private (default)— 클래스의 기본 액세스 수준입니다. 액세스는 클래스, 메서드, 변수 또는 생성자가 선언된 특정 패키지로 제한됩니다.
  3. protectedpackage-private— 이 액세스 한정자는 한정자를 사용하여 클래스를 상속하는 클래스에 대한 액세스를 추가한 것과 동일한 액세스 수준을 제공합니다 protected.
  4. public— 이 액세스 수준은 클래스에도 사용됩니다. 이 액세스 수준은 애플리케이션 전체에 대한 전체 액세스 권한이 있음을 의미합니다.
Java Core에 대한 상위 50개의 면접 질문 및 답변.  파트 1 - 2

10. 메서드 재정의란 무엇입니까?

자식 클래스가 부모 클래스의 동작을 변경하려고 할 때 메서드를 재정의합니다. 부모 메서드에 있는 작업도 수행해야 하는 경우 부모 메서드를 실행할 자식에서 super.methodName()을 사용할 수 있습니다. 그 후에 추가 논리를 추가할 수 있습니다. 준수해야 하는 요구 사항:
  • 메서드 서명이 동일해야 합니다.
  • 반환 값은 동일해야 합니다.

11. 메서드 서명이란 무엇입니까?

Java Core에 대한 상위 50개의 면접 질문 및 답변.  파트 1 - 3메서드 시그니처는 메서드 이름과 메서드가 취하는 인수의 조합입니다. 메서드 서명은 메서드를 오버로드할 때 메서드의 고유 식별자입니다.

12. 메서드 오버로딩이란 무엇입니까?

메소드 오버로딩은 동일한 작업을 수행하는 여러 메소드를 생성하기 위해 메소드 서명을 변경하는 다형성의 기능입니다.
  • 같은 이름
  • 다른 주장
  • 다양한 반환 유형이 있을 수 있습니다.
예를 들어 ArrayList클래스의 add()메서드를 오버로드하여 입력 인수에 따라 다른 방식으로 추가할 수 있습니다.
  • add(Object o)— 이 방법은 단순히 객체를 추가합니다.
  • add(int index, Object o)— 이 메서드는 특정 인덱스에 개체를 추가합니다.
  • add(Collection<Object> c)— 이 메소드는 객체 목록을 추가합니다.
  • add(int index, Collection<Object> c)— 이 방법은 특정 색인에서 시작하는 객체 목록을 추가합니다.

13. 인터페이스란?

Java는 다중 상속을 지원하지 않습니다. 이러한 한계를 극복하기 위해 인터페이스는 우리가 알고 사랑하는 형태로 추가되었습니다. ;) 오랫동안 인터페이스는 구현 없이 메서드만 있었습니다. 이 답변의 맥락에서 그들에 대해 이야기합시다. 예를 들어:


public interface Animal {
   void makeSound();
   void eat();
   void sleep();
}
일부 세부 사항은 다음과 같습니다.
  • 인터페이스의 모든 메소드는 공개적이고 추상적입니다.
  • 모든 변수는 public static final입니다.
  • 클래스는 인터페이스를 상속하지 않습니다(예: extends 키워드를 사용하지 않음). 대신 클래스가 이를 구현합니다(즉, implements 키워드 사용). 또한 원하는 만큼 많은 인터페이스를 구현할 수 있습니다.
  • 인터페이스를 구현하는 클래스는 인터페이스에 있는 모든 메서드의 구현을 제공해야 합니다.
이와 같이:

public class Cat implements Animal {
   public void makeSound() {
       // Method implementation
   }

   public void eat() {
       // Implementation
   }

   public void sleep() {
       // Implementation
   }
}

14. 인터페이스의 기본 메서드는 무엇입니까?

이제 기본 방법에 대해 이야기하겠습니다. 무엇을 위한 것입니까? 그들은 누구를 위한 것입니까? 이러한 방법은 "양손"을 제공하기 위해 추가되었습니다. 내가 무슨 말을 하는 거지? 음, 한편으로는 람다와 Stream API라는 새로운 기능을 추가할 필요가 있었습니다. 반면에 Java의 유명한 기능인 이전 버전과의 호환성을 유지하는 것이 필요했습니다. 이를 위해 인터페이스에는 새로운 기성 솔루션이 필요했습니다. 이것이 기본 방법이 우리에게 온 방법입니다. 기본 메서드는 키워드로 표시된 인터페이스에 구현된 메서드입니다 default. stream()예를 들어, 인터페이스 의 잘 알려진 방법입니다 Collection. 저를 믿으세요. 이 인터페이스는 생각보다 간단하지 않습니다. 또는 마찬가지로 유명한 forEach()방법Iterable상호 작용. 또한 기본 메서드가 추가되기 전까지는 존재하지 않았습니다. 그건 그렇고, 여기 CodeGym에서 그것에 대해 읽을 수도 있습니다 .

15. 그렇다면 두 개의 동일한 기본 메서드를 상속하는 방법은 무엇입니까?

기본 방법이 무엇인지에 대한 이전 답변은 또 다른 질문을 합니다. 인터페이스에서 메소드를 구현할 수 있다면 이론적으로 동일한 메소드로 두 개의 인터페이스를 구현할 수 있습니다. 어떻게 하죠? 다음은 동일한 메서드를 사용하는 두 가지 인터페이스입니다.

interface A {
   default void foo() {
       System.out.println("Foo A");
   }
}

interface B {
   default void foo() {
       System.out.println("Foo B");
   }
}
그리고 이 두 인터페이스를 구현하는 클래스가 있습니다. 그러나 인터페이스 A 또는 B에서 특정 방법을 선택하는 방법은 무엇입니까? 다음 특수 구성은 다음을 허용합니다 A.super.foo().

public class C implements A, B {
   public void fooA() {
       A.super.foo();
   }

   public void fooB() {
       B.super.foo();
   }
}
따라서 메서드는 인터페이스 의 fooA()기본 메서드를 사용 하고 메서드는 인터페이스 의 메서드를 사용합니다 . foo()AfooB()foo()B

16. 추상 메서드와 클래스는 무엇입니까?

Java에서 abstract예약어입니다. 추상 클래스 및 메서드를 나타내는 데 사용됩니다. 먼저 정의가 필요합니다. abstract추상 메서드는 추상 클래스에서 구현하지 않고 키워드를 사용하여 선언한 메서드입니다 . 즉, 이것은 인터페이스에서와 같은 방법이지만 예를 들어 다음과 같은 키워드가 추가됩니다.

public abstract void foo();
추상 클래스는 다음 키워드로도 표시된 클래스입니다 abstract.

public abstract class A {

}
추상 클래스에는 다음과 같은 몇 가지 기능이 있습니다.
  • 추상 클래스의 개체를 만들 수 없습니다.
  • 추상 메서드를 가질 수 있습니다.
  • 추상 메서드가 없을 수도 있습니다.
추상 클래스는 일련의 공통 동작 및 상태(즉, 메서드 및 변수)가 있는 추상화(동어반복에 대해 유감)에 필요합니다. 실제 생활은 예제로 가득 차 있습니다. 우리 주변의 모든 것. "동물", "자동차", "기하학적 도형" 등.

17. String, StringBuilder 및 StringBuffer의 차이점은 무엇입니까?

String값은 상수 문자열 풀에 저장됩니다. 문자열이 생성되는 즉시 이 풀에 나타납니다. 그리고 당신은 그것을 삭제할 수 없습니다. 예를 들어:

String name = "book";
변수는 상수 문자열 풀을 가리킬 것입니다. Java Core에 대한 상위 50개의 면접 질문 및 답변.  파트 1 - 4이름 변수를 다른 값으로 설정하면 다음과 같습니다.

name = "pen";
상수 문자열 풀은 다음과 같습니다. Java Core에 대한 상위 50개의 면접 질문 및 답변.  파트 1 - 5즉, 두 값이 모두 그대로 유지됩니다. 문자열 버퍼:
  • String값은 스택에 저장됩니다. 값이 변경되면 새 값이 이전 값을 대체합니다.
  • String Buffer동기화되므로 스레드로부터 안전합니다.
  • 스레드 안전성으로 인해 성능이 좋지 않습니다.
예:

StringBuffer name = “book”;
Java Core에 대한 상위 50개의 면접 질문 및 답변.  파트 1 - 6name 변수의 값이 변경되는 즉시 스택의 값이 변경됩니다. Java Core에 대한 상위 50개의 면접 질문 및 답변.  파트 1 - 7StringBuilder는 와 정확히 동일하지만 StringBuffer스레드로부터 안전하지 않습니다. 결과적으로 StringBuffer.

18. 추상 클래스와 인터페이스의 차이점은 무엇입니까?

추상 클래스:
  • 추상 클래스에는 기본 생성자가 있습니다. 추상 클래스의 자손이 생성될 때마다 호출됩니다.
  • 추상 메서드와 비추상 메서드를 모두 포함할 수 있습니다. 일반적으로 추상 클래스는 추상 메서드를 가질 필요가 없습니다.
  • 추상 클래스를 상속하는 클래스는 추상 메서드만 구현해야 합니다.
  • 추상 클래스는 인스턴스 변수를 가질 수 있습니다(질문 #5 참조).
상호 작용:
  • 인터페이스에는 생성자가 없으며 초기화할 수 없습니다.
  • 추상 메서드만 추가할 수 있습니다(기본 메서드 제외).
  • 인터페이스를 구현하는 클래스는 모든 메서드를 구현해야 합니다(기본 메서드 제외).
  • 인터페이스는 상수만 가질 수 있습니다.

19. 배열의 요소에 액세스하는 것이 O(1)인 이유는 무엇입니까?

이 질문은 말 그대로 지난 인터뷰에서 물었습니다. 나중에 알게 된 것처럼 이 질문의 목적은 사람이 어떻게 생각하는지 보기 위한 것입니다. 분명히 이 지식에는 실질적인 가치가 거의 없습니다. 아는 것만으로도 충분합니다. 먼저 O(1)이 "일정한 시간" 알고리즘의 시간 복잡도 에 대한 표기법임을 명확히 해야 합니다 . 즉, 이 지정은 가장 빠른 실행 시간을 나타냅니다. 이 질문에 답하려면 배열에 대해 알고 있는 내용을 고려해야 합니다. 배열을 만들려면 int다음을 작성해야 합니다.

int[] intArray = new int[100];
이 구문에서 몇 가지 결론을 도출할 수 있습니다.
  1. 배열이 선언되면 해당 유형을 알 수 있습니다. 유형을 알면 배열의 각 셀 크기를 알 수 있습니다.
  2. 전체 배열의 크기를 알고 있습니다.
따라서 어떤 셀에 쓸 것인지 이해하려면 쓸 메모리 영역을 계산하기만 하면 됩니다. 컴퓨터의 경우 이것은 쉬운 일입니다. 컴퓨터는 할당된 메모리가 시작되는 위치, 요소 수 및 각 셀의 크기를 알고 있습니다. 이 모든 것은 쓸 위치가 배열의 시작 위치 + 인덱스를 곱한 각 셀의 크기와 같다는 것을 의미합니다.

그렇다면 ArrayList의 객체에 액세스할 때 O(1)에 어떻게 도달합니까?

이 질문은 이전 질문 바로 다음에 나옵니다. 진실은 프리미티브를 보유하는 배열로 작업할 때 요소 유형의 크기를 미리(생성 시점에) 알고 있다는 것입니다. Java Core에 대한 상위 50개의 면접 질문 및 답변.  파트 1 - 8그러나 이러한 종류의 상속 계층 구조 가 있고 유형 A의 요소에 대한 컬렉션을 만들고 다른 구현(B, C 및 D)을 추가하려는 경우 어떻게 해야 합니까 ?

List<A> list = new ArrayList();
list.add(new B());
list.add(new C());
list.add(new D());
list.add(new B());
이 상황에서 각 셀의 크기를 어떻게 계산합니까? 결국, 각 개체는 다를 수 있으며 다른 추가 필드가 있을 수 있습니다. 무엇을 해야 합니까? 여기서 질문은 당신을 혼란스럽게 하기 위한 방식으로 제기됩니다. 우리는 컬렉션이 개체를 직접 저장하지 않는다는 것을 알고 있습니다. 개체에 대한 참조만 저장합니다. 그리고 모든 참조는 동일한 크기를 가지며 알려져 있습니다. 결과적으로 여기에서 이전 질문과 같은 방식으로 주소를 계산합니다.

21. 오토박싱 및 언박싱

역사적 배경: autoboxing 및 unboxing은 JDK 5의 주요 혁신 중 일부입니다. Autoboxing은 기본 유형에서 해당 래퍼 클래스로 자동 변환하는 프로세스입니다. 언박싱은 오토박싱의 정반대입니다. 래퍼 클래스를 프리미티브로 변환하는 과정입니다. 그러나 래퍼의 값이 이면 개봉하는 동안 nulla가 NullPointerException발생합니다.

프리미티브 및 해당 래퍼

원어 래퍼 클래스
부울 부울
정수 정수
바이트 바이트
성격
뜨다 뜨다
짧은 짧은
더블 더블

// 오토박싱 발생:

  • 래퍼 클래스에 대한 참조에 프리미티브를 할당할 때:

    자바 5 이전:

    
    // Manual boxing (the way it was BEFORE Java 5).
    public void boxingBeforeJava5() {
       Boolean booleanBox = new Boolean(true);
       Integer intBox = new Integer(3);
       // And so on for other types
    }
    
    After Java 5:
    // Automatic boxing (the way it became in Java 5).
    public void boxingJava5() {
       Boolean booleanBox = true;
       Integer intBox = 3;
       // And so on for other types
    }
    
  • 프리미티브가 래퍼를 예상하는 메서드에 인수로 전달될 때:

    
    public void exampleOfAutoboxing() {
       long age = 3;
       setAge(age);
    }
    
    public void setAge(Long age) {
       this.age = age;
    }
    

// 언박싱 발생:

  • 기본 변수에 래퍼 클래스의 인스턴스를 할당할 때:

    
    // BEFORE Java 5:
    int intValue = new Integer(4).intValue();
    double doubleValue = new Double(2.3).doubleValue();
    char c = new Character((char) 3).charValue();
    boolean b = Boolean.TRUE.booleanValue();
    
    // And after JDK 5:
    int intValue = new Integer(4);
    double doubleValue = new Double(2.3);
    char c = new Character((char) 3);
    boolean b = Boolean.TRUE;
    
  • 산술 연산 중. 작업은 기본 유형에만 적용되므로 기본 유형에 대한 언박싱이 필요합니다.

    
    // BEFORE Java 5:
    Integer integerBox1 = new Integer(1);
    Integer integerBox2 = new Integer(2);
    
    // A comparison used to require this:
    integerBox1.intValue() > integerBox2.intValue()
          
    // In Java 5
    integerBox1 > integerBox2
    
  • 래퍼 클래스의 인스턴스를 해당 프리미티브를 사용하는 메서드에 전달할 때:

    
    public void exampleOfAutoboxing() {
       Long age = new Long(3);
       setAge(age);
    }
    
    public void setAge(long age) {
       this.age = age;
    }
    

22. 최종 키워드는 무엇이며 어디에 사용됩니까?

키워드 final는 변수, 메서드 및 클래스에서 사용할 수 있습니다.
  1. 최종 변수의 값은 초기화된 후에는 변경할 수 없습니다.
  2. 마지막 수업은 불임입니다 :) 아이를 가질 수 없습니다.
  3. 최종 메서드는 자손이 재정의할 수 없습니다.
우리는 높은 수준의 내용을 다루었습니다. 이제 더 깊이 잠수해 봅시다.

최종 변수

Java는 변수를 선언하고 값을 할당하는 두 가지 방법을 제공합니다.
  1. 변수를 선언하고 나중에 초기화할 수 있습니다.
  2. 변수를 선언하고 바로 값을 할당할 수 있습니다.
다음은 최종 변수의 이러한 사용을 보여주는 예입니다.

public class FinalExample {

   // A static final variable that is immediately initialized:
   final static String FINAL_EXAMPLE_NAME = "I'm likely the final one";

   // A final variable that is not initialized, but will only work if you
   // initialize it in the constructor:
   final long creationTime;

   public FinalExample() {
       this.creationTime = System.currentTimeMillis();
   }

   public static void main(String[] args) {
       FinalExample finalExample = new FinalExample();
       System.out.println(finalExample.creationTime);

       // The final FinalExample.FINAL_EXAMPLE_NAME field cannot be accessed
//    FinalExample.FINAL_EXAMPLE_NAME = "Not you're not!";

       // The final Config.creationTime field cannot be accessed
//    finalExample.creationTime = 1L;
   }
}

최종 변수를 상수로 간주할 수 있습니까?

최종 변수에 새로운 값을 할당할 수 없기 때문에 상수 변수인 것 같습니다. 그러나 언뜻 보기에 변수의 데이터 유형이 이면 immutable예, 상수입니다. 그러나 데이터 유형이 mutable변경 가능한 경우 메소드와 변수를 사용하여 변수가 참조하는 객체의 값을 변경할 수 있습니다 final. 이 때문에 상수라고 할 수 없습니다. 다음 예는 일부 최종 변수가 실제 상수인 반면 다른 변수는 변경될 수 있으므로 그렇지 않음을 보여줍니다.

public class FinalExample {

   // Immutable final variables
   final static String FINAL_EXAMPLE_NAME = "I'm likely the final one";
   final static Integer FINAL_EXAMPLE_COUNT  = 10;

   // Mutable final variables
   final List<String> addresses = new ArrayList();
   final StringBuilder finalStringBuilder = new StringBuilder("Constant?");
}

로컬 최종 변수

final메서드 내에서 변수가 생성 되면 local final변수라고 합니다.

public class FinalExample {

   public static void main(String[] args) {
       // You can do this
       final int minAgeForDriveCar = 18;

       // Or you can do this, in a for-each loop:
       for (final String arg : args) {
           System.out.println(arg);
       }
   }

}
루프가 반복될 때마다 새 변수가 생성되기 때문에 향상된 for 루프에서 final 키워드를 사용할 수 있습니다. 이것은 일반적인 for 루프에는 적용되지 않으므로 컴파일 타임 오류가 발생한다는 점을 명심하십시오.

// The final local j variable cannot be assigned
for (final int i = 0; i < args.length; i ++) {
   System.out.println(args[i]);
}

기말 수업

로 선언된 클래스는 final확장할 수 없습니다. 간단히 말해서 다른 클래스는 상속할 수 없습니다. finalJDK 클래스 의 훌륭한 예는 String입니다. 불변 클래스를 만드는 첫 번째 단계는 클래스를 로 표시하여 final확장되지 않도록 하는 것입니다.

public final class FinalExample {
}

// Compilation error!
class WantsToInheritFinalClass extends FinalExample {
}

최종 방법

메서드가 최종으로 표시되면 이를 최종 메서드라고 합니다(이치에 맞습니까?). 최종 메서드는 하위 클래스에서 재정의할 수 없습니다. 부수적으로 Object 클래스의 wait() 및 notify() 메서드는 최종 메서드이므로 재정의할 수 없습니다.

public class FinalExample {
   public final String generateAddress() {
       return "Some address";
   }
}

class ChildOfFinalExample extends FinalExample {

   // Compilation error!
   @Override
   public String generateAddress() {
       return "My OWN Address";
   }
}

Java에서 final을 사용하는 방법 및 위치

  • 일부 클래스 수준 상수를 정의하려면 final 키워드를 사용하십시오.
  • 변경하지 않으려는 개체에 대한 최종 변수를 만듭니다. 예를 들어 로깅 목적으로 사용할 수 있는 개체별 속성입니다.
  • 클래스를 확장하지 않으려면 클래스를 최종으로 표시하십시오.
  • 변경할 수 없는 클래스를 만들어야 하는 경우 최종 클래스로 만들어야 합니다.
  • 메서드의 구현이 하위 항목에서 변경되지 않도록 하려면 메서드를 로 표시합니다 final. 이는 구현이 변경되지 않도록 하는 데 매우 중요합니다.

23. 변경 가능한 유형과 변경 불가능한 유형은 무엇입니까?

변하기 쉬운

가변 객체는 생성 후 상태와 변수를 변경할 수 있는 객체입니다. 가변 클래스의 예로는 StringBuilder 및 StringBuffer가 있습니다. 예:

public class MutableExample {

   private String address;

   public MutableExample(String address) {
       this.address = address;
   }

   public String getAddress() {
       return address;
   }

   // This setter can change the name field
   public void setAddress(String address) {
       this.address = address;
   }

   public static void main(String[] args) {

       MutableExample obj = new MutableExample("First address");
       System.out.println(obj.getAddress());

       // We are updating the name field, so this is a mutable object
       obj.setAddress("Updated address");
       System.out.println(obj.getAddress());
   }
}

불변

불변 객체는 객체가 생성된 후 상태와 변수를 변경할 수 없는 객체입니다. HashMap의 훌륭한 키라고 생각하지 않습니까? :) 예를 들어 String, Integer, Double 등이 있습니다. 예:

// We'll make this class final so no one can change it
public final class ImmutableExample {

   private String address;

   ImmutableExample(String address) {
       this.address = address;
   }

   public String getAddress() {
       return address;
   }

   // We remove the setter

   public static void main(String[] args) {

       ImmutableExample obj = new ImmutableExample("Old address");
       System.out.println(obj.getAddress());

       // There is no way to change this field, so it is an immutable object
       // obj.setName("new address");
       // System.out.println(obj.getName());

   }
}
다음 부분에서는 컬렉션에 대한 질문과 답변을 고려합니다. Java Core에 대한 GitHub 상위 50개 면접 질문 및 답변의 내 프로필입니다. 2 부
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION