——修饰类、接口和抽象类
final可以修饰方法,属性,类!但是不能修饰接口,抽象类;因为 接口和抽象类本身就是用来继承或者实现的,与final的作用相斥!
A、修饰类(class)。
1、该类不能被继承。
2、类中的方法不会被覆盖,因此默认都是final的。
3、用途:设计类时,如果该类不需要有子类,不必要被扩展,类的实现细节不允许被改变,那么就设计成final类
B、修饰方法(method)
1、该方法可以被继承,但是不能被覆盖。
2、用途:一个类不允许子类覆盖该方法,则用final来修饰
3、好处:可以防止继承它的子类修改该方法的意义和实现;更为高效,编译器在遇到调用final方法转入内嵌机制,提高了执行效率。
4、注意:父类中的private成员方法不能被子类覆盖,因此,private方法默认是final型的(可以查看编译后的class文件)
C、修饰变量(variable)
1、用final修饰后变为常量。包括静态变量、实例变量和局部变量这三种。
2、特点:可以先声明,不给初值,这种叫做final空白。但是使用前必须被初始化。一旦被赋值,将不能再被改变。
D、修饰参数(arguments)
1、用final修饰参数时,可以读取该参数,但是不能对其作出修改。
☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟修饰变量☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟
——修饰变量
一、final修饰变量
final修饰变量不可变,这里是指引用不可变(Java中共提供两种数据类型,原始数据类型8种和引用类型),即它只指向初始时指向的那个对 象,而不关心指向对象内容的变化。
final修饰的变量必须初始化。初始化根据变量类型而不同:
1、static变量。只能在定义,或者静态块中初始化。
2、普通实例变量。可以在定义,非静态块,构造函数中初始化。
3、局部变量。只能在定义时初始化。
注:static变量无法再非静态块和构造函数中初始化,因为静态变量在二者之前加载。同理,实例变量也无法在静态块中初始化,因为静态块加载时实例变量还没有定义。
public static void main(String[] args) {
final int aInt =10;//必须初始化aInt =1;//编译期间错误System.out.println("aInt = "+aInt);
final StringBuffer s =new StringBuffer("Hello");
s.append(" World!");
System.out.println(s);//结果为Hello World!
final StringBuffer s1 = new StringBuffer(" Hello");
s1 = new StringBuffer("Hello World!"); //编译期间错误,不可以指向别的对象.
/*
* 不可变有两层含义:1 引用不可变 2 对象不可变
* 综上,final指的是引用不可变,只能指向初始时指向的那个对象,而不关心对象内容的变化.
* */
}
final数据另一种分类方法:
1.一个永不改变的编译时常量,还有static时命名全部大写:public static final int VALUE_ONE = 99;
2.一个在运行时初始化的值,而你不希望它被改变。private int i = (Random)random.nextInt(20);数值在运行时内被初始化时才会显现,编译时不知道。