概述
- 解释
- 表示最终的,不可变的
- final修饰的局部变量
- 一旦赋值就不能重新赋值,即:final修饰的变量只能赋值一次
- final修饰的方法
- final修饰的方法无法覆盖,且无法重写
- final修饰的类
- 无法被继承
实例
package Day11Final;
public class Test01 {
public static void main(String[] args) {
}
}
class Father{
//final修饰的局部变量
final String num;
public void setNum(String num){} //this.num = num; //java: 无法为最终变量num分配值
public Father(String num) {
this.num = num;
}
public String getNum() {
return num;
}
}
class Parent{
//final修饰的方法
final public void doSome(){
System.out.println("doSome...");
}
}
//final修饰的类
final class Mother{
}
class Son extends Parent{
// public void doSome(){ //java: Son中的doSome()无法覆盖Parent中的doSome(),被覆盖的方法为final
// System.out.println("Parent doSome");
// }
}
//class daughter extends Mother{} //java: 无法从最终Day11Final.Mother进行继承
final修饰引用
- final修饰引用后,该引用只能指向一个对象,且其只能永远指向该对象,无法再指向其他对象
注:
- final修饰的引用虽然不能改,但是引用指向的对象的数据是可以进行修改的
实例
package Day11Final;
public class Test02 {
public static void main(String[] args) {
//使用final修饰引用
final User user = new User("张三");
//改变final指向的对象
// user = null; //java: 无法为最终变量user分配值
}
}
class User{
String name;
public User() {
}
public User(String name) {
this.name = name;
}
}
final修饰实例变量
- 解释
- final修饰的实例变量只能赋值一次
- 如果实例变量没有手动赋值的,系统会赋默认值
- 这种情况下,还能手动赋值一次
- 实例变量是在什么时候赋值?
- new的时候
实例:
package Day11Final;
public class Test03 {
public static void main(String[] args) {
Student student = new Student("01");
//改变final修饰的实例变量的值
//student.num = "02"; //java: 无法为最终变量num分配值
}
}
class Student{
final String name = "张三";
final String num;
Student(String num) {
this.num = num;
}
public Student(String name, String num) {
//this.name = name; //java: 无法为最终变量name分配值
this.num = num;
}
}
常量
- 常量使用 static 和 final 两个关键字修饰
- 常量名建议全部大写,且每个单词之间使用下划线连接
注
- 实际上常量和静态变量一样,只是常量的值不能变
- 常量和静态变量都存储在方法区,且都是在类加载时出书画
- 常量一般都是公开的 —— 不加 关键字private
实例
package Day11Final;
public class Test04 {
static final double PAI = 3.14156;
public static void main(String[] args) {
// PAI = 3.14; //) java: 无法为最终变量PAI分配值
System.out.println(PAI);
}
}