final关键字:可以修饰属性 方法 类。
public class FinalTest {
public static void main(String[] args) {
F f = new F();
}
}
final class E {//表示该类不能被继承
}
class F extends E {
}
final 修饰方法:当一个方法被final 所修饰时,表示该方法是一个终态方法,即该方法不能被重写(Override)
public class FinalTest {
public static void main(String[] args) {
H h = new H();
h.output();
}
}
class G {
public final void output() {当一个方法被final 所修饰时,表示该方法是一个终态方法,即该方法不能被重写(Override)
System.out.println("g");
}
}
class H extends G {
public void output() {
System.out.println("h");
}
}
final修饰属性:当一个属性被final 所修饰时,表示该属性不能被改写。
public class FinalTest {
public static void main(String[] args) {
People people = new People();
//people.age = 20;
//people.address = new Address
people.address.name = "shanghai";
}
}
class People {
//final int age = 10;//表示age是常量,不能被改写
final Address address = new Address;
}
class Address {
String name = "beijing";
}
当final 修饰一个原生数据类型时,表示该原生数据类型的值不能发生变化 ,
如果final修饰一个引用类型时,表示该引用类型不能再指向其它对象,但该引用所指向的对象的内容是可以发生变化的。
final如果修饰一个属性,这个属性必须赋初值。
public class FinalTest {
final int a;
}
正确
public class FinalTest {
final int a;
public FinalTest {
a = 0;
}
}
错误1
public class FinalTest {
final int a = 0;
public FinalTest {
a = 0;
}
}
错误2
public class FinalTest {
final int a;
public FinalTest {
a = 0;
}
public FinalTest(int a) {
}
}
正确
public class FinalTest {
final int a;
public FinalTest {
a = 0;
}
public FinalTest(int a) {
this.a = a;
}
}
对于final 类型成员变量,一般来说有两种赋初值方式:
1~在声明final 类型的成员变量时就赋上初值。
2~在fnjefinal类型的成员变量时不赋初值,但在类的所有构造方法中都为其赋上初值。