자바에서 매개 변수를 수정하기 위해 최종 사용의 역할
메소드 매개 변수 전에 최종 키워드를 추가하는 것은 메소드 가중치에서 데이터가 수정되는 것을 방지하는 것입니다.
두 가지 주요 상황이 있습니다. 첫째, 최종을 사용하여 기본 데이터 유형을 수정하십시오. 둘째, 최종을 사용하여 참조 데이터 유형을 수정하십시오.
첫 번째 경우, 기본 데이터 유형을 수정하는데,이 시점에서 매개 변수의 값은 메소드 본문에서 수정할 수 없으며, 즉 재 할당 할 수 없습니다. 그렇지 않으면 편집이 통과되지 않습니다.
두 번째 사례는 참조 유형을 수정하는 것입니다. 현재 매개 변수 변수에 의해 참조 된 객체를 변경할 수 없습니다. 그러나 참조 데이터 유형의 경우 속성을 수정해도 괜찮습니다.
따라서 키워드 최종을 사용하려면 기본 데이터 유형을 사용하여 매우 유용합니다.
최종 변수 :
기본 유형에 최종적으로 사용하십시오 : 상수이며 값은 일정하며 값은 변경되지 않습니다.
객체 참조에 최종 사용 : 참조를 일정하게 만들고 참조가 객체를 가리 키도록 초기화되면 다른 객체를 가리 키도록 변경할 수 없습니다. 그러나 객체 자체를 수정할 수 있으며 Java는 객체를 일정하게 만드는 방법을 제공하지 않습니다. 이 제한은 객체 인 배열을 사용합니다.
예:
클래스 값 {int i; 공공 가치 (int i) {this.i = i; }} public class finalData {private static random = new random (47); 개인 문자열 ID; Public FinalData (String ID) {this.id = id; } private final int valueone = 9; 개인 정적 최종 int value_two = 99; 공개 정적 최종 int value_three = 39; 개인 최종 int i4 = random.nextint (20); 정적 최종 int int_5 = random.nextint (20); 개인 값 v1 = 새 값 (11); 개인 최종 값 v2 = 새 값 (22); 개인 정적 최종 값 VAL_3 = 새 값 (33); 개인 최종 int [] a = {1, 2, 3, 4, 5, 6}; public String toString () {return id + ":" + "i4 =" + i4 + ", int_5 =" + int_5; } public static void main (String [] args) {FinalData fd1 = new FinalData ( "FD1"); //! fd1. valueone ++; // ValueOne은 기본 유형 상수이기 때문에 그 값은 일정한 fd1.v2.i ++입니다. // 최종으로 수정 된 객체의 내용은 fd1.v1 = 새 값 (9)을 변경할 수 있습니다. for (int i = 0; i <fd1.a.length; i ++) fd1.a [i] ++; //! fd1.v2 = 새로운 값 (0); // v2는 최종적으로 수정 된 참조 유형이므로 다른 객체를 가리키도록 참조를 수정할 수 없습니다. fd1.val_3 = 새 값 (1); // 변경할 수없는 메모리 공간을 차지합니다. //! fd1.a = 새로운 int [3]; // 최종 수정 된 배열 System.out.println (FD1); System.out.println ( "새로운 FinalData 생성"); FinalData FD2 = 새로운 FinalData ( "FD2"); System.out.println (fd1); System.out.println (FD2); }}/*출력 : fd1 : i4 = 15, int_5 = 18 개의 새로운 FinalDatafd1 : i4 = 15, int_5 = 18fd2 : i4 = 13, int_5 = 18*/분석 :
FD1의 경우, FD2의 경우, i4는 독특합니다. 즉, 각 객체는 i4를 가지고 있지만 int_5는 정적으로 선언됩니다. 즉, 새 객체가 생성 될 때마다 초기화하기보다는 로딩시 초기화되는 클래스, fd1 및 fd2 share int_5에 의해 공유됩니다 (예 : i4). 그러나 동시에 최종적으로 설정되므로 참조는 변경할 수 없습니다. 즉, 다른 객체를 가리키도록 수정할 수 없습니다.
Blank Final :
최종으로 선언되지만 초기 가치는 없습니다. 최종은 도메인 정의 또는 각 생성자에서 표현식을 사용하여 할당해야하므로 최종 도메인이 항상 사용하기 전에 초기화되는 이유입니다.
최종 매개 변수 :
즉, 메소드에서 매개 변수 참조를 변경하여 다른 매개 변수를 가리킬 수는 없지만 최종 객체가 지적한 내용을 수정할 수 있습니다.
예:
클래스 gizmo {int i = 0; public void spin () {}} public class finalArguments {void with (final gizmo g) {//! g = 새로운 gizmo (); // Final에 의해 수정 된 참조는 다른 객체 G.I ++를 가리 키도록 수정되지 않습니다. // 그러나 최종 객체가 지적한 내용을 수정할 수 있습니다} void (gizmo g) {g = new gizmo (); g.spin (); } // int g (최종 INT I) {// //! i ++; // 매개 변수 i가 상수 값이기 때문에 //} int g (최종 int i) {return i + 1; } public static void main (String [] args) {FinalArguments bf = new FinalArguments (); bf.with (null); bf.with (null); }}분석 :
매개 변수는 최종으로 선언됩니다. 기본 매개 변수 인 경우 상수이며 수정할 수 없습니다. 참조 변수 인 경우 다른 객체를 가리키도록 수정할 수는 없지만 참조에 의해 언급 된 객체의 내용을 수정할 수 있습니다.
Fianl 방법 :
사용 이유 :
클래스의 모든 개인 방법은 암시 적으로 최종적으로 지정되며 개인 방법을 사용할 수 없으므로 덮어 쓸 수 없습니다. 최종 수정자는 개인 방법에 추가 할 수 있지만이 방법에 대한 추가 의미는 제공되지 않습니다.
예:
{private final void f () {system.out.println ( "withfinals.f ()"); } private void g () {system.out.println ( "OrevidingPrivate.f ()"); }} Class OveridingPrivate는 {private final void f () {system.out.println ( "atrevidingPrivate.f ()")와 함께 확장됩니다. }} Class OredidePrivate2는 재정의 프리티드 주석을 사용하여 F () 메소드가 부모 클래스의 f () 메소드를 덮어 쓰도록 강제로 사용하면 오류가보고됩니다.* 상위 클래스에 메소드가 있는지 알지 못하기 때문에 오류가보고됩니다. g () 메소드의 경우 새로운 메소드 만 생성되며 * 부모 클래스에서 g () 메소드를 덮어 쓰지 않습니다. *///@override public final void f () {system.out.println ( "atrevidingprivate2.f ()"); } public void g () {system.out.println ( "atrevidingprivate2.g ()"); }} public class finalsover ridingillusion {public static void main (String [] args) {OrevidingPrivate2 op2 = new OveridingPrivate2 (); op2.f (); op2.g (); // 상향 우선 순위를 바꿀 수 있습니다. OP = OP2; //! op.f (); // 상위 클래스의 최종 방법은 서브 클래스에 보이지 않습니다. //! op.g (); Withfinals wf = op2; // wf.f (); // wf.g (); }}/*출력 : OrevidingPrivate2.f () OrevidingPrivate2.g ()*/분석 :
적용 범위는 언제 발생합니까?
1. 부모 클래스와 정확히 동일한 서브 클래스에 나타나는 방법
2. 서브 클래스는 상위 클래스로 변환하고 상위 클래스의 메소드를 호출 할 수 있습니다.
상위 클래스의 메소드가 최종 또는 개인으로 선언 된 경우이 메소드는 하위 클래스에 보이지 않습니다. 상위 클래스와 정확히 동일한 메소드가 서브 클래스에서 생성 되더라도 부모 클래스에서 상체 된 메소드가 아닌 새로운 메소드입니다.
최종 수업 :
즉,이 클래스는 당신이든 다른 사람이든, 즉,이 클래스는 변경을 요구하지 않으며 문자열 클래스와 같은 서브 클래스가 필요하지 않습니다.
예:
클래스 스몰 브레인 {} 최종 클래스 공룡 {int i = 7; int j = 1; smallbrain x = 새로운 smallbrain (); void f () {}} // 오류 : 유형은 최종 클래스 공룡 // 공룡 클래스를 서브 클래스를 하위 클래스 할 수 없습니다. // 하위 클래스를 가질 수 없습니다. // 클래스는 공룡 {} 공공 클래스 jurassic {public static void main (String [] args) {dinosaur n = new Dinosaur (); nf (); ni = 40; N.J ++; }}요약
위는이 기사의 전체 내용입니다. 이 기사의 내용에 모든 사람의 연구 나 작업에 대한 특정 참조 가치가 있기를 바랍니다. 궁금한 점이 있으면 의사 소통을 위해 메시지를 남길 수 있습니다. Wulin.com을 지원 해주셔서 감사합니다.