二、作用final 可以用来修饰的结构:类、方法、变量
1. 修饰-类final 用来修饰一个类,表示此类不能被其它类所继承,提高安全性,提高程序的可读性。
比如:string类、system类、stringbuffer类…
代码演示:
final class a{
}
class b extends a{ //错误,不能被继承。
}
2. 修饰-方法final 用来修饰方法:表明此方法不能被子类重写。
比如:object类中getclass();
代码演示:
class a { public final void print() { system.out.println("a"); } }class b extends a { public void print() { // 错误,不能被重写。 } }
3. 修饰-变量final 修饰的变量(成员变量或局部变量)称为常量。名称大写,且只能被赋值一次。
static final 用来修饰属性:全局常量。
代码演示:
class a { private final string info = "嘻嘻"; //声明常量 public void print() { //info = "哈哈"; //the final field a.info cannot be assigned } }
3.1 修饰-成员变量(属性)final 标记的成员变量必须在声明(显式初始化)时或在 每个构造器中或代码块中显式赋值,然后才能使用。
如:final double my_pi = 3.14;
3.2 修饰-局部变量使用 final 修饰局部变量时,表明此形参是一个常量。当我们调用此方法时,给常量形参赋一个实参。一旦赋值以后,就只能在方法体内使用此形参,且不能进行重新赋值。
三、经典题目//题目一:public class test1 { public int addone(final int x) { // return ++x; //cannot assign a value to final variable 'x' return x + 1; }}//题目二:public class something { public static void main(string[] args) { other o = new other(); new something().addone(o); } public void addone(final other o) { // o = new other(); o.i++; } }class other { public int i; }//题目三:class root{ static{ system.out.println("root的静态初始化块"); } { system.out.println("root的普通初始化块"); } public root(){ super(); system.out.println("root的无参数的构造器"); }}class mid extends root{ static{ system.out.println("mid的静态初始化块"); } { system.out.println("mid的普通初始化块"); } public mid(){ super(); system.out.println("mid的无参数的构造器"); } public mid(string msg){ //通过this调用同一类中重载的构造器 this(); system.out.println("mid的带参数构造器,其参数值:" + msg); }}class leaf extends mid{ static{ system.out.println("leaf的静态初始化块"); } { system.out.println("leaf的普通初始化块"); } public leaf(){ //通过super调用父类中有一个字符串参数的构造器 super("小老师ir"); system.out.println("leaf的构造器"); }}public class leaftest{ public static void main(string[] args){ new leaf(); system.out.println(); new leaf(); }}/*output:root的静态初始化块mid的静态初始化块leaf的静态初始化块root的普通初始化块root的无参数的构造器mid的普通初始化块mid的无参数的构造器mid的带参数构造器,其参数值:小老师irleaf的普通初始化块leaf的构造器root的普通初始化块root的无参数的构造器mid的普通初始化块mid的无参数的构造器mid的带参数构造器,其参数值:小老师irleaf的普通初始化块leaf的构造器*/
以上就是java中final关键字的使用方式的详细内容。
