文档章节

Java中的构造函数调用顺序

关西大汉弹琵琶
 关西大汉弹琵琶
发布于 2015/05/28 15:40
字数 518
阅读 37
收藏 0

关于Java中的构造函数:

同C++一样,Java的构造函数也是先基类构造函数再派生类构造函数的调用顺序。

同C++不同,=的赋值并不会引起copy构造函数的调用,而是必须通过class InstanceA = new class(InstanceB)的形式。

Java并没有初始化列表一类的东西,但是有初始化块,其定义为一个代码块,如果为非static,则在构造对象时执行一次。如果为static,则在类加载时执行一次。

通过this重载构造函数,则其必须为第一条语句。

以下是一个例子:

package LearnJava;

/**
 * Created by Jimmy on 2015/5/28.
 */

class Foo{
    public Foo(){
        System.out.println("Foo constructor without arg.");
    }
    public Foo(Foo f){
        System.out.println("Foo copy constructor.");
    }
}

class Bar{
    public Bar(){
        System.out.println("Bar constructor without arg.");
    }
    public Bar(Bar b){
        System.out.println("Bar copy constructor.");
    }
}

class Base{
    public Base(){
        System.out.println("Base constructor without arg.");
    }
    {
        System.out.println("Just a block in class B");
    }
}

class Derived extends Base{
    public Derived(){
        System.out.println("Derived constructor without arg.");
    }
    public Derived(Foo ff, Bar bb){
        System.out.println("Derived constructor(Foo ff, Bar bb) without arg.");
        m_foo = new Foo(ff);
        m_bar = new Bar(bb);
    }
    public Derived(Bar bb, Foo ff){
        //通过this重载构造函数,则其必须为第一条语句
        this(ff, bb);
        System.out.println("Derived constructor(Bar bb, Foo ff) without arg.");
    }
    {
        System.out.println("Just a block in class Derived");
    }
    private Foo m_foo;
    private Bar m_bar;
}

public class InitilizeAndCallSequence {
    public static void main(String[] args){
        Foo foo = new Foo();
        Bar bar = new Bar();

        System.out.println("##### test start #####");
        System.out.println("test case 1:");
        Derived derived_1 = new Derived();

        System.out.println("test case 2:");
        Derived derived_2 = new Derived(foo, bar);

        System.out.println("test case 3:");
        Derived derived_3 = new Derived(bar, foo);
        System.out.println("##### test end #####");
    }
}

执行结果是:

Foo constructor without arg.
Bar constructor without arg.
##### test start #####
test case 1:
Just a block in class B
Base constructor without arg.
Just a block in class Derived
Derived constructor without arg.
test case 2:
Just a block in class B
Base constructor without arg.
Just a block in class Derived
Derived constructor(Foo ff, Bar bb) without arg.
Foo copy constructor.
Bar copy constructor.
test case 3:
Just a block in class B
Base constructor without arg.
Just a block in class Derived
Derived constructor(Foo ff, Bar bb) without arg.
Foo copy constructor.
Bar copy constructor.
Derived constructor(Bar bb, Foo ff) without arg.
##### test end #####

打印信息:

1, test case1, 默认构造函数

2,test case2, 带参数构造函数

3, test case3, 重载带参数构造函数


© 著作权归作者所有

关西大汉弹琵琶
粉丝 8
博文 41
码字总数 14221
作品 0
浦东
程序员
私信 提问
JAVA & .NET创建对象构造函数调用顺序

JAVA & .NET创建对象构造函数调用顺序 JAVA 定义Person类 定义Chinese类 创建Chinese类实例 输出结果如下: 执行顺序为: 基类静态初始化块——当前类静态初始化块——基类初始化块——基类构...

雪飞鸿
02/24
0
0
构造函数、构造代码块、this关键字

构造函数、构造代码块、this关键字 一、构造函数 1.构造函数的作用 给对应的对象进行初始化。 2.构造函数的定义格式 3.构造函数要注意的细节 构造函数是没有返回值类型的。 构造函数的函数名...

JS_HCX
2018/12/07
0
0
Java的初始化机制、垃圾回收机制和内存分配机制

刚才在网上看到一篇关于java初始化、垃圾回收机制和内存分配机制的文章,感觉不错,就拿来转发了,以后有空可以再看看,应该会有新的认识和新的收获。 文章: 2.1初始化顺序: [java]view p...

java_T
2013/03/17
430
0
Java 面向对象编程之构造方法、构造代码块(1)

Java 面向对象编程之构造方法、构造代码块 面向对象编程是我们认识世界,创造事物的一种新的思维,其实就抓大放小,将所有共性的事物进行封装的过程。编程人员在进行流程作业时,可以方便的进...

hellation_
04/22
9
0
Java构造时成员初始化的陷阱(Java中的声明和初始化不是一个原子操作)

class Base { Base() { System.out.println("1"); preProcess(); } void preProcess() { System.out.println("2"); } } public class Test extends Base { public String whenAmISet = "set ......

longeremmy
2013/09/22
310
1

没有更多内容

加载失败,请刷新页面

加载更多

移动开发中的 Web:WebView、WebKit、JSCore、Web 优化、热修复、跨平台、Native、Hybrid……

移动开发领域近年来已经逐渐告别了野蛮生长的时期,进入了相对成熟的时代。而一直以来 Native 和 Web 的争论从未停止,通过开发者孜孜不倦的努力,Web 的效率和 Native 的体验也一直在寻求着...

编辑部的故事
22分钟前
12
0
MySQL8.0.17 - Multi-Valued Indexes 简述

本文主要简单介绍下8.0.17新引入的功能multi-valued index, 顾名思义,索引上对于同一个Primary key, 可以建立多个二级索引项,实际上已经对array类型的基础功能做了支持 (感觉官方未来一定...

阿里云官方博客
今天
11
0
make4.1降级 make-3.81、2错误

在编译 make-3.82 的时候出现如下错误提示 glob/glob.c:xxx: undefined reference to `__alloca'` 修改 /glob/glob.c // #if !defined __alloca && !defined __GNU_LIBRARY__ # ifdef __GNUC......

Domineering
今天
18
0
Rainbond集群的安装和运维的原理

本文将解读Rainbond集群的安装和运维的原理,使用户基本了解Rainbond的安装机制和运维重点,便于用户搭建大型Rainbond集群。 1.Rainbond集群节点概述 1.1 节点分类 属性 类型 说明 manage 管...

好雨云帮
今天
11
0
好程序员大数据学习路线分享UDF函数

1.为什么需要UDF? 1)、因为内部函数没法满足需求。 2)、hive它本身就是一个灵活框架,允许用自定义模块功能,如可以自定义UDF、serde、输入输出等。 2.UDF是什么? UDF:user difine fun...

好程序员官方
今天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部