자바에서`final`,`finally` 및`finalize` 키워드는 어떤 목적을 달성합니까? [닫은]


82

자바에서 어떤 목적으로는 키워드를 어떻게 final, finally그리고 finalize성취?



12
비교 가능한 개념도 아닙니다. 철자가 비슷합니다. 약간의 독서를하십시오.
Marcelo Cantos

3
그것들은 개념적으로 완전히 관련이 없습니다. 각각 따로 공부하십시오.
Ed Staub 2011 년

7
비교적 일반적인 질문으로 보이므로 닫아서는 안됩니다.
David Titarenco 2010 년

1
좋은 답변으로 인해 다시 오픈하도록 투표했으며, 이는 여기에 방문하는 사용자에게 유용 할 수 있습니다.
akappa

답변:


272

결정적인

final 변수를 "변경 불가능"으로 표시하는 데 사용할 수 있습니다.

private final String name = "foo";  //the reference name can never change

final 또한 메서드를 "재정의 할 수 없음"으로 만들 수 있습니다.

public final String toString() {  return "NULL"; }

final클래스를 "상속 가능"하지 않게 만들 수도 있습니다. 즉, 클래스는 하위 클래스가 될 수 없습니다.

public final class finalClass {...}
public class classNotAllowed extends finalClass {...} // Not allowed

드디어

finallytry / catch 문에서 "항상"코드실행 하는 데 사용됩니다.

lock.lock();
try {
  //do stuff
} catch (SomeException se) {
  //handle se
} finally {
  lock.unlock(); //always executed, even if Exception or Error or se
}

Java 7에는 java.io.Closeable 또는 java.lang.AutoCloseable 을 명시 적 또는 암시 적으로 구현하는 리소스를 자동으로 닫는 데 사용할 수 있는 새로운 try with resources 문 이 있습니다.

마무리하다

finalize객체가 가비지 수집 될 때 호출됩니다. 재정의 할 필요가 거의 없습니다. 예 :

protected void finalize() {
  //free resources (e.g. unallocate memory)
  super.finalize();
}

18
대부분의 Java 책보다 더 나은 대답 !!
diaryfolio

3
감사합니다. 이 대답은 자신을 "전문가"라고 부르는 다른 사람들과 비교하여 잘 설명되어 있습니다.
datnt

2
좋은 대답이지만 finalize 메서드의 서명이 잘못되었습니다.
Samarth Shah

참고 :Object#finalize()메소드는 Java 9 ( JDK-8165641 ) 에서 더 이상 사용되지 않습니다 .
Slaw

19
  • "최종"은 변경할 수 없음을 나타냅니다. 일반적으로 프로그램 수명 내내 동일한 값을 유지하는 정적 변수에 이것을 사용하려고합니다.
  • "Finally"는 try / catch 블록과 함께 사용됩니다. "finally"절 내부의 모든 것은 'try'블록의 코드가 예외를 throw하는지 여부에 관계없이 실행됩니다.
  • "Finalize"는 객체가 가비지 수집되기 전에 JVM에서 호출됩니다.

6

final 키워드는 상수를 선언하는 데 사용됩니다.

final int FILE_TYPE = 3;

finally 키워드는 throw 된 예외에 관계없이 실행할 코드 블록을 지정하기 위해 try catch 문에서 사용됩니다.

try
{
  //stuff
}
catch(Exception e)
{
  //do stuff
}
finally
{
  //this is always run
}

마지막으로 (haha) finalize im은 키워드가 확실하지 않지만 Object 클래스 에는 finalize () 함수가 있습니다.


6

http://allu.wordpress.com/2006/11/08/difference-between-final-finally-and-finalize/

최종 – 상수 선언.

finally – finally 블록은 System.exit (0) 호출을 제외하고 try 블록이 종료 될 때 항상 실행됩니다. 이렇게하면 예기치 않은 예외가 발생하더라도 finally 블록이 실행됩니다. 그러나 마지막으로 예외 처리 이상의 용도로 유용합니다. 프로그래머가 반환, 계속 또는 중단으로 인해 실수로 정리 코드를 우회하는 것을 방지 할 수 있습니다. 정리 코드를 finally 블록에 넣는 것은 예외가 예상되지 않는 경우에도 항상 좋은 방법입니다.

finalize () – 가비지 수집에 도움이되는 메서드입니다. 가비지 수집기에 의해 개체가 삭제되기 전에 호출되어 해당 상태를 정리할 수있는 메서드입니다. 파일 핸들, 소켓, 데이터베이스 연결 등과 같은 비 메모리 리소스를 해제하는 데 사용해서는 안됩니다. Java에는 이러한 리소스가 한정되어 있고 이러한 비 메모리 리소스를 해제하기 위해 가비지 컬렉션이 시작될시기를 알 수 없기 때문입니다. finalize () 메서드를 통해.

Google에서 검색해 보았는데 설명에 대한 설명이 필요하십니까?


4
Stack Overflow에 오신 것을 환영합니다! 이 문서가 사실 질문에 대답 수 있지만, 바람직 할 것이다 여기에 대한 대답의 본질적인 부분을 포함하고 참조 할 수 있도록 링크를 제공합니다. Stack Overflow는 질문과 답변만큼 유용하며이 블로그 호스트가 다운되거나 URL이 이동하면이 답변은 쓸모 없게됩니다. 감사!
sarnold

6

final : final은 키워드입니다. final로 해제 된 변수는 한 번만 초기화해야하며 변경할 수 없습니다. final로 선언 된 Java 클래스는 확장 할 수 없습니다. final로 선언 된 메서드는 재정의 할 수 없습니다.

마지막 : 마지막으로 블록입니다. finally 블록은 try 블록이 종료 될 때 항상 실행됩니다. 이렇게하면 예기치 않은 예외가 발생하더라도 finally 블록이 실행됩니다. 그러나 마지막으로 예외 처리 이상의 용도로 유용합니다. 프로그래머가 반환, 계속 또는 중단으로 인해 실수로 정리 코드를 우회하는 것을 방지 할 수 있습니다. 정리 코드를 finally 블록에 넣는 것은 예외가 예상되지 않는 경우에도 항상 좋은 방법입니다.

finalize : finalize는 메서드입니다. 객체가 가비지 수집되기 전에 런타임 시스템은 finalize () 메서드를 호출합니다. 가비지 수집 전에 finalize () 메서드에서 시스템 리소스 릴리스 코드를 작성할 수 있습니다.


2

1. Final • Final은 클래스, 메서드 및 변수에 대한 제한을 적용하는 데 사용됩니다. • 최종 클래스는 상속 될 수 없으며 최종 메서드는 재정의 될 수 없으며 최종 변수 값은 변경 될 수 없습니다. • 생성자에서 초기화 된 최종 변수가 비어있는 경우를 제외하고 최종 변수는 생성시 초기화됩니다. • Final은 키워드입니다.

2. 마지막 • 마지막은 try 및 catch와 함께 예외 처리에 사용됩니다. • 예외 처리 여부와 관계없이 실행됩니다. •이 블록은 데이터베이스 연결, I / O 리소스와 같은 리소스를 닫는 데 사용됩니다. • 마지막으로 블록입니다.

3. Finalize • Finalize는 정리 처리를 수행하기 위해 적합한 개체를 수집하기 직전에 가비지 수집 스레드에 의해 호출됩니다. • 이것은 객체가 정리를 수행 할 수있는 마지막 기회이지만 finalize ()가 호출 될지 여부가 보장되지 않기 때문에 finalize 호출까지 리소스를 유지하는 것이 좋지 않습니다. • Finalize는 방법입니다.


0

java에서 final의 의미는 다음과 같습니다. -applied to a variable은 초기화 된 각 변수를 더 이상 수정할 수 없음을 의미합니다.

private final double numer = 12;

이 값을 수정하려고하면 오류가 발생합니다.

-applied to a method는 해당 메서드를 재정의 할 수 없음을 의미합니다.

 public final void displayMsg()
    {
        System.out.println("I'm in Base class - displayMsg()");
    }

그러나 final 키워드는 메서드의 재정의를 제한하기 때문에 final 메서드를 상속 할 수 있습니다.

-클래스에 적용됨은 해당 클래스를 확장 할 수 없음을 의미합니다.

class Base
{

    public void displayMsg()
    {
        System.out.println("I'm in Base class - displayMsg()");
    }
}

finally의 의미는 다음과 같습니다.

class TestFinallyBlock{  
  public static void main(String args[]){  
  try{  
   int data=25/5;  
   System.out.println(data);  
  }  
  catch(NullPointerException e){System.out.println(e);}  
  finally{System.out.println("finally block is always executed");}  
  System.out.println("rest of the code...");  
  }  
} 

이 예제에서는 try-catch가 실행되었는지 여부에 관계없이 finally 안에있는 것이 항상 실행됩니다. 마무리의 의미 :

class FinalizeExample{  
public void finalize(){System.out.println("finalize called");}  
public static void main(String[] args){  
FinalizeExample f1=new FinalizeExample();  
FinalizeExample f2=new FinalizeExample();  
f1=null;  
f2=null;  
System.gc();  
}}  

가비지 콜렉터를 호출하기 전에

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.