`
haofeng82
  • 浏览: 144521 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

JAVA 继承 构造函数的执行顺序

阅读更多

最近看JAVA的继承关系中构造函数的执行顺序,有点晕,写了几个类验证一下,原代码如下:


package com.hf.scjp.constructor;

public class Parent1 {
public static StaticTest stat=new StaticTest(1L);
static {

System.out.println("in parent1 static code …… ");
}
public Parent1(){
System.out.println("in parent1 constructor …… ");

}
}

package com.hf.scjp.constructor;

public class Son1 extends Parent1 {
public static StaticTest stat=new StaticTest(1);
static {

System.out.println("in Son1 static code …… ");
}
public Son1(){
System.out.println("in Son1 constructor …… ");

}
public Son1(int s){
System.out.println("in Son1 constructor with param: int");

}

}


package com.hf.scjp.constructor;

public class GrandChild1 extends Son1{
public static StaticTest stat=new StaticTest();
static {

System.out.println("in GrandChild1 static code …… ");
}
public GrandChild1(){
System.out.println("in GrandChild1 constructor …… ");

}
public GrandChild1(String s){
System.out.println("in GrandChild1 constructor with param: String");

}
public GrandChild1(int s){
super(s);

System.out.println("in GrandChild1 constructor with param: int");

}
public GrandChild1(long s){
this((int)s);

System.out.println("in GrandChild1 constructor with param: long");

}
public static void main(String[] args){
GrandChild1 GrandChild1=new GrandChild1("");
System.out.println("\n\r");

GrandChild1 GrandChild2=new GrandChild1(3);

System.out.println("\n\r");
GrandChild1 GrandChild3=new GrandChild1(3L);
}
}

public class StaticTest {
public StaticTest(){
System.out.println("in StaticTest constructor param: ");

}
public StaticTest(int i){
System.out.println("in StaticTest constructor param:int ");

}
public StaticTest(long l){
System.out.println("in StaticTest constructor param:long ");

}
/**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成方法存根

}

}

//这是一个三个类之间的继承关系继承:在孙子类中定义了main并创建三个孙子类对象,分别调用不同的构造函数,执行结果如下:
in StaticTest constructor param:long
in parent1 static code ……
in StaticTest constructor param:int
in Son1 static code ……
in StaticTest constructor param:
in GrandChild1 static code ……
in parent1 constructor ……
in Son1 constructor ……
in GrandChild1 constructor with param: String

in parent1 constructor ……
in Son1 constructor with param: int
in GrandChild1 constructor with param: int

in parent1 constructor ……
in Son1 constructor with param: int
in GrandChild1 constructor with param: int
in GrandChild1 constructor with param: long


这说明:
1 类中的静态对象先于static{}执行
2 static{}中的代码是在构建类对象之前执行的
3 构造子类的时候是按照先父后子的顺序执行的
4 如果在子的构造函数中并没有使用显式的调用父类的构造函数(使用super),则执行无参构造函数。
5 如果使用this(),则会先调用this(),再调用下面的代码(此时父类别的默认构造函数不再执行,而会根据执行this()执行相应的父构造函数)
说的自己都晕了,还是看代码来的简单容易

分享到:
评论

相关推荐

    构造函数与静态块的执行顺序

    在探讨继承中子类与父类构造函数及静态块的执行顺序时,我们首先需要理解构造函数和静态块的基本概念及其在Java中的作用。构造函数主要用于初始化对象的状态,而静态块则是在类加载到内存中时执行的一段代码,通常...

    Java构造函数的继承问题[收集].pdf

    - 在创建子类对象时,首先调用父类的默认构造函数,然后执行子类自己的构造函数。 - 这可以通过观察构造函数的输出顺序来验证,例如,在上述例子中,"base constructor"总是先于"derived constructor"打印出来。 ...

    构造函数继承.关于java

    2. **构造函数调用顺序**:在子类构造函数中,必须先调用父类的构造函数(使用`super`),然后再执行子类构造函数中的其他代码。 3. **构造函数的可访问性**:子类只能访问具有相同或更宽松访问级别的父类构造函数。...

    构造函数的继承问题 笔记

    在Java中,构造函数可以被重载以提供不同的初始化方式,但它们不能被继承。这意味着,当一个类继承自另一个类时,子类不会自动继承父类的构造函数。为了确保子类能够正确地初始化其父类部分,需要特别注意构造函数的...

    聚合中类的构造函数调用顺序

    1. **基类构造器的调用**:如果类A继承自类B,那么在类A的构造函数执行之前,会先调用类B的构造函数。这是为了确保基类的部分先得到初始化。 2. **成员变量构造器的调用**:接着,按照声明的顺序,类A中每个成员...

    Java类的完整构造执行顺序

    在深入探讨Java类的完整构造执行顺序之前,我们先来明确一下Java中构造函数与类初始化的基本概念。构造函数在创建对象时被调用,用于初始化该对象的状态。而类初始化则是指在类首次被使用时,JVM执行的一系列初始化...

    java kok 构造与析构函数

    总的来说,理解和掌握构造函数、析构函数(以及在Java中的`finalize()`方法)、函数的重载、类的继承以及函数覆盖,对于提升Java编程能力至关重要。同时,设计模式的运用可以提高代码的可维护性和可扩展性,使得大型...

    构造函数借鉴.pdf

    7. 初始化顺序:在创建子类对象时,初始化顺序是:先调用父类的构造函数(如果存在多个构造函数,需通过`super`指定),然后执行子类的构造函数。在实例化过程中,会先打印父类的构造函数输出,再打印子类的构造函数...

    14_构造函数 视频

    3. **构造函数重载**:一个类可以有多个构造函数,只要它们的参数列表不同(参数个数、类型或顺序),这就是构造函数的重载。这样可以根据需要提供多种初始化方式。 4. **构造函数的调用**:当使用`new`关键字创建...

    Java继承习题

    ### Java继承习题知识点解析 #### 一、基础概念与选择题分析 1. **final修饰的方法** - **题目**: 若在某一个类定义中定义有如下的方法:`final void workDial()`该方法属于 - A. 本地方法 - B. 最终方法 - C....

    java Person,Student,GoodStudent 三个类的继承、构造函数的执行

    总结一下,Java中的继承允许子类继承父类的构造函数。如果子类没有显式调用父类构造函数,那么会默认调用父类的无参构造函数。如果父类的构造函数有参数,可以通过`super`关键字在子类构造函数的第一行指定调用哪个...

    JAVA继承_接口_抽象类等练习.doc

    构造函数的执行顺序 **概念:** 当子类创建对象时,会首先执行父类的构造函数,然后再执行子类的构造函数。这是为了确保父类的初始化逻辑能够先于子类执行。 **选择题示例:** 第13题中,正确答案是A选项:“Father...

    再次详细说明在继承中的程序执行顺序,子类与父类到底哪个先执行

    当一个类实例化时,其构造函数(在Java中是`构造器`,在Python中是`__init__`方法)会被调用。在涉及继承的情况下,这个过程遵循一定的规则。 1. **初始化父类**: - 在子类创建实例时,首先会执行父类的构造函数...

    Java 接口与继承

    5. 创建子类对象时,会按照一定的顺序进行初始化:首先是默认初始化,然后绑定构造方法参数,接着调用父类构造函数,最后执行实例变量的显性初始化和构造方法的主体代码。 接口在Java中是一种完全抽象的类,它只...

    关于java中构造函数的一些知识详解

    在多层继承中,构造函数的调用顺序遵循“从基类到派生类”的原则,即首先调用最远祖先类的构造函数,然后逐级调用中间类的构造函数,最后调用当前类的构造函数。 下面是一个示例,演示了如何通过 `super` 关键字...

    类继承的初始化顺序类,继承的初始化顺序

    本文详细介绍了类继承中的初始化顺序问题,包括初始化的基本概念、初始化过程中的关键步骤以及如何正确处理基类和子类之间的构造函数调用。理解这些概念对于编写高效、可维护的面向对象程序至关重要。希望通过对这些...

    Java 重载、重写、构造函数的实例详解

    Java中的重载(Overloading)、重写(Overriding)和构造函数是面向对象编程中的核心概念,它们在实现代码的灵活性和可扩展性方面起着至关重要的作用。 首先,让我们了解一下重载。重载指的是在同一个类中,可以有多个...

    java代码的初始化顺序demo

    总之,Java代码的初始化顺序是类加载的必然过程,涉及到静态和实例初始化块、构造函数、成员变量初始化以及继承关系的影响。这个demo是学习和理解这些概念的重要工具,通过实际操作可以加深对Java内存管理和对象生命...

    java中静态代码块与构造方法的执行顺序判断

    在Java编程语言中,了解静态代码块和构造方法的执行顺序是至关重要的,尤其是在处理类的初始化和对象的创建时。下面将详细解释这些概念及其执行逻辑。 首先,静态代码块(也称为静态初始化器)是由`static`关键字...

Global site tag (gtag.js) - Google Analytics