final
final关键字有这是无法改变的或者终态的含义,可以修饰非抽象类,非抽象类成员方法和变量
- final类不能继承,没有子类,final类中的方法默认是final的
- final方法不能被子类方法覆盖,但可以被继承
- final成员变量表示常量,只能被赋值一次,赋值后值不再改变
- final不能用于修饰构造方法
注意:父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final的
1. final类
在设计时,如果该类不需要子类,类的实现细节不允许改变,确信这个类不会再被扩展
2. final方法
该类不允许子类覆盖该方法,设计为final方法的原因主要有:
- 把方法锁定,防止任何子类修改它的意义和实现
- 高效,编译器在遇到调用final方法时,会转入内嵌机制,大大提高效率
3. final常量
final修饰变量有三种,静态变量,实例变量和局部变量
另外,final变量在定义的时候,可以先声明而不给定值,这种变量就是final空白,编译器确保final变量在使用之前被初始化,否则报错。
public void testFinal(){
final int a; //final 空白
final int b=4; //局部变量
a=5;
}
4. final参数
当参数为final时,你可以使用该参数,但是无法修改该参数的值
public void testFinal2(final int i){
// i++; i是final的,不允许修改
System.out.println(i);
}
static
static表示全局的或者静态的意思,用来修饰成员变量和成员方法,也可以形成静态代码块。
被static修饰的成员变量或者方法,独立于该类的任何对象,不依赖于特定实例,被所有实例共享,只要这个类被加载,JVM就可以根据类名在运行时数据区的方法区找到它们,因此static对象可以在任何对象创建之前访问。
static被private修饰,可以在本类中被访问,无法在其他类中使用,private表示访问限定,static表示可以不实例化就访问,以此类推。
1. static变量
按照是否静态,可以将类成员变量分为:
- 被static修饰,静态变量,类变量,它们只分配一次内存
- 没有被static修饰的叫实例变量
2. static方法
被类名或者实例调用,因此static方法中不能有this或者super关键字,不能访问非static方法或者变量,static方法必须被实现,独立于任何实例,不能是abstract的。
3. static代码块
在JVM加载类时,就会执行该代码,可以有多个,且位置任意,JVM将按顺序依次执行这些代码块,每个代码块就执行一次。
static和final一起
static和final一起修饰成员变量或者成员方法,可以理解为“全局变量”
对于变量:表示一旦给值就不可修改(final属性),并且通过类名可以访问(static属性)
对于方法:表示不可覆盖(final属性),并且通过类名直接访问(static属性)
对于变量被final修饰不可修改,但对于一些容器类型(比如ArrayList,HashMap)的实例变量,不可以修改容器本身,但容器中存放的对象可以被修改的*