Java中的final关键字

final关键字在Java中指的是"没法改变的"。它做为数据,方法和类的修饰符号有以下做用。spa

修饰基本类型

数据以final修饰来告知编译器这是一块恒定不变的数据,好比:code

1)一个永不改变的编译时常量对象

2)一个不但愿被改变的运行时初始化的值blog

对于永不改变的编译时常量,编译器可能将该常量值直接代入计算式中继承

final int MAX = 20;

一般使用大写,多个单词如下划线分隔,其效果(不考虑做用域)可类比于c语言中的:作用域

#define MAX 20

与static联用,该域将占据一个不能改变的存储空间。编译器

static final int MIN = 0;

修饰对象引用

修饰的对象引用不可改变,即一旦引用被初始化指向一个对象,就不能再把它改变指向另外一个对象。一个误区是,引用的对象自己不能改变。编译

public class Test {
    public static void main(String args[]){
        final Person s1 = new Person();
        Person s2 = new Person();
        //s1 = s2;   报错,缘由是s1是final修饰的对象引用
        s2 = s1;   //正确运行
        s1.name = "Sakura";  //正确运行
    }
}

class Person{
    public String name = "sakura";
}

修饰方法

一般来讲,修饰方法是为了把方法锁定,防止任何继承类修改它的含义。class

class Person{
    String name = "sakura";
    public final void print(){
        System.out.printf(name);
    }
}

class Student extends Person{
    public void print(){    //报错,没法经过编译
        System.out.printf(name);
    }
}

修饰参数

在方法参数列表中以声明的方式将参数指定为final,表明在方法中没法改变参数指引的对象引用

class Person{
    public void print(final String str){
        str = "sakura";   //没法经过编译,去掉final则正常运行
        System.out.println(str);
    }
}

修饰类

将某个类总体定义为final,即表明该类不能被继承

final class Person{
    String name = "sakura";
    public final void print(){
        System.out.printf(name);
    }
}

class Student extends Person{  //没法经过编译
}

注意,类被final修饰,不表明类中的域被final修饰,类中的域不被final修饰就表明该域能够被修改;即它的可修改性与类是否有final修饰无关。

public class Test {
    public static void main(String args[]){
        Person s1 = new Person();
        s1.name = "Sakura";   //运行正常
    }
}

final class Person{
    String name = "sakura";
    public final void print(){
        System.out.printf(name);
    }
}

空白final

容许生成空白final,即未给定初值得final域;final修饰类中的某个域时,必须保证该域在定义时初始化或在构造器中被初始化

class Person{
    final String name;
    Person(){
        name = "sakura";
    }
}
相关文章
相关标签/搜索