final 修饰符
final可修饰类、方法、变量,用于表示它所修饰的类、方法、变量不可改变
1、final修饰变量
表示该变量一旦获得初始值就不可被改变;final可修饰成员变量(类变量、实例变量)、局部变量、形参;
final修饰的成员变量必须由程序员显示指定初始值:
类Field:必须在静态初始化块中或声明该Field时指定初始值
实例Field:必须在非静态初始化块、声明该Field或构造器中指定初始值;
注:系统不会对final成员进行隐式初始化;
系统不会对局部变量进行初始化,必须显式初始化,一旦赋值后不能重复赋值;
final 修饰基本类型变量时,不能对基本类型变量重新赋值,故基本类型变量不能被改变;
但对于引用类型变量,其保存的是一个引用,final只保证这个引用类型变量所引用的地址不会改变,
即一直引用同一个对象,但这个对象内容完全可以改变;
final 修饰的方法不可被重写
对一个private方法,因其只能在当前类中可见,其子类无法访问,故子类无法重写该方法;
若子类定义一个与父类private方法有相同方法名、形同形参列表、相同返回值类型的方法,
不是方法重写,而是重新定义了一个方法;
final 修饰的类不可有子类,即不能被继承
final可修饰类、方法、变量,用于表示它所修饰的类、方法、变量不可改变
1、final修饰变量
表示该变量一旦获得初始值就不可被改变;final可修饰成员变量(类变量、实例变量)、局部变量、形参;
final修饰的成员变量必须由程序员显示指定初始值:
类Field:必须在静态初始化块中或声明该Field时指定初始值
实例Field:必须在非静态初始化块、声明该Field或构造器中指定初始值;
注:系统不会对final成员进行隐式初始化;
public class FinalErrorTest {
final int age;
//初始化块
{
System.out.println(age);//编译报错 去除final OK
age=6;
System.out.println(age);
}
public static void main(String[] agrs){
new FinalErrorTest();
}
}
2、final修饰局部变量
系统不会对局部变量进行初始化,必须显式初始化,一旦赋值后不能重复赋值;
public class FinalLocalVariableTest
{
public void test(final int a)
{
// 不能对final修饰的形参赋值,下面语句非法
// 形参由系统根据传入的参数来完成初始化
a = 5;
}
public static void main(String[] args)
{
//定义final局部变量时指定默认值,则str变量无法重新赋值
finall String str = "hello";
//下面赋值语句非法
str = "java";
//定义final局部变量时没有指定默认值;则d变量可进行一次赋值
final double d;
d = 5.4;
//对final变量d重复赋值,语法错误
d = 4.3;
test(3);
}
}
3、final修饰基本类型变量和引用类型变量区别
final 修饰基本类型变量时,不能对基本类型变量重新赋值,故基本类型变量不能被改变;
但对于引用类型变量,其保存的是一个引用,final只保证这个引用类型变量所引用的地址不会改变,
即一直引用同一个对象,但这个对象内容完全可以改变;
class Person
{
private int age;
public Person(){}
public Person(int age)
{
this.age = age;
}
...省略setter、getter
}
public class FinalReferenceTest
{
public static void main(String[] args)
{
final int[] Arr = {5,6,12,9};
//修改对象内容,合法
Arr[2] = -8;
//修改对象引用,非法
Arr = null;
final Person p = new Person(12);
//改变Person对象age Field,合法
p.setAge(23);
// 对p重新赋值,非法
p = null;
}
}
4、final方法
final 修饰的方法不可被重写
对一个private方法,因其只能在当前类中可见,其子类无法访问,故子类无法重写该方法;
若子类定义一个与父类private方法有相同方法名、形同形参列表、相同返回值类型的方法,
不是方法重写,而是重新定义了一个方法;
public class PrivateFinalMethodTest
{
private final void test(int a){}
}
class Sub extends PrivateFinalMethodTest
{
//重新定义一个方法
public void test(int a){}
}
final 修饰的方法仅仅不能重写,但可以重载
public class FinalOverload
{
public final void test(){}
public final void test(Stirng arg){}
}
5、final类
final 修饰的类不可有子类,即不能被继承
public final class FinalTest{}
// 下面子类定义 出现编译错误
class Sub extends FinalTest{}