답변:
final
키워드는 자바에서 여러 가지 용도가있다. 사용되는 컨텍스트에 따라 C # 의 sealed
및 readonly
키워드에 모두 해당합니다 .
서브 클래 싱을 방지하려면 (정의 된 클래스의 상속) :
자바
public final class MyFinalClass {...}
씨#
public sealed class MyFinalClass {...}
virtual
메소드의 오버라이드를 방지하십시오 .
자바
public class MyClass
{
public final void myFinalMethod() {...}
}
씨#
public class MyClass : MyBaseClass
{
public sealed override void MyFinalMethod() {...}
}
Joachim Sauer가 지적한 것처럼, 두 언어의 주목할만한 차이점은 Java는 기본적으로 모든 비 정적 메소드를으로 virtual
표시하고 C #은을 표시 한다는 것 sealed
입니다. 따라서 기본 클래스에 sealed
명시 적으로 표시된 메서드의 재정의를 더 이상 중지하지 않으려면 C # 에서 키워드 만 사용해야합니다 virtual
.
변수를 한 번만 할당하려면 :
자바
public final double pi = 3.14; // essentially a constant
씨#
public readonly double pi = 3.14; // essentially a constant
참고로, readonly
키워드 의 효과 const
는 readonly
표현식이 compile-time이 아닌 런타임시 평가 되므로 임의의 표현식을 허용 한다는 점에서 키워드 의 효과 와 다릅니다 .
readonly
멤버 변수 는 생성자에서 수정할 수 있습니다. pastebin.com/AzqzYGiA
상황에 따라 다릅니다.
final
클래스 또는 메소드는 C # 1 당량이다sealed
.final
필드, C # 1 당량이다readonly
.final
로컬 변수 또는 매개 변수에있어서, 직접 C # 1 당량 없다.For a final local variable or method parameter, there's no direct C# equivalent
큰 차이가 있습니다.
const
값 유형에만 사용할 수 있습니다. 내가 아는 한 로컬 참조 유형에 효과적인 상수를 만들 수있는 방법이 없습니다.
여기서 누락 된 것은 최종 멤버 변수에 대한 명확한 할당을 보장하는 Java의 보증입니다.
최종 멤버 변수가 V 인 클래스 C의 경우 C의 모든 생성자를 통한 모든 가능한 실행 경로는 V를 정확히 한 번만 지정해야합니다. V를 지정하지 않거나 V를 두 번 이상 지정하지 않으면 오류가 발생합니다.
C #의 readonly 키워드는 그러한 보장을하지 않습니다. 컴파일러는 readonly 멤버를 할당하지 않은 채로 두거나 생성자 내에서 여러 번 할당하도록 허용하는 것 이상으로 행복합니다.
따라서 final 및 readonly (적어도 멤버 변수와 관련하여)는 동등하지 않습니다. final은 훨씬 엄격합니다.
언급 된 바와 같이, sealed
등가 인 final
방법 및 클래스는.
나머지는 복잡합니다.
들어 static final
필드, static readonly
가능한 가장 가까운 것입니다. 정적 생성자에서 정적 필드를 초기화 할 수 있습니다. 이는 Java의 정적 초기화 기와 상당히 유사합니다. 이는 상수 (프리미티브 및 불변 객체)와 변경 가능한 객체에 대한 상수 참조 모두에 적용됩니다.
const
수정은 상수 상당히 유사하지만 정적 생성자에서 그들을 설정할 수 없습니다.
readonly
사용할 수 있습니다. 그것은 같지 않습니다- final
생성자 또는 이니셜 라이저에서도 정확히 하나의 할당이 필요합니다.final
내가 아는 지역 변수에 해당 하는 C #은 없습니다 . 왜 누구에게 필요한지 궁금하다면 : if-else, switch-case 등 전에 변수를 선언 할 수 있습니다 . 최종 선언하면 최대 한 번 할당됩니다.
일반적으로 Java 로컬 변수는 읽기 전에 한 번 이상 지정해야합니다. 값을 읽기 전에 분기가 튀어 나오지 않으면 최종 변수가 정확히 한 번 할당됩니다. 이 모든 것은 컴파일 타임에 확인됩니다. 이를 위해서는 오류에 대한 마진이 적은 잘 동작하는 코드가 필요합니다.
요약하자면 C #에는에 해당하는 값이 없습니다 final
. Java에는 C #의 멋진 기능이 없지만 C #이 동등한 기능을 제공하지 못하는 곳을 Java 프로그래머로 보는 것이 나에게 상쾌합니다.
Java 클래스 final 및 메소드 final-> 봉인되었습니다. Java 멤버 변수 final-> 런타임 상수의 경우 읽기 전용, 컴파일 시간 상수의 const.
지역 변수 final 및 메소드 인수 final에 해당하지 않습니다.
C # 상수는 컴파일 시간 상수의 const 키워드 또는 런타임 상수의 readonly 키워드를 사용하여 선언됩니다. 상수의 의미는 C # 및 Java 언어에서 동일합니다.