首先明确final的含义:最终,不可改变的
final的四种基本用法1.修饰一个类
格式:
权限修饰符 final 类名{
//***
}
此时final的含义是声明:当前这个类不能有任何的子类,也就是说该类的所有成员方法均不可以被覆盖重写,但可以对自己所继承父类的方法进行覆盖重写!!!
2.修饰一个方法
格式:
权限修饰符 final 返回值类型 方法名(参数列表){
//***
}
此时final的含义是声明:当前这个方法不能被覆盖重写,但不会对所在类其他方法产生影响,即为最终方法
注意:对于类和方法来说,final和abstract不能同时使用,因为矛盾——抽象方法所在类必须是抽象类,其方法没有内容,必须进行重写,而重写就需要子类,与final使用条件矛盾!!!
3.修饰一个成员变量
权限修饰符 final 变量名;
此时final的含义是声明:此变量不能再进行更改,只能赋值一次。
final int a;
a=30;//正确
final int b=30;//正确
注意:
对于基本类型来说,不可更改是指的是变量的数值不可变;
对于引用类型来说,不可更改是指的是变量的地址值不可变。
//参考代码
class 项目二 {
public static void main(String[] args) {
Student one=new Student("友人A");
System.out.println(one.getName());//输出友人A
System.out.println(one);//Student@10f87f48
one=new Student("宫园熏");
System.out.println(one.getName());//输出宫园熏
System.out.println(one);//Student@b4c966a
}
}
class Student{
private String name;
public Student() {
}
public Student(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
但是
final Student one=new Student("友人A");
one=new Student("宫园熏");//错误
因为引用变量改变的是地址,地址在此情况中不可改变,但可以直接改变内容
final Student one=new Student("友人A");
one=one.setName("宫园熏");//错误
one.setName("宫园熏");//正确
System.out.println(one.getName());//宫园熏
4.修饰一个局部变量
格式:
权限修饰符 final 变量名=赋值内容;
此时final的含义是声明:变量不可更改。
注意:由于局部变量具有默认值(如string为null,int为0),此默认值相当于对变量进行一次赋值,会导致变量不可用,为了避免错误,必须要进行手动赋值
private final String name1="有马公生";//正确
private final String name2;//错误,name2的值为null
name="友人A";//错误
如果变量被final修饰,直接赋值和构造方法赋值二选一
private final String name="有马公生";
/*public Student(String name) {
this.name = name;
}*/会报错
private final String name;//正确,必须保证类当中所有的重载
//构造方法对final的所有成员变量赋值
public Student() {
this.name=赋值内容;
}
public Student(String name) {
this.name = name;
}
/* public void setName(String name) {
this.name = name;
}*/同时将set方法删去