概述
final关键字代表最终、不可改变的。
常见四种用法:
- 可以用来修饰一个类
- 可以用来修饰一个方法
- 还可以用来修饰一个局部变量
- 还可以用来修饰一个成员变量
一、 用final修饰类
简述 : 当final修饰一个类的时候, 该类不能被继承(该类就变成太监类)
格式 : 修饰符 final class 类名称 {
// 内容
}
eg:定义一个final类pubilc final FinalClass,继承会报错!
注意:一个类如果是final的,那么其中所有的成员方法都无法进行覆盖重写(因为没儿子。)
二、final修饰方法
简述 : 用final修饰的方法叫做 最终方法 , 不可以被覆盖
格式 : 修饰符 final 返回值类型 方法名称(参数列表) {
// 方法体
}
public abstract class A {
public final void a(){
System.out.println("测试方法");
}
public abstract void b();
}
// public abstract final void b();会报错,final,abstract不能同时修饰
public class B extends A{
/*
@Override
public void a() {}
错误写法!不能覆盖重写父类当中final的方法
@Override
public void method() {
System.out.println("子类覆盖重写父类的方法!");
*/
@Override
public void b() {
System.out.println("我是重写的父类抽象方法");
}
}
注意 : final修饰的类,方法不能覆盖,之后不能改变,而abstract修饰的类,方法,是抽象的,必须通过子类继承重写来实现;所以两者矛盾,不能同时修饰.
三、final修饰局部变量
对于基本类型来说,不可改变说的是变量当中的数据不可改变
public class FInalDemo {
public static void main(String[] args) {
//默认类型可改变
int a = 10;
System.out.println(a);//10
a = 20;
System.out.println(a);//20
//final类型的一旦有值就不能改变
final int b = 100;
System.out.println(b);
//b = 200; 不能改变
}
}
对于引用类型来说,不可改变说的是变量当中的地址值不可改变
public class FInalDemo {
public static void main(String[] args) {
final Stu s1 = new Stu("张三");1001
Stu s2 = new Stu("李四");1002
// 修改指向地址就会报错
// Stu s1 = new Stu("王五");报错
/*
虽然指向的地址(对象)不能变,但是对象内容可以变
如下
*/
System.out.println(s1.name);//1001张三
s1.name = "王五";
System.out.println(s1.name);//1001王五
}
static class Stu{
String name;
public Stu(String name) {
this.name = name;
}
}
}
四、final修饰全局变量
对于成员变量来说,如果使用final关键字修饰,那么这个变量也照样是不可变。
- 由于成员变量有默认值,所以要定义final后要手动赋值,然后就不会赋初值
这里创建A类,里面有一个定义好的final 的name ,已经有值是zs,
创建新对象并不会被无参构造的给默认值覆盖掉*结果 :*
- final修饰的成员变量也可以通过构造方法来赋值
public class Student {
private final String name;
public Student(){
//无参构造也要给final的成员变量赋值
name = "奥特曼";
}
public Student(String name) {
this.name = name;
}
public String getName() {
return name;
}
/* public void setName(String name) {
this.name = name;
}*/
}
注意事项 :
- 如果通过构造方法赋值,要将所有重载的构造方法都给该成员变量赋值,防止该变量未被赋值
- private与final修饰的成员变量里的set方法不要写,不能再次改变该成员变量值
总结
以上就是今天要讲的内容,本文仅仅简单介绍了fina修饰l方面的使用,更多细节要通过代码发现,本文若有错误不足可以私信我,会做出更改.