Java基础语法:final修饰符
一、final类
描述:
- 用'final'修饰的类不能被继承,没有子类。
- 例如,我们是无法写一个类去继承String类,然后对String类型扩展的,因为API中已经将String类定义为'final'的了。
示例:
public final class Person {
}
/*
以下代码编译报错
class Student extends Person{
}
*/
二、final方法
描述:
- 用'final'修饰的方法可以被子类继承,但是不能被子类重写。
- 例如,每个类都是Object类的子类,继承了Object中的众多方法,在子类中可以重写toString方法、equals方法等,但是不能重写getClass方法、wait方法等,因为这些方法都是使用fianl修饰的。
示例:
public class Person {
public final void print() {
}
}
class Student extends Person {
/*
以下代码编译报错
public void print() {
}
*/
}
三、常量
描述:
- 用'final'修饰的变量表示常量,只能被赋值一次,赋值后值不能再被改变。
注意:
-
修饰形式参数时,因为在调用方法传参的时候会赋值,所以不能在方法体里再赋值。
public class Person { public void print(final int num) { /* 以下代码编译报错 num = 1; */ } }
-
修饰成员变量时,可以选择在声明的同时赋值,或在匿名代码块中赋值 ,或在构造器中赋值(类中出现的所有构造器都要写)。
public class Person { Person() { num = 1; } Person(int num) { this.num = num; } private final int num; }
-
修饰静态变量时,可以选择在声明的同时赋值,或在静态代码块中赋值 。
public class Person { static { INT_NUM = 1; } /* 静态常量命名规范为:全部字母大写,单词用下划线分隔。 */ private static final int INT_NUM; }
-
修饰引用变量时,不能改变引用保存的对象内存地址,但可以改变对象的属性值。
public class Person { private int age; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public static void main(String[] args) { final Person person = new Person(); person.setAge(1); person.setAge(2); person.setAge(3); /* 以下代码编译报错 person = new Person(); */ } }