final的基本用法:用来修饰属性,类,方法,局部变量
- 使用final 代表该内容固定不懂 不能修改
当希望子类不要被继承时候 可以使用final
class A{}
class B extends A{}
//这里B 可以继承 A
final class A{}
class B extends A{}
//有final关键字 B 不能继承 A
当不希望方法被重写时 使用final
- 访问修饰符 final 返回类型 方法名
class A{
public void k1(){}
public void k1(String n){}
//这里没问题
public final void k1(){}
public void k1(String n){}
//不能进行方法重写
}
当你不希望类中的属性或者是主方法中的局部变量被修改的时候 使用final
public class run{
public static void main(String args[ ]){
A aaa=new A();
aaa.a=1000; // 可修改 但如果A 中是 public final int a =100; 就不能修改
}
}
class A{
public int a=100;//属性
public void nums(){
int final b = 30; // final 要注意是不能修改的
b = 1000; //报错 这里是不能修改的;
}
}
final使用细节:
- final修饰的属性在定义时候只有3种方式:
初始化
构造器定义
代码块
class A{
public final int a1=10;//初始化
public final int a2;//构造器初始化
public A(int a2){
this.a2 = 10;
}
public final int a3;//代码块初始化
/**
* 复习*代码块*知识:
* 创建对象就会调用代码块
* 静态的代码块static只能调用一次 且在类被加载的时候就调用
* 类的加载:对象的创建 子类被调用 父类就被加载 类的static变量被调用
*/
{
a3=10;
}
}
- final修饰static属性在定义时候只有2种方式:
初始化
加static的代码块
class A{
/**
* final修饰的属性是静态时,定义方式两种
* 初始化
* 加static的代码块
*/
public final static int a1=10;//初始化
public final static int a2;//static的代码块初始化
static{
a2 = 10;
}
public final static int a3;//不能通过构造器初始化
public A(int a3){
this.a3 = 10;//报错 static类变量不能接触 this 或者 super
}
}
- final类不能继承但可以实例化对象
- 如果类不是final类 但含有final方法 可以继承该类 同时可以在子类调用 但无法修改该方法
public class finalMethod {
public static void main(String[] args) {
A a = new A();
System.out.println(A.a1);
C c = new C();//继承B 后的C 对象 调用B 的printB方法
c.printB();
}
}
final class A{
/**
* final不能继承但可以实例化对象
* 如果类不是final类 但含有final方法 可以继承该类 同时可以在子类调用 但无法修改该方法
*/
public final static int a1=10;//初始化
}
class B{
public int c1 = 0;
public final void printB(){ //final关键字 所以方法不能修改
System.out.println(c1);
}
}
class C extends B{
}
-
如果是final类 就没有必要把属性和方法加final
-
final不能修饰构造器方法
-
final与static 配合不会导致类的加载(demo演示)
public class finalMethod {
public static void main(String[] args) {
System.out.println(A.a);
}
}
class A{
public static int a = 10;
static{
System.out.println("类被加载");
}
}
//输出打印结果是:
//类被加载
//10
public class finalMethod {
public static void main(String[] args) {
System.out.println(A.a);
}
}
class A{
public final static int a = 10;
static{
System.out.println("类被加载");
}
}
//输出打印结果是:
//10
*包装类 Double和String 是final类 不能再被继承