final修饰类和方法
final可以用于修饰类、方法、变量
(1)final修饰类,类不能被继承
(2)final修饰方法,方法不能被重写
(3)final修饰变量,变量有且仅能被赋值一次
拓展:abstract和final关系:互斥关系不能同时出现
abstract修饰的类要被继承、final修饰类不能被继承
abstract修饰方法是抽象方法,抽象方法一定要重写、final修饰方法,方法不能被重写
public class FinalDemo {
}
class Animal{
public final void run(){
}
}
//不能被重写
//class Wolf extends Animal{
// @Override
// public void run(){
//
// }
//}
//不能被继承
//class Cat extends Animal{
//
//}
final修饰局部变量
final修饰局部变量:
让值被固定起来,执行过程中防止被修改
public class FinalDemo02 {
public static void main(String[] args) {
final int age = 10;
// age = 100; 报错,第二次赋值了
buy(0.8);
buy(0.9);
}
public static void buy(final double r){
//r = 0.8; 报错,第二次赋值了
}
}
final修饰静态成员变量
final修饰成员变量:静态成员变量变成了常量
final修饰静态成员变量可以在哪些地方赋值一次:
1、定义的时候赋值一次
2、可以在静态代码块中赋值一次
public class FinalDemo03 {
public static final String schoolName = "黑马";
public static final String schoolName1;
static {
schoolName1 = "黑马1";
}
public static void main(String[] args) {
//schoolName = "传智播客"; --报错:第二次赋值
}
}
final修饰实例成员变量
拓展:final修饰实例成员变量可以在那些地方赋值一次:
1、定义的时候赋值一次
2、可以在实例代码块中赋值一次。
3、可以在每个构造器中赋值一次。
public class FinalDemo04 {
//每个对象name都叫黑马,无实际意义
//定义的时候赋值一次
private final String name = "黑马";
private final String name1;
private final String name2;
{
//实例代码块中赋值一次
name1 = "黑马1";
}
//可以在(每个)构造器中赋值一次。
public FinalDemo04(){
name2 = "黑马2";
}
//可以在(每个)构造器中赋值一次。
public FinalDemo04(String n){
name2 = "黑马2";
}
public static void main(String[] args) {
FinalDemo04 f = new FinalDemo04();
System.out.println(f.name);
//f.name = "黑马Java";//报错,第二次赋值!
}
}