一、final变量
咋们先看个,例子,再来解释为什么会这样!
public class Main {
public static void main(String[] args) {
// write your code her
final int a[]=new int[2];
final int b=1;
a[0]=1;
System.out.println("a[0]="+a[0]+",b="+b);
a[0]=9;
//b=9; 会报错
System.out.println("a[0]="+a[0]+",b="+b);
}
}
在此之前是不是坚信final 修饰的变量,地球毁灭都不会被改变?我一开始是这样想的,后面我发现我错了,并不是,原因是:
final 关键词定义基本数据类型的常量,就不能被改变。比如 fianl double PI=3.1415; 后面对PI 改变会报错,就像上面的b一样。
并且,一旦一个对象被修饰为fianl 后,就只能恒定指向这个对象,无法改变指向另外一个对象。但是!这个对象本身的值确实可以改变的。这就好比,两个人结婚了,OK,在户口本上配偶的名字指向了这个对象,但是对象心中的梦中情人却可以随时改变!即得到了你这个人,却没得到你的心(指定了对象不能变,但是对象的值却可以改变)。
使用static final 可以让对象的心死心塌地,宇宙毁灭都不变。static final 占据一段不能改变的存储空间。
再看个例子更加明白(心里装可以改变哦!):
public class Main {
public static void main(String[] args) {
// write your code her
final Test test=new Test();
System.out.println("test.a="+test.a+",test.b="+test.b);
System.out.println("a+b="+test.add());
test.a=5;
test.b=5;
System.out.println("test.a="+test.a+",test.b="+test.b);
System.out.println("a+b="+test.add());
}
public static class Test {
int a=2;
int b=3;
int add(){
return a+b;
}
}
}
所以想要天长地久宇宙毁灭都不变的爱情,呸,口误,应该是常量,欢迎订购 static final . 你值得拥有,嘿嘿!
二、final 方法
首先,你要知道,被final定义的方法不能够被重写。所以可以用来防止子类瞎修改。而且你知道吗?private 修饰的方法被隐式指定为final 类型,所以无需再private前面加 final。
三、final 类
首先,定义为final 的类不能够被继承。如果希望一个类 不允许任何继承,不允许任何改动,可以定义为final 类。
如果某个类被定义为了 final 形式,则所有方法都隐式设置为 final 形式,但是 其中的成员变量可以被定义为 非final 当然也可以是 final 形式。
/**
* 总结一下在程序中final数据可以出现的位置
*
* @author pan_junbiao
*
*/
public class FinalDataTest
{
// final成员变量不可更改
final int VALUE_ONE = 6;
// 在声明final成员变量时没有赋值,称为空白final
final int BLANK_FINALVAULE;
// 在构造方法中为空白final赋值
public FinalDataTest()
{
BLANK_FINALVAULE = 8;
}
// 设置final参数,不可以改变参数x的值
int doIt(final int x)
{
return x + 1;
}
// 局部变量定义为final,不可以改变i的值
void doSomething()
{
final int i = 7;
}
}
OK 今天先到这儿,砥砺前行!