【JAVA】final修饰Field

一、简介

  final修饰符可以用来修饰变量、方法、类。final修饰变量时一旦被赋值就不可以改变。

二、final成员变量

  成员变量是随类初始化或对象初始化而初始化的。当类初始化的时候,会给类变量分配内存;当对象初始化的时候,会给实例变量分配内存。

  所以说,final修饰的变量可以在申明的时候指定初始值,也可以再静态初始化块中指定初始值;final修饰的实例变量除了在申明的时候指定初始值,还可以在构造器或者在普通初始化块中指定初始值。

  需要注意的是: 指定初始值只能在一处进行,不可既在申明的时候指定,又在初始化块中指定。

  

package fianlFieldCase;

public class Test {

    //实例field,在申明时赋值了
    private final String str = "java";

    //实例field,在申明时未赋值
    private final String str2;

    //实例field,在申明时未赋值
    private final int i;

    //类field,在申明时赋值了
    private static final int i2 = 2;

    private static final int i3;

    {
        //在普通初始化块中给实例field赋值
        str2 = "normalFinalField";
    }

    static
    {
        //在静态初始化块中给类field指定初始值
        i3 = 3;
    }
    public Test()
    {
        //在构造器中给实例field赋值
        i = 1;        

        //在构造器中给已经在初始化中赋了值的str2重新赋值,将会报编译错。
        //str2 = "re";
    }
}

  注意: final修饰的成员变量必须显式进行初始化,若与普通成员变量一样,由系统给出默认值,而此变量又是不可变的,那这个变量也就失去意义了。所以JAVA语法规定final修饰的成员变量必须显式初始化。

三、final局部变量

  final修饰的局部变量可以在申明的时候赋值,也可以在后面赋值,但只能赋值一次,否则会编译不通过。同样final修饰的形参也是的,不可以重新进行赋值,因为形参是在该方法被调用的时候被赋值的。  

package fianlFieldCase;

public class FinalField {

    public static void print(final String str)
    {
        //str不能被重新赋值
        //str = "android";
        System.out.println(str);
    }
    public static void main(String[] args) {
        //final修饰的局部变量在申明的时候就被初始化了
        final String s = "java";

        //若重新赋值,便会编译不通过
        //s = "python";

        //final修饰的局部变量,没有被初始化
        final int i;

        //可以在后面进行初始化
        i = 1;

        //重新赋值,便会报错
        //i = 2;

        print("Ruby");
    }
}

四、final修饰基本类型变量和引用类型变量的区别  

  当使用final修饰基本类型变量时,不能对基本类型变量进行重新赋值,因此基本类型变量不能被改变。

  当final修饰引用类型变量时,它仅仅是一个引用,存放的是对象的地址,那这个地址是不能变的,即不能指向新的地址,但指向的这个对象里面的值其实是可以改变的。

  final修饰方法和类将在后续博客进行总结!

时间: 2024-10-26 01:12:26

【JAVA】final修饰Field的相关文章

Java final修饰符

final的定义: 在英文层面上,final的意思是"最后的","最终的"意思,在Java中也同样表示出此种含义. final的运用对象: final适用于修饰变量(包括类属性.对象属性.局部变量和形参).方法(包括类方法和对象方法)和类. final修饰类: 由于final定以后的对象不能进行修改和重载,用final修饰的类不能被继承,即不能拥有自己的子类.如果视图对一个已经用final修饰的类进行继承,在编译期间或发生错误. final修饰变量: 一旦定义了fi

java final 修饰变量

如果使用final修饰一个变量时,是值其引用的对象不变,而不是引用对象指向的内容.也是固定了栈内存的引用不变,不是修饰堆内存的内容. 如:

JAVA基础-栈与堆,static、final修饰符、内部类和Java内存分配

Java栈与堆 堆:顺序随意 栈:后进先出(Last-in/First-Out). Java的堆是一个运行时数据区,类的对象从中分配空间.这些对象通过new.newarray.anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放.堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据.但缺点是,由于要在运行时动态分配内存,存取速度较慢. 栈的优势是

Java反射机制可以动态修改实例中final修饰的成员变量吗?

问题:Java反射机制可以动态修改实例中final修饰的成员变量吗? 回答是分两种情况的. 1. 当final修饰的成员变量在定义的时候就初始化了值,那么java反射机制就已经不能动态修改它的值了. 2. 当final修饰的成员变量在定义的时候并没有初始化值的话,那么就还能通过java反射机制来动态修改它的值. 实验: 1. 当final修饰的成员变量在定义的时候就初始化了值 1 public Class Person { 2 private final String name = "damon

JAVA中内部类(匿名内部类)访问的局部变量为什么要用final修饰?

本文主要记录:在JAVA中,(局部)内部类访问某个局部变量,为什么这个局部变量一定需要用final 关键字修饰? 首先,什么是局部变量?这里的局部是:在方法里面定义的变量. 因此,内部类能够访问某局部变量,说明这个内部类不是在类中定义的内部类,而是在方法中定义的内部类,称之为:局部内部类. 局部变量的作用域:局部变量是在某个方法中定义,当该方法执行完成后,局部变量也就消失了.[局部变量分配在JVM的虚拟机栈中,这部分内存空间随着程序的执行自动回收],也即:局部变量的作用域是在 “方法的范围内”.

Java基础:String不可变性和final修饰

转载请注明出处: jiq?钦's technical Blog - 季义钦 String的不可变性 Java规定String是不可变的(immutable).事实上这个不可变具备两层含义: 1 内容不可变 不论什么看起来改动它们的操作.实际上都是又一次new出一个对象. String s = new String("111"); String newS = s; newS = "dsfsd"; System.out.println(s); //111 假设不能做到内

Java中final修饰符深入研究

一.开篇 本博客来自:http://www.cnblogs.com/yuananyun/ final修饰符是Java中比较简单常用的修饰符,同时也是一个被"误解"较多的修饰符.对很多Java程序员来说,他们大都只是草草看了一下各种书本上的介绍,然后背下来,什么时候想起 来有这东西就用一下.对于何时使用final修饰符.使用final修饰符对程序有什么影响,这些其实他们并不知道,当然在这篇文章之前,我也是一知半解的. 我们书本上对final的描述大概有三种用法: final可以修饰变量,

为什么Java匿名内部类访问的外部局部变量或参数需要被final修饰

大部分时候,类被定义成一个独立的程序单元.在某些情况下,也会把一个类放在另一个类的内部定义,这个定义在其他类内部的类就被称为内部类,包含内部类的类也被称为外部类. class Outer { private int a; public class Inner { private int a; public void method(int a) { a++; //局部变量 this.a++; //Inner类成员变量 Outer.this.a++; //Outer类成员变量 } } } 一般做法是

java final可以修饰String吗?

我们知道String对象是不可变的,是指String内部的东西是不变的 String a = "xxx"; 这里a还是可以重新引用别的:a = "yyy"; 但是加上final修饰: final String a = "xxxx"; 这时就不可以:a = "yyy"; 总结一下:final是让被修饰的变量,不能再引用别的变量 final修饰的变量就是常量,是放在特定存储区域的,类常量一般要加static 比如:final修饰的