final
有三种使用场景,分别是修饰变量、方法和类,无论哪种修饰,一旦声明为final类型,你将不能改变这个引用了,编译器会检查代码,如果你试图再次初始化,编译器会报错
1、修饰变量
当final修饰一个变量的时候一般把他作为常量,通常和static关键字配合使用。例如:
private static final String ISSUCCESS_FLAG = “true”;一般static修饰的常量都用大写字母来表示。
String str1 = "12";
final String str2 = "1";
String str3= "1";
boolean a=(str1==(str2+"2"));
boolean b=(str1==(str3+"2"));
这里a和b的值分别是什么? 显然a=true,b=false
此时str2+”2”其实就是”1”+”2”操作的是常量之间的连接操作,而str3+”2”其实是new String(“12”);他和str1是两个对象,内存地址不同
2、修饰方法
当一个方法被final修饰后,表示该方法不能被子类重写,final方法有一个好处是比非final方法要快,因为在编译时已经静态绑定了,不需要在运行时在动态绑定。
3、修饰类
当一个类被final修饰后,表示该类是完整的,不能被继承,例如Java中String、Integer类都是final类
final修饰的优点
- final关键字提高了性能。JVM和Java应用都会缓存final变量。
- final变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销。
- 使用final关键字,JVM会对方法、变量及类进行优化。
- 不可变类创建不可变类要使用final关键字。不可变类是指它的对象一旦被创建了就不能被更改了。String是不可变类的代表。不可变类有很多好处,譬如它们的对象是只读的,可以在多线程环境下安全的共享,不用额外的同步开销等等。
java接口可以是public 的,也可以是friendly的,但一定是abstracted的。
java接口里的方法只能是public的、abstract的。
java接口里的成员变量只能是public 的,static 的,final的;并且必须赋初值,否则通不过编译。
static 关键字
- 用来修饰成员变量,将其变为类的成员,从而实现所有对象对于该成员的共享;
- 用来修饰成员方法,将其变为类方法,可以直接使用“类名.方法名”的方式调用,常用于工具类;
- 静态块用法,将多个类成员放在一起初始化,使得程序更加规整,其中理解对象的初始化过程非常关键;
- 静态导包用法,将类的方法直接导入到当前类中,从而直接使用“方法名”即可调用类方法,更加方便。
public class TestStatic {
public static void main(String[]args){
System.out.println(S.getStatic());//使用类名加前缀访问静态方法
S s=new S();
System.out.println(s.getStatic());//使用实例化对象名访问静态方法
System.out.println(s.get());
}
public static class S
{
private static int a;
private int t=0;
//静态初始器:由static和{}组成,只在类装载的时候(第一次使用类的时候)执行一次,往往用来初始化静态变量。
static{
a=10;
}
//静态方法只能访问静态数据成员
public static int getStatic()
{
return a;
}
public int getT()
{
return t;
}
//非静态方法可以访问静态方法和非静态方法
public int get()
{
getT();
getStatic();
t=a;//非静态方法可以访问非静态数据成员和静态数据成员
return t;
}
}
}
如上图所示:
各修饰符的作用域如下:其中默认修饰符在子类中可以访问,在不同包中不能访问