• Static块详解


    首先,我们先看一段程序,代码如下:

    public class Father
    {
        public Father()       //构造方法
        {
            System.out.println("  父类构造方法");
        }
        static                //静态块
        {
            System.out.println("  父类静态块");
        }
                              //非静态块
        {
            System.out.println("  父类非静态块");
        }
        public static void main(String[] args)
        {
            System.out.println("  main方法开始");
            Father father = new Father();    
        }
    }

    运行结果如下所示:

    从运行结果可以看出,程序首先执行静态块的内容,然后才开始main()方法,其次执行非静态块,最后加载构造方法

     如果这个类有个子类Son.java继承Father.java,那么运行结果又该如何呢?

    public class Son extends Father
    {
        public Son()             //子类构造方法
        {
            System.out.println("  子类构造方法");
        }
        static                   //子类静态块
        {
            System.out.println("  子类静态块");
        }
        {                        //子类非静态块
            System.out.println("  子类非静态块");
        }
    
        public static void main(String[] args)
        {
            System.out.println("  main方法开始");
            Son son = new Son();    
        }
    }

    运行结果如下所示:

     从这两个程序的运行结果,我们可以看出,

    1、上述程序并非首先从main()方法开始执行的,而是首先加载执行静态块,然后找到main方法的入口,执行main方法,紧接着执行非静态块,最后执行构造方法。

    2、如果有子类,那么首先执行父类的方法后,然后才执行子类的方法。

    这到底是为什么呢?

    我们先分析静态块和非静态块的区别:

    Java中静态块和非静态块中的区别是生命周期不一样。
    静态代码块,在虚拟机加载类的时候就会加载执行,先于主方法的执行,并只执行一次;
    非静态代码块,在创建对象的时候(即new一个对象的时候)执行,每次创建对象都会执行一次,非静态块是在每次实例化类的对象时执行的,而且执行在构造方法之前。

    顺便说一下,静态方法与静态块的区别:

    (1)一个类可以使用不包含在任何方法体中的静态代码块,当类被载入时,静态代码块被执行,且只被执行一次,静态块常用来执行类属性的初始化。例如:

    static
    {
        //静态块内容
    }

    (2)静态变量是整个类的变量,不能再任何方法体内声明静态变量,例如:

    function()
    {
        static int x = 0; //错误
    }

    (3)在静态方法里只能调用类中的其它静态成员,而不能直接访问类中的非静态成员。因为对于非静态的方法和变量,需要先创建类的实例对象后才可使用,而静态方法在使用前不用创建任何对象。

     那么下面的程序的运行结果是什么呢?如下所示:

    class Test{
     public static int X=300;
     static
     {
      System.out.println("1、X的结果: " +X);
      X=200;
      System.out.println("2、X的结果: " +X);
     }
     {
      System.out.println("3、非静态块X的结果: "+X);
     }
    }
    
    public class StaticBlockTest{
     public static void main(String args[]){
      System.out.println("主方法执行,X的值为:"+Test.X);
     }
    }

    自己运行一下,想一下为什么?!

     出处:http://www.cnblogs.com/bester/p/3297655.html

  • 相关阅读:
    省市县 三级 四级联动Javascript JQ 插件PCASClass.js
    【转】提高PHP性能的53个技巧
    Windows下Wamp装不上Memcache扩展
    Weui 微信网站开发样式插件使用教程
    div高度自适应填充剩余部分
    Storm简介
    Spark简介
    MapReduce的输入输出
    MapReduce 2简介
    Hadoop的I/O操作
  • 原文地址:https://www.cnblogs.com/bester/p/3297655.html
Copyright © 2020-2023  润新知