java中final关键字的使用与理解

1. final关键字的含义

final表面意思就是不可更改的,恒量的意思;指的是无法改变的量,这与静态标量static是有区别的,静态变量指的是只有一份存储空间,值是可以改变的。使用final一定原因是出于软件设计的角度,因为别人看到final这个关键字就知道是什么意思,达到心领神会的效果,但也正是由于这种"语义"的存在,在程序设计中要谨慎使用,以免误用。 在Java中final修饰的就是常量,而且变量名要大写; 类不能同时被声明为final和abstract。

Math类:

    public static final double PI = 3.14159265358979323846;

…java源码中好多变量都用final修饰

2. final的作用

final根据修饰位置的不同作用也不相同,针对三种情况:
(1)修饰变量
被final修饰的变量必须要初始化,赋初值后不能再重新赋值。   注意:局部变量不在我们讨论的范畴,因为局部变量本身就有作用范围,不使用private、public等词修饰。 虽然final可以修饰局部变量,但是一般情况下,我们在实际应用中几乎不会这么干!没多大的意义!

被final修饰的变量必须显示的初始化,初始化可以以三种方式:
1)定义时初始化
2)在构造器中设置值
3)在非静态块中为final实例变量设置值

final修饰变量指的是:这个变量被初始化后便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可变,即不能再指向其他的对象。

final修饰的变量的初始化:


     public class FinalTest{
        final int x1= 10000;
        final int x2;
        final int x3;
        {
           x2 = 20000;
        }
        public FinalTest(int x3) {
        	this.x3 = x3;
        }
        
	public static void main(String[] args) {
		FinalTest finalTest = new FinalTest(5);
		//The final field FinalTest.x1 cannot be assigned
		//finalTest.x1= 3;//重新赋值时会报错 The final field FinalTest.x1 cannot be assigned
		System.out.println(finalTest.x3);
	}
	
        }
        

如果final修饰的变量是对象类型,那么不可更改指的是该变量不可以再指向别的对象,但是对象的值时可以更改的,比如:

    final Operate operate = new Operate() ;// operate有一个普通变量i初始化为10
    operate.i = 11;
    operate.i = 12;
    System.out.println(operate.i);
    
     //输出12

上述是自定义类,即便是数组,List等集合类型,所保存的值也是可以更改的。

(1)修饰方法

被final修饰的方法代表不能重写。

(1)修饰类

被final修饰的类,不能够被继承。
注意:final修饰的类,类中的所有成员方法都被隐式地指定为final方法。

(3) final用于数组
final用于数组和引用时一样的,数组只不过是另一种引用,对于这个变量的引用是不能被重新赋值,但是对象本身是可以修改的。代码如下:
package com.game.lll;    

public class FinalTest {    
    private final Value v1 = new Value(10);    

    private final int[] values = { 1, 2, 3, 4, 5, 6 };    

    public static void main(String[] args) {    
        FinalTest test = new FinalTest();    
        //test.a = 5;//不可以这样做    
        test.v1.value++;    
        //test.v1 = new Value(12);//Error:不可以这样做  
        test.values[0] = 100;//对象本身是可以修改的    
        for(int i = 0; i < test.values.length;i++){    
            System.out.println(test.values[i]++);//对于这个变量的引用是不能被重新赋值    
        }    
    }    

    class Value{    
        int value;     
        public Value(int value) {    
            this.value = value;    
        }    
    }    
}

3、 final和static的区别

static作用于成员变量用来表示只保存一份副本,而final的作用是用来保证变量不可变,看一下例子:

     public class Test {
            public static void main(String[] args)  {
                MyClass myClass1 = new MyClass();
                MyClass myClass2 = new MyClass();
                System.out.println(myClass1.i);
                System.out.println(myClass1.j);
                System.out.println(myClass2.i);
                System.out.println(myClass2.j);
          		myClass1.i = 1233//这里不可以改的
         
            }
        }
        class MyClass {
            public final double i = Math.random();
            public static double j = Math.random();
        }

输出结果
在这里插入图片描述

运行结果,两次打印,j的值都是一样的,j是static类型的属于类,因此两次值相同。i不是static的因此属于对象,但是i的值是不可变的,这里的不可变是意思是你不能对它就行二次修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值