博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java中static成员变量、成员变量、static代码块、代码块、构造方法的执行顺序
阅读量:4982 次
发布时间:2019-06-12

本文共 2817 字,大约阅读时间需要 9 分钟。

执行顺序的规则:

一、先执行内部静态对象的构造方法,如果有多个按定义的先后顺序执行;静态对象在构造的时候也是也先执行其内部的静态对象。

二、再调用父类的构造方法(父类还有父类的话,从最开始的基类开始调用),如果没有明显指定调用父类自定义的构造方法,那么编译器会调用默认的父类构造方法super()。但是如果要调用父类自定义的构造方法,要在子类的构造方法中明确指定。

三、按声明顺序将成员引用对象变量初始化。

四、最后调用自身的构造方法。

五、同一个类中的static代码块,代码块,构造函数的执行顺序此顺序执行,static代码块与代码块的区别是static代码块只执行一次。

 

下面以一个例子来说明代码如下:

package com.dxz;class Animal {    String name;    Animal() {        System.out.println("class Animal default construct");    }    Animal(String name) {        this.name = name;        System.out.println(name + " class Animal construct");        printNumber();    }    public void printNumber() {    }}package com.dxz;public class Fish extends Animal {    Fish() {          System.out.println("class Fish");      }}package com.dxz;public class GoldFish extends Fish {    GoldFish() {          System.out.println("class GoldFish");      }  }package com.dxz;public class Cat {    Cat(){          System.out.println("class cat");      }}package com.dxz;public class Rabbit {    private static int number;    private static Cat cat = new Cat();//静态成员先执行        public Rabbit() {          number++;          System.out.println(number + "class rabbit");      }        static {        System.out.println("static Rabbit");    }        {        System.out.println("I'm a Rabbit");    }}package com.dxz;public class Dog extends Animal {    public int dogNumber;      private GoldFish goldFish = new GoldFish();      static  Rabbit blackRabbit = new Rabbit();       static  Rabbit whiterabbit = new Rabbit();             public Dog() {        super("super Tom");          System.out.println("class Dog");          dogNumber = 10;          System.out.println("The dog's number is:" + dogNumber);      }            public void printNumber(){          System.out.println("The dog's number is:" + dogNumber);      }  }package com.dxz;public class TestInheritanceConstructor extends Animal {    public static void main(String[] args){         System.out.println("---------------begin---------");        new Dog();     }  }
//结果:1:---------------begin---------2:class cat 3:static Rabbit4:I'm a Rabbit5:1class rabbit6:I'm a Rabbit7:2class rabbit8:super Tom class Animal construct9:The dog's number is:010:class Animal default construct 11:class Fish 12:class GoldFish 13:class Dog 14:The dog's number is:10

解释:

输出第2行:class cat  是因为Dog类中有静态成员。而静态成员所在的类Rabbit中又有静态成员。所以最先执行它。验证第一句。

输出第5、7行:1class rabbit 和 2class rabbit 是执行类Rabbit构造函数。

输出第3、4、5、6、7行:同一个类中static代码块,代码块,构造函数的执行顺序及static代码块只执行一次。验证第五句。

输出第8行:super Tom class Animal construct 执行父类的构造函数,因为用super("")。

输出第9行:The dog's number is:0 可以看出子类的dogNumber还是默认值0

输出第10、11、12行:class Animal default construct和 class Fish 和 class GoldFish是构造goldFish引用对象类型。验证第三句。

输出第13、14行:class Dog  和The dog's number is:10是执行自己的构造函数。

转载于:https://www.cnblogs.com/duanxz/archive/2012/12/07/2806666.html

你可能感兴趣的文章
省市联级(DataReader绑定)
查看>>
20165219 课上内容补做
查看>>
Tomcat7.0与Oracle10数据库连接池配置
查看>>
解决webpack和gulp打包js时ES6转译ES5时Object.assign()方法没转译成功的问题
查看>>
字节流与字符流的区别详解(转)
查看>>
类操作数据库
查看>>
找球号(一)
查看>>
oracle ebs 笔记
查看>>
Android studio使用git-android学习之旅(79)
查看>>
eclipse中去掉Js/javsscript报错信息
查看>>
网络中,FIFO、LRU、OPT这三种置换算法的缺页次数
查看>>
随机森林算法参数调优
查看>>
read命令读取用户输入
查看>>
Mysql编写定时任务事件
查看>>
路由器/交换机/集线器的区别收集(转)
查看>>
今日头条面试题汇总
查看>>
hdu 1305 Immediate Decodability
查看>>
基本数据类型
查看>>
laravel 配置sql日志
查看>>
基于注意力机制的群组推荐算法
查看>>