final关键字

来源:互联网 发布:js 返回n天后的日期 编辑:程序博客网 时间:2024/06/02 14:58

final关键字可以用在3个地方:

1,定义变量时

public final double radius;

表示声明了一个常量。常量一旦被初始化则不能再改变。对于基本类型来说其值不可变,对于对象来说,其引用不可变。

但是这里需要注意的是,虽然引用的对象不可变,但是引用的对象的内容是可变的。我们在下面会看到例子。

这里顺便8一句题外话:

String s = "abc";

s="123";

这是没有问题的,因为内存中的“abc”不可被修改,但是s可以指向另外一个字符串“123”。也就是说,所谓的String不可变,是指String指向的内容本身不能改变。

final String s = "abc";

s="123";

这样编译是不能通过的,因为final关键字限制了s的指向不能改变。


2,定义方法中的参数时 这是我们常见的一种使用方法

public void testMethod(final int i, final String[] j){}

这样做对于基本类型的变量没有什么实际意义。因为基本类型的变量在调用方法时是传值的,也就是说,你可以在方法中更改这个参数变量而不会影响到调用语句。

但对于对象变量,在传递时是传递其引用。看下面这个例子:


public class App {  public static void main(String[] args) {  int i = 5;  String[] j = {"Testing!"};  System.out.println(j);  App.testMethod(i, j);  System.out.println(j[0]);  }    public static void testMethod(int i, String[] j){ j[0]="111"; System.out.println(j);    } }

输出:

[Ljava.lang.String;@de6ced
[Ljava.lang.String;@de6ced
111

可以发现,main方法中的j和testMethod中的j指向的是同一个对象。因此在testMethod中对j的修改会影响main中打印的结果。

此时如果改为下面的代码:

  public static void testMethod(int i, final String[] j){ j[0]="111"; System.out.println(j);    }

会发现结果没有变化。因此final不能阻止在testMethod方法中修改对象的内容。

但如果代码变为一下则无法通过编译。

public static void testMethod(int i, final String[] j){ j = new String[100]; System.out.println(j);    }

相当于testMethod中新定义了一个对象j,且声明为final的,同时将传递进来的引用作为j的初值。因此之后就不能再修改j的引用了。

但不管怎么说,testMethod的参数int i和String[] j都是重新定义的变量,和main里的变量没有关系。

3,将方法声明为final

意味着这个方法可以被继承,但是不能被子类覆盖。

4,将类声明为final

一个final类是无法被任何人继承的,这就意味着该类的设计被认为已经很完美,不需要任何的修改或扩展。对于final类中的成员,可以定义其为final,也可以不是final。而对于方法,由于所属类为final的关系,自然也就成了final类。

原创粉丝点击