Java中构造方法的执行顺序
一、先执行内部静态对象的构造方法,如果有多个按定义的先后顺序执行;静态对象在构造的时候也是也先执行其内部的静态对象。
二、再调用父类的构造方法(父类还有父类的话,从最开始的基类开始调用),如果没有明显指定调用父类自定义的构造方法,那么编译器会调用默认的父类构造方法super()。但是如果要调用父类自定义的构造方法,要在子类的构造方法中明确指定。
三、按声明顺序将成员引用对象变量初始化。
四、最后调用自身的构造方法。
下面以一个例子来说明代码如下:
- class Animal{
- String name;
- Animal() {
- System.out.println("class Animal");
- }
- Animal(String name){
- this.name = name;
- System.out.println(name + " class Animal");
- printNumber();
- }
- public void printNumber(){
- }
- }
- class Fish extends Animal{
- Fish() {
- System.out.println("class Fish");
- }
- }
- class GoldFish extends Fish {
- GoldFish() {
- System.out.println("class GoldFish");
- }
- }
- class Cat {
- Cat(){
- System.out.println("class cat");
- }
- }
- class Rabbit {
- private static int number;
- private static Cat cat = new Cat();
- public Rabbit() {
- number++;
- System.out.println(number + "class rabbit");
- }
- }
- 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("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);
- }
- }
- public class TestInheritanceConstructor extends Animal {
- public static void main(String[] args){
- new Dog(); //Test the executive order of constructor
- }
- }
class Animal{
String name;
Animal() {
System.out.println("class Animal");
}
Animal(String name){
this.name = name;
System.out.println(name + " class Animal");
printNumber();
}
public void printNumber(){
}
}
class Fish extends Animal{
Fish() {
System.out.println("class Fish");
}
}
class GoldFish extends Fish {
GoldFish() {
System.out.println("class GoldFish");
}
}
class Cat {
Cat(){
System.out.println("class cat");
}
}
class Rabbit {
private static int number;
private static Cat cat = new Cat();
public Rabbit() {
number++;
System.out.println(number + "class rabbit");
}
}
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("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);
}
}
public class TestInheritanceConstructor extends Animal {
public static void main(String[] args){
new Dog(); //Test the executive order of constructor
}
}
执行结果:
class cat
1class rabbit
2class rabbit
Tom class Animal
The dog's number is:0
class Animal
class Fish
class GoldFish
class Dog
The dog's number is:10
解释:
输出:class cat 是因为Dog类中有静态成员。而静态成员所在的类Rabbit中又有静态成员。所以最先执行它。验证第 一句。
输出:1class rabbit 和 2class rabbit 是执行类Rabbit构造函数。
输出:Tomclass Animal 执行父类的构造函数,因为用super("")。
输出:The dog's number is:0 可以看出子类的dogNumber还是默认值0
输出:class Animal 和 class Fish 和 class GoldFish是构造goldFish引用对象类型。验证第三句。
输出:class Dog 和The dog's number is:10是执行自己的构造函数。
Java中构造方法的执行顺序的更多相关文章
- Java Object 构造方法的执行顺序
Java Object 构造方法的执行顺序 @author ixenos 为了使用类而做的准备工作包括三个步骤 1)加载:类加载器查找字节码(一般在classpath中找),从字节码创建一个Class ...
- Java 继承中构造方法的执行顺序问题
在Java中,如果一个类没有任何显式创建的构造器则该类默认会有一个无参构造器:如果显式创建了有参构造器则该类就不再有默认无参构造器. 在Java继承中,构造器并不能被继承,而是被显示或隐式调用. 1. ...
- java中静态代码执行顺序
1.Java中静态变量只能在类主体中定义,不能在方法中定义. 静态变量属于类所有而不属于方法. 2. 静态块:用static申明,JVM加载类时执行,仅执行一次 构造块:类中直接用{}定义,每一次创建 ...
- java中的一些执行顺序,代码块,静态,构造,成员。。。。(转的)
Java初始化顺序(转来的) 1在new B一个实例时首先要进行类的装载.(类只有在使用New调用创建的时候才会被java类装载器装入) 2,在装载类时,先装载父类A,再装载子类B3,装载父类A后,完 ...
- 关于java中构造方法、实例初始化、静态初始化执行顺序
在Java笔试中,构造方法.实例初始化.静态初始化执行顺序,是一个经常被考察的知识点. 像下面的这道题(刚刚刷题做到,虽然做对了,但是还是想整理一下) 运行下面的代码,输出的结果是... class ...
- java学习(一)静态代码块 构造代码块 构造方法的执行顺序及注意问题
今天我总结了一下java中静态代码块 构造代码块 构造方法的执行顺序及其注意问题 首先要知道静态代码块是随着类的加载而加载,而构造代码块和构造方法都是随着对象的创建而加载 当时做了这么一个小案例(想必 ...
- java中构造方法和方法super/this超类与子类中初始化顺序
java中构造方法和方法全面解析 我相信大多说人都对构造方法.方法不陌生,而且很了解,但我也相信有很多像我这样的没有一个很好很清晰很全面的认识,今天就把它整理如下,希望能给大家带来点方便与帮助,也希望 ...
- Java(静态)变量、(静态)代码块、构造方法的执行顺序
Java(静态)变量.(静态)代码块.构造方法的执行顺序 总结 1.父类静态变量和静态代码块(先声明的先执行); 2.子类静态变量和静态代码块(先声明的先执行); 3.父类的变量和代码块(先声明的先执 ...
- Java中如何保证线程顺序执行
只要了解过多线程,我们就知道线程开始的顺序跟执行的顺序是不一样的.如果只是创建三个线程然后执行,最后的执行顺序是不可预期的.这是因为在创建完线程之后,线程执行的开始时间取决于CPU何时分配时间片,线程 ...
随机推荐
- Oracle—用户管理的备份(一)
用户管理的备份(一) 一.首先要知道数据库中表空间和文件的信息,有几个性能视图,v$datafile,v$tablespace,v$tempfile,v$logfile,v$controlfile,d ...
- oracle数据库使用plsql(64位)时出现的问题
64位win7上装PL/SQL,经常会遇见“Could not load "……\bin\oci.dll"”这个错误,我查了一下资料,原因是PL/SQL只对32位OS进行支持,解决 ...
- 2016年的个人计划-xiangjiejie
过去一年,开发了angularjs的wap项目,appwap社区,忙忙碌碌不停的做各种活动. 职业目标 今年,要多看书,别总是被懒癌缠身. 多学习,过去半年很少看技术文章了吧,养成定期看文章的好习惯, ...
- C++第三课(2013.10.03 )
函数的默认参数: 1.函数的默认参数必须放在形参的右边而且在默认形参的右边不能出现没有无默认参数的形参 2.如果函数的声明给出了默认的参数,那么函数的实现就不能定义默认参 3.声明成员函数时没有给出默 ...
- JavaWeb学习笔记--Listener
JSP中的监听器 Web程序在服务器运行的过程中,程序内部会发生多事件,如Web应用的启动和停止.Session会话的开始和销毁.用户请求的开始和结束等等.有时程序员需要在这些事件发生的时机执行一 ...
- 这样就算会了PHP么?-3
关于循环,IF,WHILE.... <?php $month = date("n"); $today = date("j"); if ($today &g ...
- Linux Shell逻辑运算符和表达式详解
Shell 逻辑运算符涉及以下几种类型,只要适当选择,可以解决我们很多复杂的判断,达到事半功倍效果. 一.逻辑判断1.关于文件与目录的逻辑判断-f 常用.判断『文件』是否为普通文件,比如: if [ ...
- 在线服装零售商Betabrand获得650万美元风投 - 投资风向 - 创业邦
在线服装零售商Betabrand获得650万美元风投 - 投资风向 - 创业邦 在线服装零售商Betabrand获得650万美元风投
- c语言const
const关键字 const和指针结合,共有4种形式 const int *p; p是一个指针,指针指向一个int型数据.p所指向的是个常量. int const *p; p是一个指针,指针指向一个i ...
- Struts分页
1.分页的bean类PaginationSupport.java 2.写好后直接在action里面调用,计算当前页显示的数据 3.写一个公用的jsp页面,直接在需要分页的页面include就可以了 ...