之所以要使用final方法,可能是出于对两方面理由的考虑。第一个是为方法“上锁”,防止任何继承类改变它的本来含义。设计程序时,若希望一个方法的行为在继承期间保持不变,而且不可被覆盖或改写,就可以采取这种做法。
采用final方法的第二个理由是程序执行的效率。将一个方法设成final后,编译器就可以把对那个方法的所有调用都置入“嵌入”调用里。
final在Java中并不常用,然而它却为我们提供了诸如在C语言中定义常量的功能,不 仅如此,final还可以让你控制你的成员、方法或者是一个类是否可被覆写或继承等功能,这些特点使final在Java中拥有了一个不可或缺的地位,也 是学习Java时必须要知道和掌握的关键字之一。 final成员 当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变, 而对于对象变量来说其引用不可再变。其初始化可以在两个地方,一是其定义处,也就是说在final变量定义时直接给其赋值,二是在构造函数中。这两个地方 只能选其一,要么在定义时给值,要么在构造函数中给值,不能同时既在定义时给了值,又在构造函数中给另外的值。下面这段代码演示了这一点: import java.util.List; import java.util.ArrayList; import java.util.LinkedList; public class Bat{ final PI=3.14; //在定义时便给址值 f
1.定义及编程技巧
/*
* final方法是在派生类中不能被覆盖的方法,final类是不能被覆盖的类。一个类可以含有final方法
* final类和final方法使用final声明
* 技巧:final static 类型成员变量。static使得变量只存在一个拷贝。final使得它不能改变。
* */
2.关于final成员赋值的讨论:
a.final 成员能且只能被初始化一次
b.final成员必须在声明时或者方法中被初始化,而不能在其它的地方被初始化。
eg:
package mypackage; public final class FinallyTest { private final int params;
public FinallyTest() { params=5; } public FinallyTest(int para) { params=para; } public static void main(String[] args) { FinallyTest ft=new FinallyTest(20); System.out.println(ft.params); } } |
eg2:
package mypackage; public final class FinallyTest { private final int params; public FinallyTest() { this(10); } public FinallyTest(int para) { params=para; } public static void main(String[] args) { FinallyTest ft=new FinallyTest(); System.out.println(ft.params); } } |
上面是两个final初始化的例子。下面我们看一下两种错误的例子
eg3
package mypackage; public final class FinallyTest { private final int params=11;//此处已经赋值 public FinallyTest() { this(10); } public FinallyTest(int para) { params=para; } public static void main(String[] args) { FinallyTest ft=new FinallyTest(); System.out.println(ft.params); } } Error(18,3): variable params is declared final; cannot be assigned |
eg4:
package mypackage; public final class FinallyTest { private final int params; public FinallyTest() { this(10); } public FinallyTest(int para) {
public void setParams(int b) { params=b; } public static void main(String[] args) { FinallyTest ft=new FinallyTest(); System.out.println(ft.params); } } Error(22,2): variable params is declared final; cannot be assigned |
eg5
package mypackage; public final class FinallyTest { private final int params; public FinallyTest() { this(10); } public FinallyTest(int para) { } public static void main(String[] args) { FinallyTest ft=new FinallyTest(); System.out.println(ft.params); } } Error(10,19): variable params might not have been initialized |
3.几点说明:
在java中,普通变量系统是自动初始化的,数值变量自动初始化为0,其余类型变量自动初始化为空。但是final类型的变量必须显示初始化,且初始化的方法必须是在申明时或者在构造方法中直接赋值,而不能通过调用函数赋值。
关于构造方法重载的问题,如果程序中没有显示的说明构造方法,那么就有默认的构造方法。如果程序中显示的声明了构造方法,那么默认的构造方法就不再存在。
在本例中,给出了关于this的使用方法