前言

final与static是java入门时常见的2个关键字,细细研究,对这俩个关键字的理解也有了一个深刻的认识。

final

final的作用,(书上)总结了3点,我帮大家写出来:

  1. final修饰类:不可被继承。
  2. final修饰方法:不可被子类重写。
  3. fanal修饰变量:不可以改变。

我也不卖关子。详细解释一下这3点

解释:

  • 不可以被继承,所以诸如一些abstract修饰的类,是不能被final修饰的。因为抽象类本身就是需要被继承的。此时如被final修饰。会有编译错误。意思是不能同时用这俩个关键字修饰
  • 方法不可以被子类重写,这没什么好讲的。所以接口中的方法如果被final修饰了,结果你懂得。事实上接口中的方法默认即public abstract的,所以在阿里巴巴开发手册中(编程规约>命名规约>12)中建议接口方法中不要添加任何修饰符号(public也不要加)
  • 重点解释的就是这个final修饰的变量,变量不可以被改变。变量的值不可改变?还是变量引用的对象不能变,还是压根儿就引用与值都不可以变???OK,来写码说明
1 public class FinalDemo {
 2     
 3     public static void main(String[] args) {
 4         String a = "aaa";
 5         final String b = a;
 6         a = "把a改了试试";
 7         b = "改一下b试试";
 8         
 9     }
10 
11 }



如上,第6行是没有任何问题的,但第7行会发生编译错误。由此可见,final修饰变量,是指引用不可变。至于引用的值,你随便改吧。也就是说一个final修饰的List,你别给我换成另一个list就行,list里的元素增改删是随便的。

 

static

static的作用:static修饰的变量与方法,可以通过类名.变量名/方法名使用,而不需要new出对象来使用。是属于类的一个共享资源,所有的实例用到的值都是一个。换言之:一处变,处处变。

 看下面一段代码:

 



1 public class StaticDemo {
2     String a = "123456";
3 
4     public static void main(String[] args) {
5         System.out.println(a);
6     }
7 
8 }



是的,第5行编译出错。来看一下为什么:从类加载的角度讲,静态内容不属于实例,在类加载时已经存在,而非静态内容,如代码第2行a变量,需要new出一个对象才能生成。而main方法是一个静态方法,此时使用a变量,还没有a变量这个东西呢。。。编译出错就对了

当然了,实例方法是可以引用静态内容的,如下代码是没有任何问题的



1 public class StaticDemo {
 2     String a = "123456";
 3     static String b = "123456";
 4     
 5     public void MethodA(){
 6         System.out.println(b);
 7     }
 8     
 9     public static void main(String[] args) {
10 //        System.out.println(a);
11     }
12 
13 }