1.final关键字是最终的意思,可以修饰类,局部变量,成员变量,成员方法
1.1 修饰类:被修饰的类不能被继承,就是说这个类不能有任何的子类,也就是太监类,只能继承父类,不能被继承
格式:publi final class 类名称{}
注意:一个类如果为final类,那么其中所有的成员方法都不能被覆盖重写(因为没有子类)
final class He{ public void methon(){ System.out.println("方法块执行"); } } /* 报错 class You extends He{ } */
1.2 修饰成员方法:当final用来修饰成员方法时,这个方法就是最终方法,不能被覆盖重写
格式:修饰符 final 返回值类型 方法名称(形参){}
class Fu{ public final void methon(){ System.out.println("父类方法执行"); } } class Son extends Fu{ public void methon(){ System.out.println("子类方法执行"); } } //Error:(20, 17) java: com.shujia.day1.day3.Son中的methon()无法覆盖com.shujia.day1.day3.Fu中的methon() 被覆盖的方法为final
1.3 修饰局部变量:一旦使用final修饰局部变量,那么这个变量就不能进行更改,一旦赋值,终生不变
//当final修饰局部变量,对于基本类型来说,不可变的是变量中的值不可变 // 对于引用类型来说,不可变的是变量中的地址值不可变 public class FinalDemo{ public static void main(String[] args) { int num1=20; System.out.println(num1);//20 num1=23; System.out.println(num1);//23 //正确写法 final int num2 =20; System.out.println(num2);//20 // num2=30;报错 // num2=20;报错 //正确写法 final int num3; num3=40; System.out.println(num3); //final修饰引用数据类型 FinalDemo6 fin = new FinalDemo6("张三"); System.out.println(fin);//com.shujia.day1.day3.FinalDemo6@4554617c System.out.println(fin.name);//张三 fin=new FinalDemo6("李四"); System.out.println(fin);//com.shujia.day1.day3.FinalDemo6@74a14482 System.out.println(fin.name);//李四 System.out.println("========================="); final FinalDemo6 fin2 = new FinalDemo6("王五"); System.out.println(fin2);//com.shujia.day1.day3.FinalDemo6@1540e19d System.out.println(fin2.name);//王五 // fin2=new FinalDemo6("老王");错误写法,final修饰不能改变地址、 fin2.name="老王"; System.out.println(fin2);//com.shujia.day1.day3.FinalDemo6@1540e19d System.out.println(fin2.name);//老王 } }
1.4 final关键字修饰成员变量:如果使用final修饰成员变量,那么这个变量也是照样看不可变,不会再给默认值,必须手动赋值
/* 使用final修饰成员变量,那么这个变量也是照样看不可变,不会再给默认值,必须手动赋值,两种方法,二者选其一 1.直接赋值 2.构造方法赋值,必须保证所有重载的构造方法都要对final修饰的成员变量进行赋值 */ class Person{ // 构造方法赋值 private final String name; // private final String name="张三"; //直接赋值 public Person(String name) { this.name = name; } public Person() { name="张三"; } public String getName() { return name; } //使用构造方法赋值,需要删除setter方法,不能对final修饰的成员变量重新赋值 // public void setName(String name) { // this.name = name; // } }