final 本意是“不可变化的”,其修饰的类不能被继承,修饰的变量不能被更改,修饰的方法不能被重载,下面依次进行说明。
修饰的类不能被继承
通常当某个类设计为final时,就表明了该类不希望被继承,final类中,所有的方法都隐式的指明为final修饰。
以String类来举例:
自定义其子类MyString 继承于String,报错:无法继承final类型的的String
public class MyString extends String{
}//报错:Cannot inherit from final 'java.lang.String'
修饰的变量不能被更改
final一般用来修饰基本类型的变量,如int,char等,其修饰后类型不可再次赋值,通常用于基础变量的声明;
public static void main(String[] args) {
final int age=3;
age=4;//编译报错:Cannot assign a value to final variable 'age'
}
若修改引用类型变量,则修改后其引用不可被更改,但引用所指向的实例可以被修改(即final只是用来修改该引用),例如:
public class Main {
public static void main(String[] args) {
final Cat c=new Cat();
c=new Cat();//编译报错:Cannot assign a value to final variable 'c'
}
}
class Cat{
public String name;
}
但可以修改其实例:
public class Main {
public static void main(String[] args) {
final Cat c=new Cat();
c.name="helloword";
c.name="hello";
}
}
class Cat{
public String name;
}
修饰的方法不能被重载
使用final修改方法后,相当于该方法为private,为该类独占,当子类实现父类的方法时,无法重写父类的final方法,在Java早期时,如果一个方法声明为final,则将同意编译器将该方法的所有调用转为内嵌调用形式,以此来节省内存开销。
现在此操作已由JVM自动处理, 只有该方法设计为禁止重写时才设计成final.
static final
一个既有static又有final修饰的变量只占一段不能被改变的内存空间,通常变量名称用大写字母来表示,并以下划线来分割单词.
空白final
final允许先进行声明而不初始化,但必须保证在使用前前对final进行初始化,此种用法保证了final的灵活性,例如,使用构造器进行final的初始化:
public class Car {
final String name;
public Car(){
name="";
}
}
加载
类的代码是独立保存在自己的class文件中,只有在初次使用的时候才进行加载,通常是发生在第一个创建类的第一个对象时,但当访问static所修饰的方法或属性时,也会发生加载。
当类加载完毕后 ,开始创建对象,基本类型会置为默认值,引用类型会置为null;
构造器执行,变量进行初始化;