想起自己刚入职第一家公司的时候,对静态这个概念都不是很熟悉,那时候也是初生牛犊不怕虎,抱着侥幸心理就去找工作了,结果可想而知,那肯定是到处碰壁,,近来正好有时间,那就梳理一下,顺便重点地去重温一下static这个修饰符,无论是静态变量、静态代码块、还是静态内部类、 参考runnoob https://www.runoob.com/java/java-modifier-types.html ,这里重点梳理static 和final这两个,其余的在菜鸟教程上都有详细的介绍
static
static可以用来修饰成员变量、代码块和方法和类(如静态内部类)
修饰变量时:static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。static成员变量的初始化顺序按照定义的顺序进行初始化。
修饰方法时:java中有this这个概念,指当前对象,而在static方法中是没有this,常规调用方法的方式都是对象实例.方法名,如factory.product(),而静态方法中没有this这个概念,所以它不依赖对象可以直接使用类名调用,而也因为这个特性导致静态方法中无法访问非静态的成员变量和方法。最典型的例子就是main方法,写出一个新的class类,在其中写一个main方法,你会发现main方法无法访问你定义在类中的非静态变量,因为main方法就是一个静态方法。
静态代码块:static{
XXXXXX......
}
静态代码有一个重要特性:只在类加载时执行一次,这个特性使得它非常适合做初始化工作,举个例子,我希望一个类它的若干属性在被实例化的时候是有我想要的默认值,而不是为空或者原本的默认值,就可以在静态代码块里给这几个属性直接赋值。
以上就是static的总结,参考了这个大佬的博客
https://www.cnblogs.com/dolphin0520/p/3799052.html 以及https://www.cnblogs.com/dolphin0520/p/3736238.html
接下来介绍final
final
java中final可以用来修饰类、方法和变量
修饰类:被final修饰的类无法被继承,这意味该类中的方法无法被重写,也就是说,被声明为final的类,其中的方法也都被隐式地指为final。一般情况下我们不会将类声明成final,除非是不想这个类被继承扩展或者是实在为了安全考虑
修饰方法:final方法无法被继承者重写,这意味着,在类中被private声明的方法也隐式地被指为final
修饰变量:修饰常规变量时,表明该变量是一个常量,一旦被赋值就不能再改变,如声明final int i = 3;当用来修饰引用时,表明该引用指向的对象地址不可再发生变化,比如final Student student= zhansan;该引用一直指向张三不可变,但是zhangsan的属性是可以变的,比如原本张三的age属性值为15;我调用zhangsan.setAge(17);可以修改该对象的属性。引用指向的对象不可变,但是对象的属性是可变的。
可以对比一下static和final static是类维度的,final是对象维度的,static在内存中只保存一份,可以直接类名.属性名获得,而final不行
举个例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
运行这段代码就会发现,每次打印的两个j值都是一样的,而i的值却是不同的。从这里就可以知道final和static变量的区别了。
static初始化一次,就保存在了固定的位置上(字节码class文件有记录),而final声明的变量在每次新建一个对象的时候被random方法重新赋值,被赋值后在这个对象中成为一个常量。
在上面给出的连接的博客里有关于static的面试题,感兴趣的可以去看看。
侵删致歉