zoukankan      html  css  js  c++  java
  • 懒人学习Java的第一天

    Java中类及方法的加载顺序

    代码

     class A {
        private static int numA;
        private int numA2;
        
        static {
            System.out.println("A的静态字段 : " + numA);
            System.out.println("A的静态代码块");
        }
        
        {
            System.out.println("A的成员变量  : " + numA2);
            System.out.println("A的非静态代码块");
        }
     
        public A() {
            System.out.println("A的构造器");
        }
    }
     
    class B extends A {
        private static int numB;
        private int numB2;
     
        static {
            System.out.println("B的静态字段 : " + numB);
            System.out.println("B的静态代码块");
        }
        
        {
            System.out.println("B的成员变量 : " + numB2);
            System.out.println("B的非静态代码块");
        }
     
        public B() {
            System.out.println("B的构造器");
        }
    }
     
    public class Box {
        public static void main(String[] args) {
            A ab = new B();
            System.out.println("---");
            ab = new B();
        }
    }
    

    另外,在静态代码块中不能访问成员变量,想想这是为什么?它是否与成员的初始化顺序有必然的联系?

    有参构造的执行情况

    代码:

    class A {
        private static int numA;
        private int numA2;
        
        static {
            System.out.println("A的静态字段 : " + numA);
            System.out.println("A的静态代码块");
        }
        
        {
            System.out.println("A的成员变量  : " + numA2);
            System.out.println("A的非静态代码块");
        }
     
        public A() {
            System.out.println("A的构造器");
        }
        
        public A(int n) {
            System.out.println("A的有参构造");
            this.numA2 = n;
        }
    }
     
    class B extends A {
        private static int numB;
        private int numB2;
     
        static {
            System.out.println("B的静态字段 : " + numB);
            System.out.println("B的静态代码块");
        }
        
        {
            System.out.println("B的成员变量 : " + numB2);
            System.out.println("B的非静态代码块");
        }
     
        public B() {
            System.out.println("B的构造器");
        }
        
        public B(int n) {
            System.out.println("B的有参构造");
            this.numB2 = n;
        }
    }
     
    public class ClassLoad {
        public static void main(String[] args) {
            B anotherB = new B(1);// 思考有参构造的输出结果
        }
    }
    

    如上代码,当调用了子类B的有参构造时,父类的构造器先执行肯定是确定无疑,但是是执行哪个构造器呢?

    执行结果中可以看到,父类A依然是执行了无参构造,也就是说,如果子类构造器中未显式指定父类构造器,那么将会默认执行父类的无参构造,此时,如果你重载了一个父类的有参构造而没有指定无参构造,那么编译将不会通过!!

    例如错误代码如下:

    结论

    父类的静态字段——>父类静态代码块——>
    子类静态字段——>子类静态代码块——>
    父类成员变量(非静态字段)——>父类非静态代码块——>父类构造器——>
    子类成员变量(非静态字段)——>子类非静态代码块——>子类构造器

    简而言之,子承父业,父先行,有静先静,字段最先,代码块在后,构造器留尾。

  • 相关阅读:
    可视化工具D3.js教程 入门 (第十三章)—— 树状图
    可视化工具D3.js教程 入门 (第十二章)—— 力导向图
    可视化工具D3.js教程 入门 (第十一章)—— 饼图
    可视化工具D3.js教程 入门 (第十章)—— 交互式操作
    vue滑动页面选中标题,选中标题滚动到指定区域
    Vue样式穿透
    操作系统:进程和线程+进程的通讯方式
    客户端与服务端长连接的几种方式
    前端性能优化的 24 条建议(2020)-收藏
    idea中修改git提交代码的用户名
  • 原文地址:https://www.cnblogs.com/huangxing123/p/15138379.html
Copyright © 2011-2022 走看看