• Java基础代码块(静态/非静态)


    package com.hspedu.codeblock_;
    
    public class Course385 {
        public static void main(String[] args) {
            // 代码块
            Movie movie = new Movie("你好李焕英");
            System.out.println("========================");
            Movie movie2 = new Movie("唐探3", 100, "陈思诚");
        }
    }
    
    
    class Movie {
    
        private String name;
    
        private double price;
    
        private String director;
    
        // 代码块
        /*
         * 1、构造器都会执行相同的代码语句
         * 2、相同的部分可以提出到代码块
         * 3、不管调用哪一个构造器都会优先调用代码块
         * 4、代码块优先于构造器执行
         * 5、代码块可以用static修饰,也可以不修饰
         * */
    
        {
            System.out.println("广告开始..");
            System.out.println("电影开始..");
        }
    
        public Movie(String name) {
            System.out.println("《" + name + "》");
            this.name = name;
        }
    
        public Movie(String name, double price) {
            System.out.println(name + ", " + price);
            this.name = name;
            this.price = price;
        }
    
        public Movie(String name, double price, String director) {
            System.out.println("《" + name + "》" + ", " + price + ", " + director);
            this.name = name;
            this.price = price;
            this.director = director;
        }
    }
    package com.hspedu.codeblock_;
    
    public class Course386 {
        public static void main(String[] args) {
            // 代码块细节
    
            /*
             * 1、static代码块:静态代码块,作用是对类的初始化,随着类加载而执行
             *   并且只会执行一次。如果是非静态代码块则每次创建对象,就会执行一次
             * 2、类什么时候被加载?(重要)
             *   1)new创建对象实例
             *   2)new创建子类对象实例
             *   3)使用类的静态成员(静态属性、静态方法)
             * 3、非静态代码块,在创建对象实例时,会隐式调用,
             *  如果只使用类的静态成员则不会执行非静态代码块
             *
             * */
    
            // (1)new实例化对象加载
            AA aa = new AA();
            System.out.println("======================");
    
            // (2)new子类实例化加载,而且父类先加载,子类后加载
            AA aa2 = new AA();
            System.out.println("======================");
    
            // (3)调用静态成员,类加载,执行静态代码块(父类会先加载,先执行父类的静态代码块)
            System.out.println(Cat.n1);
            System.out.println("======================");
    
            // 静态代码块只会在类加载时执行一次,同AA类执行效果一样
    //        DD d1 = new DD();
    //        DD d2 = new DD();
            System.out.println(DD.n1);  // 只调用静态成员不会执行非静态代码块,静态代码块在第一次类加载时调用
    
        }
    }
    
    class Animal {
    
        static {
            System.out.println("Animal类的静态代码块");
        }
    }
    
    class Cat extends Animal {
    
        public static int n1 = 999;
    
        static {
            System.out.println("Cat类的静态代码块");
        }
    }
    
    class AA extends BB {
    
        // 静态代码块
        static {
            System.out.println("AA类的静态代码块1");
        }
    
        public AA() {
            System.out.println("AA对象创建");
        }
    }
    
    class BB {
    
        static {
            System.out.println("BB类的静态代码块1");
        }
    
        public BB() {
            System.out.println("BB对象创建");
        }
    }
    
    class DD {
    
        public static int n1 = 100;
    
        static {
            System.out.println("DD类的静态代码块");
        }
    
        // 类加载和非静态代码块的执行没有关系
        {
            System.out.println("DD类的非静态代码块");
        }
    }
    package com.hspedu.codeblock_;
    
    public class Course387 {
        public static void main(String[] args) {
            // 代码块细节 2
    
            /*
             * 4、在同一个类中创建对象的调用顺序:
             *   (1)先调用静态代码块和静态属性的初始化:调用顺序按照代码定义的顺序执行
             *   (2)然后调用非静态代码块和非静态属性初始化:调用顺序同样按照定义的顺序执行
             *   (3)最后调用构造器方法
             * 原因分析:类加载在对象创建之前,静态成员在类加载时调用执行,非静态成员在创建对象执行
             * */
    
            //
            A a = new A();
    
        }
    }
    
    
    class A {
        // 非静态代码块
        {
            System.out.println("A类的非静态代码块");    // 3
        }
    
        // 静态属性初始化
        private static int n1 = getN1();
    
        // 非静态属性初始化
        private int n2 = getN2();
    
        // 静态代码块
        static {
            System.out.println("A类的静态代码块  static"); // 2
        }
    
        // 静态方法
        public static int getN1() {
            System.out.println("getN1方法被调用  static");   // 1
            return 100;
        }
    
        // 非静态方法
        public int getN2() {
            System.out.println("getN2方法被调用");   // 4
            return 200;
        }
    
        public A() {
            System.out.println("对象A创建");    // 5
        }
    }
    package com.hspedu.codeblock_;
    
    public class Course388 {
        public static void main(String[] args) {
            // 代码块细节 3
    
            /*
            * 5、构造器前隐藏了super(..);和调用非静态代码块,先执行super再执行非静态代码块
            *   存在继承关系执行顺序:
            *       父类静态 => 子类静态 => 父类非静态 => 父类构造器 => 子类非静态 => 子类的构造器
            *
            * */
    
            new BBB();
        }
    }
    
    
    class AAA {
    
        {
            System.out.println("AAA非静态代码块");
        }
    
        static {
            System.out.println("AAA static block");
        }
    
        public AAA() {
            System.out.println("创建AAA类对象");
        }
    }
    
    class BBB extends AAA {
    
        {
            System.out.println("BBB非静态代码块");
        }
    
        static {
            System.out.println("BBB static block");
        }
    
        public BBB() {
            System.out.println("创建BBB类对象");
        }
    }
    package com.hspedu.codeblock_;
    
    public class Course389 {
        public static void main(String[] args) {
            // 代码块细节 3
    
            /*
             * 6、创建子类对象时,代码块执行顺序:
             *  (1)先执行父类的静态代码块和静态属性初始化
             *  (2)再执行子类的静态代码块和静态属性初始化
             *  (3)父类的普通代码块和普通属性初始化(父类非静态成员)
             *  (4)父类的构造器
             *  (5)子类的普通代码块和普通属性初始化(子类非静态成员)
             *  (6)子类的构造器
             *
             * 7、静态代码块只能调用静态成员,非静态代码块可以调用任意成员
             * */
    
            /*
             * 创建对象:
             *   1、进行类的加载
             *       1.1先加载父类A02,再加载B02(静态代码块和静态属性初始化和类加载相关)
             *   2、创建对象
             *      2.1先执行非静态代码块和非静态属性初始化
             *      2.2再执行构造器内的语法
             *      (有继承会执行super()方法)
             * */
            new B02();
    
            System.out.println("====================");
    
            new C02();
    
        }
    }
    
    class A02 {
    
        private static int n1 = getVal01();
    
        static {
            System.out.println("A02静态代码块"); // 2
        }
    
        {
            System.out.println("A02非静态代码块");    // 5
        }
    
        public int n3 = getVal02();
    
        public static int getVal01() {
            System.out.println("getVal01"); // 1
            return 10;
        }
    
        public int getVal02() {
            System.out.println("getVal02"); // 6
            return 10;
        }
    
        public A02() {
            System.out.println("A02构造器执行"); // 7
        }
    }
    
    class B02 extends A02 {
    
        private static int n3 = getVal03();
    
        static {
            System.out.println("B02的静态代码块");    // 4
        }
    
    
        public int n5 = getVal04();
    
        {
            System.out.println("B02的非静态代码块");   // 9
        }
    
        public static int getVal03() {
            System.out.println("getVal03"); // 3
            return 10;
        }
    
        public int getVal04() {
            System.out.println("getVal04"); // 8
            return 10;
        }
    
    
        public B02() {
            System.out.println("B02构造器执行"); // 10
        }
    }
    
    class C02 {
    
        private int n1 = 100;
    
        private static int n2 = 200;
    
    
        private void m1() {
    
        }
    
        private static void m2() {
    
        }
    
        // 静态代码块只能使用静态成员
        static {
    //        System.out.println(n1);
            System.out.println(n2);
    //        m1();
            m2();
        }
    
        // 非静态代码块都可以调用
        {
            System.out.println(n1);
            System.out.println(n2);
            m1();
            m2();
        }
    }
  • 相关阅读:
    Qt出现警告 Unescaped backslashes are deprecated!解决办法
    如何在Android应用程序中使用传感器模拟器SensorSimulator
    如何在Android模拟器上安装apk文件
    Qt学习记录--Qt::CaseSensitive
    VS2010/MFC编程入门教程之目录和总结
    TortoiseSVN客户端重新设置用户名和密码
    SVN服务器搭建和使用(三)
    SVN服务器搭建和使用(二)
    SVN服务器搭建和使用(一)
    Eclipse中安装使用SVN
  • 原文地址:https://www.cnblogs.com/kenantongxue/p/16004491.html
Copyright © 2020-2023  润新知