1.final关键字
final关键字修饰变量:
1.这个变量必须在构造对象时就能够初始化
2.如果是基本数据类型的变量,那么这个变量一旦初始化就不能更改,相当于一个常量
3.如果是引用数据类型的变量,则初始化后就不能更改它的引用,不过引用对象变量的值可以更改
final关键字修饰方法:
1.表明这个方法不能被子类重写,防止类修改它的含义
与static比较都不能重写但可以被子类继承调用,不同在于static可以写一个同名方法隐藏父类的方法,而final不行
与private比较,private无法被子类继承,可以在子类中写一个新的同名方法,而final修饰的可以被子类继承调用,但final不能被重写,不能被修改,也就不能写一个新的同名方法。
使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升(现在的Java版本已经不需要使用final方法进行这些优化了)。类中所有的private方法都隐式地指定为final。
final关键字修饰类:
1.表明这个类不能被继承
2.final类中的所有成员方法都会被隐式的指定为final方法,但成员变量可是final也可以是非final。
2.static关键字
static关键字修饰变量:
1.static关键字修饰的变量也叫类变量,整个类共享这一个静态变量,使用类名.变量访问。
2.与非静态变量区别,静态变量在内存中只有一个,随类加载而加载,程序结束时销毁,非静态每个对象都有单独的一个,随着对象一起创建销毁
static关键字修饰方法:
1.静态方法是不在对象上执行的方法,不需要类的实例化,可以直接通过类调用。
2.在类加载时分配内存空间(类中只有一个),在调用时执行,静态方法只能调用静态变量和静态方法,且不能被重写。
注意:static方法会被子类继承,子类可以直接调用,当父类和子类具有方法名相同的静态方法时,通过子类调用的方法是子类的方法而父类的方法隐藏了。父类方法的隐藏并不是重写,例如使用虚拟方法调用创建的对象调用静态方法(虚拟方法调用即类多态的使用,用父类声明创建子类对象即向上转型),编译和实现的都是父类的静态方法而不是子类的静态方法,即方法没有被重写。
static关键字修饰代码块:
1.静态代码块只在类加载时执行一次,静态代码块及非静态代码块的执行顺序(1.首先加载父类的静态字段或者静态语句块 2.子类的静态字段或静态语句块 3.父类普通变量以及语句块 4.父类构造方法被加载 5.子类变量或者语句块被加载 6.子类构造方法被加载)
[