final关键字
可以用来修饰 类、方法、变量。具有以下特点
-
final修饰的类不能被继承,final类中的所有成员方法都会被隐式的指定为final方法(类不能被继承,方法自然不能被重写);
-
final修饰的方法不能被重写;
-
final修饰变量:
- 不可变性
- 修饰基本类型的变量,则数值在初始化之后就不能被改变;
- 修饰引用类型的变量,则初始化之后,该引用不能指向别的对象。
- 赋值问题:必须要给变量赋值,而且只能赋值一次
- 修饰成员变量:可以在构造方法里进行赋值;或者在声明变量的时候就赋值。除此之外的地方赋值会报错。
- 修饰类变量(静态变量):可以在声明变量的时候赋值(static final修饰的变量可以看作是常量);或者在static块中赋值且只能赋值1次。
- 修饰局部变量(方法中的变量):可以在声明变量的时候赋值;或者方法里面仅赋值1次。
- 修饰方法中的形参:方法中的形参不能被赋值?
- 不可变性
说明:使用 final 方法的原因有两个:
- 把方法锁定,以防任何继承类修改它的含义;
- 效率。在早期的 Java 实现版本中,会将 final 方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升(现在的 Java 版本已经不需要使用 final 方法进行这些优化了)。
static关键字
可以用来修饰 内部类、方法、变量。具有以下特点:
- static关键字修饰的类只能是静态内部类
- 静态内部类的创建不需要依赖其外部类;
- 静态内部类不能使用其外部类的非static的方法和成员变量。
- 原因:静态内部类与非静态内部类之间存在一个最大的区别: 非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围类,但是静态内部类却没有。没有这个引用就意味着。。
- static关键字修饰成员变量和成员方法
- 被static修饰的成员变量就是类变量(静态变量),属于类,不依赖于对象的创建。一般通过类名.变量直接访问;静态变量存放在Java内存区域的方法区。
- 被static修饰的成员方法是类方法(静态方法),属于类,不依赖于对象的创建。一般通过类名.变量名直接调用。
- 静态代码块
- 静态代码块定义在类中、方法外,静态代码块在非静态代码块之前执行(静态代码块—>非静态代码块—>构造方法)。 该类不管创建多少对象,静态代码块只执行一次。
- 静态导包(用来导入类中的静态资源,1.5 之后的新特性): 格式为:
import static这两个关键字连用可以指定导入某个类中的指定静态资源,并且不需要使用类名调用类中静态成员,可以直接使用类中静态成员变量和成员方法。
this关键字
this关键字用于引用类的当前实例,如:
class Manager {
Employees[] employees;
void manageEmployees() {
int totalEmp = this.employees.length;
System.out.println("Total employees: " + totalEmp);
this.report();
}
void report() { }
}
在上面的示例中,this 关键字用于两个地方:
- this.employees.length:访问类 Manager 的当前实例的变量。
- this.report():调用类 Manager 的当前实例的方法。
也可以不使用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 是属于对象范畴的东西,而静态方法是属于类范畴的东西。