final:
final 可以修饰类、方法、变量。当final 修饰类时,表明该类不可被继承;修饰方法时,表明该方法不可被重写;修饰变量时表明该变量不可被修改。
final关键字的基本用法
在Java中,final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量)。下面就从这三个方面来了解一下final关键字的基本用法。
1、修饰类
当用final去修饰一个类的时候,表示这个类不能被继承。
在自己设计一个类的时候,要想好这个类将来是否会被继承,如果可以被继承,则该类不能使用fianl修饰,在这里呢,一般来说工具类我们往往都会设计成为一个fianl类。在JDK中,被设计为final类的有String、System等。
示例:
public final class Pet {
private String name;
private String color;
private int leggs;
public Pet(String name,String color,int leggs) {
this.color=color;
this.leggs=leggs;
this.name=name;
}
public void setName(String name) {
this.name = name;
}
public void getName() {
return;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public int getLeggs() {
return leggs;
}
public void setLeggs(int leggs) {
this.leggs = leggs;
}
public void eat() {
System.out.println(leggs+"条腿的"+color+"的"+name+"在吃饭");
}
}
之后我们用test类取继承试试:
public class Cat extends Pet{
public Cat(String name,String color,int leggs) {
super(name,color,leggs);//报错
}
情况如图:
即就是,final修饰的类无法被子类调用。所以,在使用final修饰类的时候,要注意谨慎选择,除非这个类真的在以后不会用来继承或者出于安全的考虑,尽量不要将类设计为final类。
2、修饰方法
当final修饰方法时,该方法不可以被重写,但是在当前类中可以重载。
因此,如果只有在想明确禁止 该方法在子类中被覆盖的情况下才将方法设置为final的。即父类的final方法是不能被子类所覆盖的,也就是说子类是不能够存在和父类一模一样的方法的。
举例:
public class B extends A {
public static void main(String[] args) {
}
public void getName() {
}
}
public class A {
/**
* 因为private修饰,子类中不能继承到此方法,因此,子类中的getName方法是重新定义的、
* 属于子类本身的方法,编译正常
*/
private final void getName() {
}
/* 因为pblic修饰,子类可以继承到此方法,导致重写了父类的final方法,编译出错
public final void getName() {
}
*/
}
3、修饰变量
final成员变量表示常量,只能被赋值一次,赋值后值不再改变。
当final修饰一个基本数据类型时,表示该基本数据类型的值一旦在初始化后便不能发生变化;
如果final修饰一个引用类型时,则在对其初始化之后便不能再让其指向其他对象了,但该引用所指向的对象的内容是可以发生变化的。
public class Test {
public static void main(String[] args) {
String a = "hello2";
final String b = "hello";
String d = "hello";
String c = b + 2;
String e = d + 2;
System.out.println((a == c));
System.out.println((a == e));
}
}
b只能被赋值一次,因此在程序中它无法再被二次赋值
参考资料:https://www.cnblogs.com/xiaoxi/p/6392154.html