final,static,this,super关键字总结
final关键字
final关键字,意思是最终的、不可修改的,用来修饰类、方法和变量,具有以下特点:
1、final修饰的类不能被继承,final类中的所有成员方法都会被隐式的指定为final方法;
2、final修饰的方法不能被重写;
3、final修饰的变量是常量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能让其指向另一个对象。
static关键字
static关键字主要是有以下四种使用场景:
1、修饰成员变量和成员方法:被static修饰的成员属于类,不属于单个对象,被类中所有对象共享。静态变量存放在Java内存区域的方法区。
2、静态代码块:静态代码块定义在类中方法外,静态代码块在非静态代码块之前执行(静态代码块——>非静态代码块——>构造方法)。该类不管创建多少对象,静态代码块只执行一次。
3、静态内部类(注意:static修饰类的话,只能修饰内部类):静态内部类与非静态内部类之间存在一个最大的区别:非静态内部类在编译完成后会隐含保存着一个引用,该引用时指向创建它的外围类,但是静态内部类却没有。
4、静态导包(用来导入类中的静态资源,1.5之后的新特性):格式为:import static 这两个2关键字连用可以指定导入某个类中的指定静态资源,并且不需要使用类名调用类中静态方法。可以直接使用类中静态成员变量和成员方法。
this关键字
this关键字用于引用类的当前实例
super关键字
super关键字用于从子类访问父类的变量和方法。例如:
public class Super {
protected int number;
protected showNumber() {
System.out.println("number = " + number);
}
}
public class Sub extends Super {
void bar() {
super.number = 10;
super.showNumber();
}
}
在上方的例子中,Sub类访问父类成员变量number并调用其父类super的showNumber()方法。
使用this和super要注意的问题:
在构造器中使用super()调用父类中的其他狗仔方法时,该语句必须处于构造器的首行,否则编译器会报错。另外,this调用本类中其他的构造方法是,也要放在首行。
this,super不能用在static方法中。
简单解释一下:
被static修饰的成员属于类,不属于单个这个类的某个对象,被类中所有对象共享。而this代表对本列对象的引用,指向本类对象;而super代表对父类对象的引用,指向父类对象;所以,this和super是属于对象范畴的东西,而静态方法是属于类范畴的东西。
静态代码块
静态代码块定义在类中方法外,静态代码块在非静态代码块之前执行(静态代码块——>非静态代码块——>构造方法)。该类不管创建多少对象,静态代码块也只执行一次。
静态代码块的格式是
static {
语句体;
}
一个类中的静态代码块可以有多个,位置可以随便放,它不在任何方法体内,JVM加载类时会执行这些静态的代码块,如果静态代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。
静态代码块对于定义在它之后的静态变量,可以赋值,但是不能访问;
static{}静态代码块与{}非静态代码块(构造代码块)
相同点:都是在JVM加载类时且在构造函数执行之前执行,在类中都可以定义多个,定义多个时俺定义的顺序执行,一般在代码块中对一些static变量进行赋值。
不同点:静态代码块在非静态代码块之前执行(静态代码块——>非静态代码块——>构造方法)。静态代码块·1只在第一次new执行一次,之后不再执行,而非静态代码块在每new一次就执行一次。非静态代码块可在普通方法中定义(不过用处不大);而静态代码块不行。