zoukankan      html  css  js  c++  java
  • 第十天

    代码初始化块是类的成员之一,每次类的创建会隐式的调用它。本质上是一个代码块,或方法体。

    初始化块分为静态初始化块和普通初始化块。其好处是减少多个构造器内重用的代码;

    特点1:

    普通初始化块:创建对象时隐式调用

    静态初始化块:类加载时隐式调用

     

    package coursetest;
    public class TestMain {
            public static void main(String[] args) throws ClassNotFoundException {
            Class.forName("coursetest.Test");//作用就是将参数指定的类加载到JVM
             Test test = new Test();         // 初始化 Test类
            }                                      
    }
    class Test{
        //初始化块有两种,普通的初始化块,静态的初始化块
        {  //在有对应Test类被实例化,new关键调用它的构造器的时候,new一次就会执行一次,可以执行多次
            System.out.println("普通的初始化块");
        }
        static {   //初始化块是在程序被加载到内存中的时候,静态的初始化块就会被执行,只会执行一次
            System.out.println("静态的初始化块");
        }
    }
    //输出结果:静态的初始化块
    //          普通的初始化块

    特点2:

    静态初始化块只调用一次(类加载时),而普通初始化块可以调用多次,随着对象的创建而加载

     

    package coursetest;
    public class TestMain {
            public static void main(String[] args) throws ClassNotFoundException {
            Class.forName("coursetest.Test");//作用就是将参数指定的类加载到JVM
             Test test = new Test();         // 初始化 Test类
             new Test();//输出结果:静态的初始化块
             new Test();//普通的初始化块
             new Test();//普通的初始化块
             new Test();//普通的初始化块
             new Test();//普通的初始化块
            }           //普通的初始化块                           
    }                   //普通的初始化块
    class Test{
        //初始化块有两种,普通的初始化块,静态的初始化块
        {  //在有对应Test类被实例化,new关键调用它的构造器的时候,new一次就会执行一次,可以执行多次
            System.out.println("普通的初始化块");
        }
        static {   //初始化块是在程序被加载到内存中的时候,静态的初始化块就会被执行,只会执行一次
            System.out.println("静态的初始化块");
        }
    }

    特点3:

    一个类中可以有多个静态初始化块和多个普通初始化块;静态初始化块的执行要早于普通初始化块;同一个类型的初始化块的执行顺序取决于定义的先后顺序!

     

    package coursetest;
    public class TestMain {
            public static void main(String[] args) throws ClassNotFoundException {
            Class.forName("coursetest.Test");//作用就是将参数指定的类加载到JVM
             Test test = new Test();         // 初始化 Test类
            }                                   
    }                  
    class Test{
        //初始化块有两种,普通的初始化块,静态的初始化块
        {  //在有对应Test类被实例化,new关键调用它的构造器的时候,new一次就会执行一次,可以执行多次
            System.out.println("普通的初始化块1");
        }
        {  //在有对应Test类被实例化,new关键调用它的构造器的时候,new一次就会执行一次,可以执行多次
            System.out.println("普通的初始化块2");
        }
        static {   //初始化块是在程序被加载到内存中的时候,静态的初始化块就会被执行,只会执行一次
            System.out.println("静态的初始化块1");
        }
        static {   //初始化块是在程序被加载到内存中的时候,静态的初始化块就会被执行,只会执行一次
            System.out.println("静态的初始化块2");
        }
    }//结果如下
    //静态的初始化块1
    //静态的初始化块2
    //普通的初始化块1
    //普通的初始化块2

    特点4:

    在一个类中如果有多个不同的初始化块,初始化属性,构造器,

    执行顺序是:静态初始化块 > 普通初始化块 > 构造器

     

    package coursetest;
    public class TestMain {
            public static void main(String[] args) throws ClassNotFoundException {
            Class.forName("coursetest.Test");//作用就是将参数指定的类加载到JVM
             Test test = new Test();         // 初始化 Test类
            }                                   
    }                  
    class Test{
        //初始化块有两种,普通的初始化块,静态的初始化块
        {  //在有对应Test类被实例化,new关键调用它的构造器的时候,new一次就会执行一次,可以执行多次
            System.out.println("普通的初始化块1");
        }
        {  //在有对应Test类被实例化,new关键调用它的构造器的时候,new一次就会执行一次,可以执行多次
            System.out.println("普通的初始化块2");
        }
        static {   //初始化块是在程序被加载到内存中的时候,静态的初始化块就会被执行,只会执行一次
            System.out.println("静态的初始化块1");
        }
        static {   //初始化块是在程序被加载到内存中的时候,静态的初始化块就会被执行,只会执行一次
            System.out.println("静态的初始化块2");
        }
        public Test() {
            System.out.println("Test的构造器!");
        }
    }//结果如下
    //静态的初始化块1
    //静态的初始化块2
    //普通的初始化块1
    //普通的初始化块2
    //Test的构造器!

    特点5:

    在父子类中,执行顺序是:

    爷爷类的静态初始化块>

    父类静态初始化块>

    子类静态初始化块>

    爷爷类普通初始化块>构造器>

    父类普通初始化块>构造器>

    子类普通初始化块>构造器

     

    package coursetest;
    public class TestMain {
            public static void main(String[] args) throws ClassNotFoundException {
            Class.forName("coursetest.Test2");//作用就是将参数指定的类加载到JVM
            new Test2();         // 初始化 Test类
            }                                   
    }                  
    class Test{
        //初始化块有两种,普通的初始化块,静态的初始化块
        {  //在有对应Test类被实例化,new关键调用它的构造器的时候,new一次就会执行一次,可以执行多次
            System.out.println("普通的初始化块");
        }
        static {   //初始化块是在程序被加载到内存中的时候,静态的初始化块就会被执行,只会执行一次
            System.out.println("静态的初始化块");
        }
        public Test() {
            System.out.println("Test的构造器!");
        }
    }
    class Test1 extends Test{
        {  //在有对应Test类被实例化,new关键调用它的构造器的时候,new一次就会执行一次,可以执行多次
            System.out.println("Test1的普通的初始化块");
        }
        public Test1() {
            System.out.println("Test1的构造器!");
        }
        static {   //初始化块是在程序被加载到内存中的时候,静态的初始化块就会被执行,只会执行一次
            System.out.println("Test1的静态的初始化块");
        }
    }
    class Test2 extends Test1{
        {  //在有对应Test类被实例化,new关键调用它的构造器的时候,new一次就会执行一次,可以执行多次
            System.out.println("Test2的普通的初始化块");
        }
        public Test2() {
            System.out.println("Test2的构造器!");
        }
        static {   //初始化块是在程序被加载到内存中的时候,静态的初始化块就会被执行,只会执行一次
            System.out.println("Test2的静态的初始化块");
        }
    }
    //结果如下
    //静态的初始化块
    //Test1的静态的初始化块
    //Test2的静态的初始化块
    //普通的初始化块
    //Test的构造器!
    //Test1的普通的初始化块
    //Test1的构造器!
    //Test2的普通的初始化块
    //Test2的构造器!

    特点6:

    静态初始化块中遵循静态成员的特点,只能直接访问静态成员!也就是在静态初始化块只能修改静态成员。

    普通初始化块可以初始化普通的变量,也可以初始化静态,构造器可以初始化普通的变量,也可以初始化静态。

    package coursetest;
    public class TestMain {
            public static void main(String[] args) throws ClassNotFoundException {
            Class.forName("coursetest.Test");//作用就是将参数指定的类加载到JVM
              Test test = new Test();
              System.out.println(test.a+","+Test.b);
            }                                   
    }                  
    class Test{
        int a;
        static int b;
        //初始化块有两种,普通的初始化块,静态的初始化块
        {  //在有对应Test类被实例化,new关键调用它的构造器的时候,new一次就会执行一次,可以执行多次
            System.out.println("普通的初始化块");
            b=11;
            a=22;
        }
        static {   //初始化块是在程序被加载到内存中的时候,静态的初始化块就会被执行,只会执行一次
            System.out.println("静态的初始化块");
            //a=33;//不允许        静态初始化只能直接访问静态成员
            b=44;
        }
        public Test() {
            a=55;
            b=66;
            System.out.println("Test的构造器!");
        }
    }
    //结果如下
    //静态的初始化块
    //普通的初始化块
    //Test的构造器!
    ////55,66

    问题:clean一下  或者有同名

     

     

     

  • 相关阅读:
    centos7 设置mongodb远程连接
    计算两个坐标点之间的点的坐标
    vim 设置字体和解决乱码
    webpack无法通过 IP 地址访问 localhost 解决方案
    使用GitHub作为Maven仓库并引用
    ajax 文件下载
    展开被 SpringBoot 玩的日子 《 六 》 整合 Mybatis
    展开被 SpringBoot 玩的日子 《 五 》 spring data jpa 的使用
    展开被 SpringBoot 玩的日子 《 四 》 Session 会话共享
    展开被 SpringBoot 玩的日子 《 三 》 整合Redis
  • 原文地址:https://www.cnblogs.com/jikebin/p/12440914.html
Copyright © 2011-2022 走看看