1、修饰类
表示这个类不能被继承,没有子类
final class Eunuch{//太监类
}
class Son extends Eunuch{//错误
}
2、修饰方法
表示这个方法不能被子类重写,但是子类仍能访问
class Father{
public final void method(){
System.out.println("father");
}
}
class Son extends Father{
public void method(){//错误
System.out.println("son");
}
}
3、声明常量
final修饰某个变量(成员变量或局部变量),表示它的值就不能被修改,即常量,常量名建议使用大写字母。
如果某个成员变量用final修饰后,没有set方法,并且必须初始化(可以显式赋值、或在初始化块赋值、实例变量还可以在构造器中赋值)
public class Test{
public static void main(String[] args){
final int MIN_SCORE = 0;
final int MAX_SCORE = 100;
}
}
class Chinese{
public static final String COUNTRY = "中华人民共和国";
private String name;
public Chinese( String name) {
super();
this.name = name;
}
public Chinese() {
super();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//final修饰的没有set方法
public static String getCountry() {
return COUNTRY;
}
}
final关键字练习
/**
* 1、final
* final修饰的是o,不是i,因此o变量的值不能修改,不是说i变量的值不能修改
* 2、方法的参数传递机制:
* 形参是基本数据类型,那么实参给形参的是数据值的副本,形参的修改不影响实参;
* 形参是引用数据类型,那么实参给形参的是地址值的副本,形参对象修改属性相当于实参对象修改属性
*/
public class Test10 {
public static void main(String[] args) {
Other o = new Other();
new Test10().addOne(o);
System.out.println(o.i);
}
public void addOne(final Other o){
o.i++;//final修饰的是o,不是i,因此o变量的值不能修改,不是说i变量的值不能修改
}
}
class Other{
public int i;
}
/**
* 运行结果:
* 1
*/
练习总结:
1,final修饰的是o,不是i,因此o变量的值不能修改,不是说i变量的值不能修改
2、方法的参数传递机制:形参是基本数据类型,那么实参给形参的是数据值的副本,形参的修改不影响实参;形参是引用数据类型,那么实参给形参的是地址值的副本,形参对象修改属性相当于实参对象修改属性,显然addOne(final Other o)方法中形参o时引用数据类型,那么传给形参的是地址值的副本,当在addOne(final Other o)方法中对对象o的实例变量i进行修改,那么就是对o对象的实例变量进行了真正的修改,因此结果为1.