概念:最后的,不可更改的。
final可修饰的成员:
final类:此类不能被继承。
String、Math、System均为final修饰的类,不能被继承。
eg:
public final class Animal {...}
//报错
public class Dog extends Animal {...}
报错: Cannot inherit from final ‘StageOne.day13.Animal’
final方法:此方法不能被重写,可以被继承
意为最终方法,不支持子类以重写的形式修改。
eg:
public class Animal {
public final void eat() {}
}
public class Dog extends Animal{
//报错
@Override
public void eat() {}
}
报错: ‘eat()’ cannot override ‘eat()’ in ‘StageOne.day13.Animal’; overridden method is final
常量: 不可改变的变量或固定的数据。
字面常量: (100,200,“hello”,false,‘a’)
int num = 100; // num为变量, '100'这个数据为常量
final常量:final修饰不可改变的变量。
final常量:final修饰不可改变的变量。要求:必须赋值,一旦赋值,数据不能被改变。
常量命名习惯: 所有字母大写(Ctrl+Shift+U),如果有多个单词使用下划线隔开。
变量有两类: 局部变量, 成员变量; 因此常量也有两类: 局部常量, 成员常量;
声明在方法外, 并被 final 修饰的变量, 称为实例常量;
实例常量不再提供默认值,必须手动赋予初始值。
eg:
class A {
final int COUNT = 20;
public void A() {...}
}
赋值时机:声明同时赋值、动态代码块或构造方法。
//声明同时赋值
final int COUNT = 20;
或
//动态代码块
final int COUNT;
{
COUNT = 22;
}
或
//构造方法
final int COUNT;
public A() {
COUNT = 24;
}
注意:如果在构造方法中为实例常量赋值,必须保证所有的构造方法都能对其正确赋值。
声明在方法外, 并同时被 static 和 final 修饰的变量, 称为静态常量;
静态常量不再提供默认值,必须手动赋予初始值。
eg:
class A {
static final int COUNT = 20;
public void A() {...}
}
赋值时机:声明同时赋值、静态代码块。
//声明同时赋值
static final int COUNT = 20;
或
//静态代码块
static final int COUNT;
static {
COUNT = 22;
}
补充:
final修饰基本类型:值不可变;
final修饰引用类型:地址不可变, 元素可改变;
数组常量
eg:
final int[] NUMS = new int[] {10,15,20,25,30}; //地址不可改变
NUMS[0] = 100; // 元素可以改变
对象常量
eg:
final Dog dog = new Dog(); // 地址不可改变
dog.breed = "哈士奇"; //属性可以改变
...
final修饰类:此类不能被继承。
final修饰方法:此方法不能被重写,可以被继承。
final修饰变量(常量):必须赋值,一旦赋值,数据不能改变。
abstract不能和final同时使用。
abstract不能和static同时使用。