zoukankan      html  css  js  c++  java
  • JavaSE——final修饰符

    一、final 修饰变量,被final修饰的变量在被赋初始值之后,不能对它重新赋值

      修饰实例变量,必须显示指定初始值,可以在三个位置指定初始值:
            1、定义final实例变量时指定初始值
            2、在非静态初始化块中为final变量指定初始值
            3、在构造器中为final实例变量指定初始值
        对于final实例变量,这三种方式都会被抽取到构造器中赋初始值
     
      修饰类变量,同样必须显示指定初始值,可以在两个位置指定初始值:
            1、定义类变量时指定初始值
            2、在静态初始化块中为final类变量指定初始值
        这两种方式都会被抽取到静态初始化块中赋初始值
    public class FinalVar {
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            System.out.println(Price.INSTANCE.currentPrice);
            Price price=new Price(2.8);
            System.out.println(price.currentPrice);
        }
    }
    class Price{
        static Price INSTANCE=new Price(2.8);
        static double initPrice=20;
        /*
         * 若调整 上面两句话的顺序
         * 则结果改为  17.2    17.2
         */
        
        double currentPrice;
        public Price(double discount) {
            // TODO Auto-generated constructor stub
            currentPrice=initPrice-discount;
        }
         
    }
    
    -2.8
    17.2
    public class FinalVar {
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            System.out.println(Price.INSTANCE.currentPrice);
            Price price=new Price(2.8);
            System.out.println(price.currentPrice);
        }
    }
    class Price{
        final static Price INSTANCE=new Price(2.8);
        final static double initPrice=20;
        double currentPrice;
        public Price(double discount) {
            // TODO Auto-generated constructor stub
            currentPrice=initPrice-discount;
        }
         
    }
    
    17.2
    17.2

    二、执行“宏替换”的变量

     
       final 修饰符的一个重要用途是定义“宏变量”,当定义final变量时就为该变量指定了初始值,而且该初始值可以在编译时确定下来,那这个final变量本质上就是一个“宏变量”,编译器会把程序中所有用到该变量的地方直接替换成该变量的值。
        
        如果没有使用final修饰变量a,则系统会把它当做一个变量来处理,不会进行替换,如s0==s1 false, sf0==sf1 true ;
        即使字符串连接运算中包含隐式类型(将数字转换为字符串)转换,字符串依然在编译时就可以确定该变量的值,因此他们都是宏变量,如s1==s3 true sf1==sf3 true,。
        如果连接字符串中包含需要调用String类的方法,因此编译器无法在编译时候确定它的值,即使用final 修饰,也不会被当做宏变量处理 如s1==s2 false  sf1==sf2 false。
        虽然对于实例变量而言,除了可以在定义该变量使赋初始值之外,还可以在非静态初始化块、构造器中对它赋初始值,但对于final 实力变量而言,只有在定义该变量时指定初始值才会有“宏变量”的效果,在非静态初始化块、构造器中为final实例变量指定初始值则不会有这种效果,如str1+str1=="javajava" false,str2+str2=="javajava" false,str3+str3=="javajava" true。
        对于类变量而言,也只有在定义final类变量时制定初始值,系统才会对该final类变量执行宏替换str11+str11=="javajava" false,str12+str12=="javajava" true。
     
    public class FinalDefine {
        String s00="java";
        String s01="1";
        
        String s0=s00+s01;
        String s1="java1";
        String s2="java"+String.valueOf(1);
        String s3="java"+1;
        
        
        final String sf00="java";
        final String sf01="1";
        String sf0=sf00+sf01;
        final String sf1="java1";
        final String sf2="java"+String.valueOf(1);
        final String sf3="java"+1;
        
        
        final String str1;
        final String str2;
        final String str3="java";
        {
            str1="java";
        }
        public FinalDefine(){
            str2="java";
        }
        
        
        final static String str11;
        final static String str12="java";
        
        static {
            str11="java";
        }
        
        void charge(){
            
            System.out.println(s0==s1);
            System.out.println(s1==s2);
            System.out.println(s1==s3);
            System.out.println(str1+str1=="javajava");
            System.out.println(str2+str2=="javajava");
            System.out.println(str3+str3=="javajava");
            
            System.out.println();
            
           
            System.out.println(sf0==sf1);
            System.out.println(sf1==sf2);
            System.out.println(sf1==sf3);
             System.out.println(str11+str11=="javajava");
            System.out.println(str12+str12=="javajava");
        }
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            FinalDefine fDefine=new FinalDefine();
            fDefine.charge();
        }
        
    }
    
    false
    false
    true
    false
    false
    true
    
    true
    false
    true
    false
    true
  • 相关阅读:
    拾遗:『rhel6系列的开、关机脚本』
    拾遗:{rpm、yum及源码方式管理软件包}
    拾遗:sed&vim
    拾遗:Linux 用户及权限管理基础
    『BASH』——Learn BashScript from Daniel Robbins——[003]
    『BASH』——Hadex's brief analysis of "Lookahead and Lookbehind Zero-Length Assertions"
    『BASH』——Learn BashScript from Daniel Robbins——[001-002]
    Modular arithmetic and Montgomery form 实现快速模乘
    __int128使用
    Windows10下安装CentOS7双系统
  • 原文地址:https://www.cnblogs.com/mingcaoyouxin/p/3926512.html
Copyright © 2011-2022 走看看