final
意思是最终的、不可修改的,用来修饰类、方法和变量,具有以下特点:
1)修饰类时,类不能被继承,类中的所有成员方法都会隐式的指定为final方法;
2)修饰方法时,方法不能被子类重写,但会被子类继承;
3)修饰变量时,如果变量是基本数据类型,则该变量为常量,数值一旦在初始化之后便不能更改;如果变量为引用类型,则在对其初始化之后便不能再让其指向另一个对象,但引用的对象本身可以修改。
static
意思是静态的、静止的,主要有以下四种使用场景:
1)修饰成员变量和成员方法时,被 static 修饰的成员属于类,不单属类的某个实例对象,被类中所有对象共享,可以并且建议通过类名调用。被static 声明的成员变量属于静态成员变量,静态变量 存放在 Java 内存区域的方法区。调用格式:类名.静态变量名 ,类名.静态方法名;
2)修饰代码块时,static修饰的代码块为静态代码块,静态代码块只会在类被加载时执行一次;
3)修饰内部类时,静态内部类与非静态内部类之间存在一个最大的区别: 非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围类,但是静态内部类却没有。没有这个引用就意味着:1. 它的创建是不需要依赖外围类的创建。2. 它不能使用任何外围类的非static成员变量和方法。
4)静态导包,格式为:import static 这两个关键字连用可以指定导入某个类中的指定静态资源,并且不需要使用类名调用类中静态成员,可以直接使用类中静态成员变量和成员方法。
this
一般用来代指当前对象,通过this可以调用本对象的所有方和和属性,主要有以下几种使用场景:
1)当局部变量(形参)和成员变量命名相同时,使用this修饰的为成员变量;
class Person{
private String name;
public void setName(String name) {
this.name = name;
}
public boolean compare(String name){
return this.name.equals(name);
}
}
2)在内部类中使用外部类.this来指向外部类;
class Person{
private String name;
//内部类
class Inner{
private String name;
void test(){
this.name = Person.this.name;
}
}
}
3)将类本身当作参数传递时。
class Person{
private String name;
public Person getPerson(){
return this;
}
}
super
用于在子类中代指父类对象,可以访问父类的方法和变量,主要使用场景:
1)访问父类变量:
class Father{
int age = 30;
}
class Son extends Father{
int age = 5;
void getAge(){
System.out.println(age); //输出5
System.out.println(super.age); //输出30
}
}
2)调用父类构造方法:
class Father{
int age = 30;
public Father(){
System.out.println(age);
}
public Father(int age){
System.out.println(age);
}
}
class Son extends Father{
int age = 5;
public Son(){
//这里不调用则系统会自动隐式调用父类无参构造,如果显示调用,必须在函数第一行
super();
System.out.println(age);
}
public Son(int age){
//显示调用父类有参构造
super(age+25);
System.out.println(age);
}
public static void main(String[] args) {
Son son = new Son(); //输出 30 5
son = new Son(5); //输出30 5
}
}
这里注意,子类的构造过程中必须调用父类构造方法,如果在子类的构造方法中没有显示的调用父类构造方法,系统会默认调用父类的无参构造方法;如果显示调用父类构造方法,则必须在函数的第一行调用;如果子类构造方法中没有显示调用父类构造方法,而父类也没有无参的构造函数,则编译错误。
3)访问父类方法:
class Father{
public void speak(String word){
System.out.println("爸爸说:"+word);
}
}
class Son extends Father{
@Override
public void speak(String word) {
//调用父类方法
super.speak(word);
System.out.println("儿子说:"+word);
}
public static void main(String[] args) {
Son son = new Son();
son.speak("上山打老虎!"); //爸爸说:上山打老虎! 儿子说:上山打老虎!
}
}