final可以修饰变量(各种变量)、方法、类。
final与abstract是互斥:永远不能同时出现!
final修饰变量
该变量被赋初始值之后,不能被重新赋值!
final修饰的变量必须被赋值,且只能赋值一次。
final修饰成员变量
非final的成员变量
程序员可以不显式指定初始值,系统会为之分配默认初始值,初始值分配规则与数组元素的初始值分配规则完全相同哦。final的成员变量,程序员必须显式指定初始值。
final的成员变量
●final实例变量,必须显式指定初始值。只能在以下3个位置的其中之-指定:
一定义时指定初始值。
一实例初始化块
一每个构造器显式指定一次初始值。
上面3个位置的本质其实只有一个:构造器。
如果用构造器初始化final变量,必须在每个构造器里都初始化final变量。
public class Final修饰符
{
final int a;
public Final修饰符()
{
a=2;
}
public Final修饰符(String s)
{
a=20;
}
public static void main(String[] args)
{
Final修饰符 aa=new Final修饰符();
Final修饰符 bb=new Final修饰符("22");
System.out.println(aa.a+" "+bb.a);
}
}
结果:
2 20
● final类变量,必须显式指定初始值。只能在以下2个位置的其中之-指定:
- 定义时指定初始值。
- 类初始化块。
上面2个位置的本质其实只有一个,类初始化块。
final修饰局部变量
非final的局部变量,程序员必须先指定初始值,然后才能使用。
final的局部变量,程序员必须先指定初始值,然后才能使用。
final局部变量不能被重新赋值。
final修饰的是引用类型的变量
final只保证该引用变量本身不会被重新赋值,该变量所引用的对象完全可以被修改!
final修饰的 “宏替换”的变量
如果一个变量满足以下3个条件:
-变量有final修饰。
-声明变量时指定了初始值。
-变量的初始值可以在编译时确定(初始值的表达式中没有变量、方法调用等)
这个变量就会消失,所有出现该变量的地方,在编译时就会替换成该变量的值。
public class FinalTest2
{
public static void main(String[] args)
{
final String s1 = "fkit";
final String s2 = s1 + ".org";
final String s3 = s2 +" is";
final String s4 = s3 +" a very";
final String s5 = s4 +" good education center!";
System. out. println(s5) ;
// 上面代码相当于:
System. out .println("fkit.org is a very good education center!") ;
}
}
final修饰方法:
表明该方法不允许被子类重写。
一一该方法可以被重载,也可以被子类调用!
[备注] : private方法已经被隐藏在该类的内部,子类无法访问该方法,因此不可能被重写。
final修饰private万法纯属多余!
但Java是允许的!
class PrivateFinalMethodText
{
private final void text(){
System.out.println("fulei");
}
}
class sub extends PrivateFinalMethodText
{
public void text(){
System.out.println("zilei");
}
}
final修饰类
表明该类不能派生子类!
jdk里很多类都是final类: String、 Math、 System
Object是否为final? - 一定不是final的 !