final关键字:
1.final修饰类:被final修饰的类不能被继承,即为最终类,不允许其他类对其进行扩展。
2.final修饰方法:被final修饰的方法不能被子类重写,即为最终方法,子类无法改变该方法的实现。
3.final修饰变量:被final修饰的变量表示常量,一旦赋值后便不能再被修改;如果是基本数据类型,则数值不可改变,如果是引用类型,则引用不可改变,但对象本身是可以修改的。
1.final修饰类
package com.zsh.java;
final class Animal {
}
public class Dog extends Animal {//不能继承Animal类
}
报错:
Cannot inherit from final ‘com.zsh.java.Animal’
(无法从被声明为final的’com.zsh.java.Animal’类继承)
则final修饰的类不能被继承
2.final修饰成员方法
package com.zsh.java;
public class Base {
void show(int x){
}
final void display(String msg){//final修饰的成员方法
}
}
public class Sub extends Base{
void show(int x){//方法覆写
}
void display(String msg){//方法覆写,提示编译错误
}
}
}
报错:
‘display(String)’ cannot override ‘display(String)’ in ‘com.zsh.java.Base’; overridden method is final
( display(String)’ 无法覆盖 ‘com.zsh.java.Base’ 中的 'display(String) )
则final修饰的成员方法无法被覆盖
final static 数据类型 数据成员名 = 初始值; //必须进行初始化,不能修改
final 数据类型 数据成员名; //必须在构造方法中初始化
final 数据类型 数据成员名 = 初始值; //已经初始化,不能在修改
3.final修饰数据成员
package com.zsh.java;
public class Base {
final int X; //未初始化,需要在构造方法中初始化
final int T = 5; //已经初始化,不能修改
final static int Y = 2; //必须初始化
public Base(int x){
this.X = x; //初始化final数据成员
this.T = 50; //已经初始化,编译错误
}
public void show(){
this.X = 10; //编译错误,不能修改
Y = 22; //编译错误,不能修改
}
}
报错:
Cannot assign a value to final variable ‘T’
Cannot assign a value to final variable ‘X’
Cannot assign a value to final variable ‘X’
(无法为最终变量’T’分配值;
无法为最终变量’X’分配值;
无法为最终变量’X’分配值)
则final修饰的静态数据成员必须进行初始化,final修饰的非静态数据成员只能赋值一次。
4.3.final修饰引用变量
package com.zsh.java;
public class Room {
//数据成员
String number;
String name;
//构造方法
public Room() {
}
public Room(String number, String name) {
this.number = number;
this.name = name;
}
//setter方法
public void setName(String name) {
this.name = name;
}
}
package com.zsh;
import com.zsh.java.Room;
public class Demo001 {
public static void main(String[] args) {
final Room ROOM908 = new Room("908","孙悟空");//final修饰引用变量ROOM
//ROOM908 = new Room("808","猪八戒"); //更改引用(地址),编译错误
ROOM908.setName("猪八戒"); //更改内容,通过编译
}
}
则final修饰引用变量,该变量的引用不会改变,但能改变应用的内容。