java中final修饰符实例分析

final修饰符:

final修饰成员变量必须有程序员显示指定初始值。
类的Field:必须在静态初始化块中或声明该Field时指定初始值。
实例Field:必须在非静态初始块中,声明Field或者构造器中指定初始值。

final局部变量:必须由程序员显示初始化。

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

final修饰的基本变量:不能对基本变量重新赋值。
final修饰的引用变量:只保证这个引用类型所引用的地址不会变,即
一直引用同一个对象,但这个对象完全可以发生改变。


/**

  

*/

import java.util.*;

public class Demo5

{

 public static void main(String[] args)

 {

  final B b = new B(22);

  b.test();

  //合法  改变值,但仍是指向同一个引用

  b.setAge(20);

  System.out.println(b.getAge());

  // 非法

  // b = null;

  b.test2();

 }

}

 /**

 fianl修饰成员变量

*/

class A

{

 //合法

 final int a = 10;

 //构造器或初始化化块中指定初始值

 final String str;

 final int c;

 final static double d;

 {

  str = "hello";

  //非法

  // a = 100;

 }

 static 

 {

  d = 100;

 }

 

 // 构造器可对没在初始化块中指定的Field指定初始值

 public A()

 {

  // 非法

  // str = "ddd";

  c = 1000;

 }

 public double changFinal()

 {

  // 不能再普通方法中为final指定初始值

  // return d = 1000.90;

  return 0;

 }

}

 /**

 fianl修饰数组 对象

*/

class B

{

 private int age;

 public B()

 {

 

 }

 

 public B(int age)

 {

  this.age = age;

 }

 

 public void setAge(int age)

 {

  this.age = age;

 }

 

 public int getAge()

 {

  return this.age;

 }

 

 public void test()

 {

  final int[] arr={23,434,56,898};

  System.out.println(Arrays.toString(arr));

  Arrays.sort(arr);

  System.out.println(Arrays.toString(arr));

  arr[2] = 200;

  System.out.println(Arrays.toString(arr));

  //下面对Arr重新赋值 非法

  // arr = null;

 }

 

 /**

  加深对final的理解

 */

 public void test2()

 {

  String str1 = "美好未来";

  //直接引用常量池中的"美好未来"

  String str2 = "美好"+"未来";

  //true

  System.out.println(str1 == str2);

  

  String s1 = "美好";

  String s2 = "未来";

  String s3 = s1+s2;

  //false  s1 s2只是变量 在编译时期不能确定 

  //若想在编译时期确定 则用 final修饰 s1 s2

  System.out.println(str1 == s3);

 }

}

小伙伴们是否对java中final修饰符有所了解了呢,相信注释中已经给大家解释的很清楚了,我这里就不再啰嗦