广

Java编程

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

    深入理解final变量的初始化

    2018-11-14 08:49:12 次阅读 稿源:互联网
    零七广告
    final变量的初始化位置 
    一是其定义处,也就是说在final变量定义时直接给其赋值,
    二是在构造函数中。而且在Java1.1以前,只能是在定义时给值。
    三是在初如化代码块中{} 或者 static{}
    代码如下:

    public class InitOrder {
        {
            System.out.println("before---field");
            //System.out.println("d1="+d1);
            d1 = 3;
            //System.out.println("d1="+d1);
        }
        static {
            System.out.println("before---static field");
            //System.out.println("d2="+d2);
            d2 = 3;
            //System.out.println("d2="+d2);
        }
        final int a1 = 1;
        final int b1;
        final int c1;
        final int d1;
        //final int e1;
        static final int a2 = 1;
        //static final int b2;
        static final int c2;
        static final int d2;
        //static final int e2;

        {
            System.out.println("after---field");
            //System.out.println("c1="+c1);
            c1 = 4;
            System.out.println("c1="+c1);
            //e2 =3;
        }
        static {
            System.out.println("after---static field");
            //System.out.println("c2="+c2);
            c2 = 4;
            System.out.println("c2="+c2);
            //e1 = 3;
        }
        public InitOrder() {
            b1 = 2;
            //b2 = 2;
        }
        public static void main(String[] args) {
            InitOrder order = new InitOrder();
            System.out.println("c1="+order.c1);
            System.out.println("c2="+order.c2);
            System.out.println("d1="+order.d1);
            System.out.println("d2="+order.d2);
        }
    }

    说明:上述所有注释皆为有语法错误
    输出结果:
    before---static field
    after---static field
    c2=4
    before---field
    after---field
    c1=4
    c1=4
    c2=4
    d1=3
    d2=3
    结果分析:
    1. 对比a1,a2基本没有什么问题,定义时就初始化
    2. 对比b1,b2在构造函数中初始化,b1没有问题,b2有问题,这是因为构造函数的调用在静态变量的后面而b2是静态的,所以会报错
    3. 对比c1,d1发现初始化没有问题,有问题的是使用输出语句。对于d1在初始化代码块中不论在哪加输出语句都会报错,这是因为d1所在的初始化代码块位置在变量d1定义的前面,而java中变量的初始化顺序是见Java中变量的初始化顺序, 普通变量和初始化代码块的初始化顺序是按照位置的先后的所以输出用到了d1变量,所以出错,但有一点我不明白,为什么在这里初始化d1不报错,而且在main函数中还可以调用它,难道这个也要去看一下java虚拟机?对于c1在后面加输出语句没有问题。前面加有问题很好理解,就是大之前没有被初始化.
    4. 对于c2,d2是和3同样的道理
    5. 对于e1放在静态代码块中显然不行,因为静态代码块最先加载,那时e1还没有加
    6. 对于e2也是,普通代码块的加载要晚于静态变量,所以也是不行的。

    零七网部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与零七网进行文章共享合作。

    零七广告
    零七广告
    零七广告
    零七广告