码迷,mamicode.com
首页 > 其他好文 > 详细

final修饰符

时间:2018-09-07 00:53:48      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:变量   不能   静态   class   main   设计   static   let   构造器   

final修饰的成员变量是不可改变量,必须由程序员显示地指定初始值

 

修饰成员变量

                               类变量:必须在静态初始化块中指定初始值或者声明该类变量时指定初始值,而且只能在两个地方的其中之一指定.

                               实例变量:必须在非静态初始化,声明该实例或者构造器中指定初始值,而且只能在三个地方的其中之一

    1.需要注意的是,如果普通初始化块已经为某个实例变量指定了初始值,那么不能在构造器中再为该实例变量指定初始值

    2.final修饰类变量要么在声明时,要么在静态初始化块中为该类变量指定初始值.

    3.实例变量不能在静态块中进行初始化操作,类变量也不能在普通初始化块中指定初始值,因为类变量在类初始化阶段已经被初始化了,普通初始化块不能对其重新赋值

各种情况示例代码如下:

package com.j1803.finalTest;
public class FinalVariableTest {
 //定义成员变量时指定默认值,合法
 final int a=6;
 final static int b=78;
 //下面变量将在构造器或者初始化块中分配初始值
 final int c;
 final  int  d;
 final static int  e;
 final static int f;
 final int g;
 //1,普通初始化块
 {
  //在普通初始化块中为实例变量指定初始值
  c=12;
  //不能给a重新赋值,下列语句非法
  //a=45;
  //不能给静态类变量赋值
  //e=45;
 }
 //2.静态初始化块
 static{
  //不能给实例变量赋值
     //d=45;
  e=12;
  //不能对b重新赋值
  //b=45;
  f=789;
 }
 //使用构造器对实例变量d赋值
 //如果在初始化块中已经对d进行了赋值,则构造器中不能对final变量重新赋值,
 public FinalVariableTest(int num){
  //c=45;
  d=12;
  g=num;
 }
 public void changeFinal(){
     //普通方法不能给final修饰的成员变量赋值
  //this.g=45;
  
 }
 public static void main(String[] args) {
  FinalVariableTest test=new FinalVariableTest(45);
  System.out.println("a:"+test.a);
  System.out.println("b:"+FinalVariableTest.b);
  System.out.println("c:"+test.c);
  System.out.println("d:"+test.d);
  System.out.println("e:"+FinalVariableTest.e);
  System.out.println("f:"+FinalVariableTest.f);
  System.out.println("g:"+test.g);
  //answer
  /*a:6
  b:78
  c:12
  d:12
  e:12
  f:789
  g:45*/
  
 

  
 }
}
 
如果打算在构造器中,或者初始化块中,对final成员变量进行初始化,则不要在初始化之前直接访问final成员变量,但Java又允许通过方法来访问final成员变量,此时会看到系统将final成员变量默认初始化为0,(或者\U0000,false,null)
 
package com.j1803.finalTest;
public class FinalVariableTest2 {
 final int age;
 {
  //下面一行代码直接报错
  //System.out.println(age);
  showAge(this.age);
  age=12;
  System.out.println(age);
  
 }
 public void showAge(int age){
  System.out.println("age===="+age);
 }
 
 public static void main(String[] args) {
  FinalVariableTest2 test=new FinalVariableTest2();
 }
}
answer:
age====0
12
final修饰的成员变量在显示初始化之前不能直接访问,但可以通过方法来访问,基本可以断定是java设计的一个缺陷

 

final修饰符

标签:变量   不能   静态   class   main   设计   static   let   构造器   

原文地址:https://www.cnblogs.com/shadow-shine/p/9602068.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!