>  기사  >  Java  >  자바 객체 지향 최종 수정자

자바 객체 지향 최종 수정자

王林
王林앞으로
2019-11-26 14:43:172575검색

자바 객체 지향 최종 수정자

1. 최종 수정자 정의:

최종 키워드는 클래스, 변수 및 메소드

final이 변수를 수정한다는 것은 초기값을 얻은 후에는 변수를 변경할 수 없다는 의미입니다(엄밀히 말하면 final로 수정한 변수는 변경할 수 없습니다. 초기값을 얻은 후에는 변수가 변경되지 않습니다). final 변수의 값은 변경할 수 없습니다.)

final은 멤버 변수(클래스 변수, 인스턴스 변수)뿐만 아니라 지역 변수, 형식 매개 변수도 수정할 수 있습니다.

관련 비디오 학습 튜토리얼: #🎜🎜 #java재线learning

2. 최종 멤버 변수 문법 규정:

최종 수정 멤버 변수는 프로그래머가 표시해야 합니다. 초기 값을 공식적으로 지정하면 시스템은 최종 멤버를 암시적으로 초기화하지 않습니다.

1. 최종 수정된 클래스 변수와 인스턴스 변수가 초기값을 설정할 수 있는 곳은 다음과 같습니다.

클래스 변수: 초기값은 반드시 a에 지정해야 합니다. 정적 초기화 블록 또는 클래스를 선언해야 합니다. 변수 지정 시 초기값을 지정해야 하며, 두 곳 중 한 곳에서만 지정할 수 있습니다.

인스턴스 변수: 초기값은 a에 지정해야 합니다. 비정적 초기화 블록, 인스턴스 변수 선언 또는 생성자에서만 세 위치 중 하나에서 지정할 수 있습니다

참고: 일반 초기화 블록이 지정된 경우 인스턴스 변수의 초기값은 생성자에서 인스턴스 변수를 지정할 수 없습니다. Setinitial value

다음 프로그램은 멤버 변수의 최종 수정 효과를 보여줍니다.

package lextends;
public class FinalVariableTest {
    //定义成员变量时指定默认值,合法
    final int a = 6;
    //下面变量将在构造器或初始化块中分配初始值
    final String str;
    final int c;
    final static double d;

    //既没有指定默认值,又没有在初始化块、构造器中指定初始值
    //下面定义的ch实例是不合法的
    //final char ch;
    //初始化块,可对没有指定默认值的实例变量指定初始值
    {
        //在初始化块中为实例变量指定初始值,合法
        str = "Hello";
        //定义a实例变量时已经指定了默认值
        //不能为a重新赋值,因此下面赋值语句非法
        //a=9;
    }

    //静态初始化块,可对没有指定默认值的类变量指定初始值
    static {
        //在静态初始化块中为类变量指定初始值,合法
        d = 5.6;
    }

    //构造器,可以对既没有指定默认值,又没有在初始化块中,指定初始值的实例变量指定初始值
    public FinalVariableTest() {
        //如果在初始化块中已经对str指定了初始值
        //那么在构造器中不能对final变量重新赋值,下面赋值语句非法
        //str="java"
        c = 5;
    }

    public void changeFinal() {
        //普通方法不能为final修饰的成员变量赋值
        //d=1.2
        //不能在普通方法中为final成员变量指定初始值
        //ch = 'a';
    }
public static void mian(String[] args){
    FinalVariableTest ft= new FinalVariableTest();
    System.out.println(ft.a);
    System.out.println(ft.c);
    System.out.println(ft.d);}
}

2. 생성자 또는 초기화 블록 초기화에서 최종 멤버 변수를 수정하려는 경우 초기화 전에 멤버 변수의 값에 액세스하지 마세요.

package lextends;
public class FinalErrorTest {
    //定义一个final修饰的实例变量
    //系统不会对final成员变量进行默认初始化
    final int age;
    {
        //age没有初始化,所以此处代码将引起错误,因为它试图访问一个未初始化的变量
        //只要把定义age时的final修饰符去掉,程序就正确了
        System.out.println(age);
        
        age=6;
        System.out.println(age);
    }
    public static void main(String[] args){
        new FinalErrorTest();
    }
}

3. 최종 지역 변수

1 정의: 시스템은 지역 변수를 초기화하지 않으며 지역 변수는 다음과 같이 표시되어야 합니다. 프로그래머 초기화. 따라서 final을 사용하여 지역변수를 수정하는 경우 정의할 때 기본값을 지정할 수도 있고, 기본값을 지정할 수 없을 수도 있다.

다음 프로그램은 지역 변수와 형식 매개변수의 최종 수정을 보여줍니다.

(최종 수정 형식 매개변수의 경우, 메소드가 호출되면 시스템이 수정하기 때문입니다. 전달된 매개변수에 따라 형식 매개변수. 초기화를 완료하기 위해 최종 수정자를 할당할 수 없음)

package lextends;
public class FinalLocalVariable {
    public void test(final int a){
        //不能对final修饰的形参赋值,下面语句非法
        //a=5;
    }
    public static void mian(String[] args){
        //定义final局部变量时指定默认值,则str变量无法重新赋值
        final String str="hello";
        //下面赋值语句非法
        //str="Java";
        
        //定义final局部变量时没有指定默认值,则d变量可被赋值一次
        final double d;
        d=5.6;
        //对final变量重新赋值,下面语句非法
        //d=6.4;
    }
}

4 최종 수정 기본 유형 변수와 참조 유형 변수의 차이점 #🎜 🎜#final로 수정한 참조형 변수는 재할당할 수 없으나 참조형 변수가 참조하는 객체의 내용은 변경할 수 있다

예를 들어 배열 아래 iArr 변수가 참조하는 객체는 최종 수정 후 iArr 변수를 재할당할 수 없으나, iArr이 참조하는 배열의 요소는 변경할 수 있습니다. 🎜#1. 최종 변수의 경우 인스턴스인지 여부. 변수 또는 지역 변수는 변수가 세 가지 조건을 충족하는 한 최종 변수는 더 이상 변수가 아니지만 직접 수량과 동일합니다.

(1) 최종 수식자를 사용하여 수정

(2) 최종 변수 정의 시 초기값 지정 (3) 초기값 값은 컴파일 시간

2에서 결정될 수 있습니다. 최종 수정자의 중요한 용도는 "매크로 변수"를 정의하는 것입니다. 최종 변수가 정의되면 해당 변수에 초기값이 할당되고 변수인 경우 이를 결정할 수 있습니다. 그러면 이 최종 변수는 본질적으로 "매크로 변수"이며 컴파일러는 프로그램의 모든 변수를 삭제합니다. 이 변수를 사용하는 위치는 변수 값으로 직접 대체됩니다.

3,

eg.
//final修饰数组元素,iArr是一个引用变量
final int[] iArr={5,6,12,9};
System.out.println(Arrays.toString(iArr));
//对数组元素进行排序,合法
Arrays.sort(iArr);
System.out.println(Arrays.toString(iArr));
//对数组进行元素赋值,合法
iArr[2]=-8;
System.out.println(Arrays.toString(iArr));
//下面语句对iArr重新赋值,非法
//iArr=null;

s3의 경우 str1과 str2는 두 개의 일반 변수이므로 컴파일러는 "매크로 대체"를 수행하지 않습니다. 수행되므로 컴파일러는 s3의 값을 결정할 수 없으며 s3을 문자열 풀에 캐시된 "Crazy Java"로 가리킬 수 없습니다.

자바 관련 기사와 튜토리얼을 더 보려면 다음 사이트를 방문하세요.

java 입문 튜토리얼

위 내용은 자바 객체 지향 최종 수정자의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제