您当前位置:设计在线网 >> JavaScript >> 浏览文章

java中final的函数意义

分享到:
本文章讲述了java中final的函数意义.

1、如

果一个数据既是static又是final,那么它会拥有一块无法改变的存储空间。

2、final data: 当final用于基本数据类型时,final让其值(value)保持不变,但是当用于object reference时,final仅让reference保持不变。也就是说当reference一旦被初始化用于代表某个对象时,便再也不能改变指向另一个对象,但对象本身的内容确实可以改变的。final对array的作用和对reference的作用一样。参考以下例子:

public class Test1{

private final int li_int=12;

private final InClass inClass1=new InClass(5);

private final InClass inClass2=new InClass(8);

public void modifiedFinal(int a){

//下面语句出现编译错误,不能修改final基本类型的值

//li_int = a;

//下面语句出现编译错误,不能将已经初始化的final变量指向另一个对象

//inClass1=inClass2;

//下面语句成功,虽然引用不能改变但final变量引用的对象本身内容是可以改变的

inClass1.mod(a);

}

class InClass{

int li_a=0;

public InClass(int a){

li_a=a;

}

public int mod(int b){

li_a=b;

return li_a;

}

}

public static void main(String args[]){

Test1 test1=new Test1();

test1.modifiedFinal(100);

System.out.println(test1.inClass1.li_a);

}

}

3、blank finals:java允许将数据成员声明为final,却不赋初值。但是,blank finals必须在使用之前初始化,且必须在构造函数中初始化。请参考以下例子:

public class Test2{

//final变量一开始允许不赋值

private final int li_int;

public Test2(int a){

//下面语句编译通过,对定义为空的final变量的赋值必须在构造方法中进行,而且必须要赋值,不赋值也报错

li_int = a;

}

public int mod(int a){

//下面语句编译出错,对定义为空的final变量的赋值必须在构造方法中进行

//li_int = a;

return li_int;

}

}

4、final arguments: 声明arguments为final,可以保证该argument不能再被指向它处,当argment是基本数据类型时,就意味着值不能改变。参考以下例子:

public class Test3{

private int li_int=12;

private InClass inClass1=new InClass(5);

private InClass inClass2=new InClass(8);

public void modifiedFinal(final int a,final InClass in){

//下面语句出现编译错误,不能修改final基本类型的值

//a = 15;

//下面语句出现编译错误,不能将已经初始化的final变量指向另一个对象

//in=inClass2;

//下面语句成功,虽然引用不能改变但final变量引用的对象本身内容是可以改变的

in.mod(a);

}

class InClass{

int li_a=0;

public InClass(int a){

li_a=a;

}

public int mod(int b){

li_a=b;

return li_a;

}

}

public static void main(String args[]){

int a=100;

//内部类初始化

Test3 test3=new Test3();

Test3.InClass in=test3.new InClass(30);

System.out.println(in.li_a);

test3.modifiedFinal(a,in);

System.out.println(in.li_a);

}

}

5、final methods: 可以锁住该method,不让继承类改变其意义(不允许子类覆写);允许编译器对此method作为inline method调用。参考以下例子:

public class Test4{

private final int li_int=0;

public final int pub_fi_mod(){

return li_int;

}

protected final int pro_fi_mod(){

return li_int;

}

private final int pri_fi_mod(){

return li_int;

}

private int pri_mod(){

return li_int;

}

}

public class Test5 extends Test4{

private int li_i=100;

//下面的方法编译出错,不能覆盖final方法,只针对public和protected,子类中方法与父类中private的方法名相同不是覆盖,与父类中同方法名的方法没有任何关系(除了名字相同)。

/*

public int pub_fi_mod(){

return li_i;

}

protected int pro_fi_mod(){

return li_i;

}*/

private final int pri_fi_mod(){

return li_i;

}

private int pri_mod(){

return li_i;

}

public static void main(String args[]){

System.out.println(new Test5().pri_mod());

}

}

推荐阅读:
(分享)Java私塾初级完整视频打包下载地址
(分享)构建可扩展的Java EE应用
将XML转换为JSON的示例讲解
推荐文章  
赞助商链接  
热门排行  
主题推广  
中国设计在线网 All Rights Reserved. 互联网违法和不良信息举报
信息产业部备案号:湘ICP备09001063号