java派生类 构造函数_C++和Java的继承——构造函数问题

C++

【1】声明子类变量 B b;

a.如果子类没有显示调用父类含参数的构造函数,那么在子类实例化过程中,

---顺序: 父类无参(默认)构造函数-->子类被调用的构造函数。

b.如果子类显示调用了父类的含参构造函数,那么在子类实例化过程中,

---顺序: 父类有参构造函数-->子类被调用的构造函数。

实例:

class A {

public:

A() { printf("A(void) \n"); }//父类 默认构造函数

A(int d) { printf("A %d\n", d); }//父类 有参构造函数

~A() { printf(" ~A \n"); }//父类 析构函数

};

class B : public A

{

public:

B(){

printf("B(void) \n");//子类 默认构造函数

}

B(int x) : A(x)

{

printf("B \n"); //子类 有参构造函数

}

~B() { printf("~B \n"); } //子类 析构函数

};

int main(int argc, char* argv[])

{

B c;

B b(8); // 此处也自动调用了A的同签名的构造函数

return 0;

}

输出结果:

051bfc5f3c06b6b94634ad9885d6934b.png

B c;//创建c这个实例的时候 先调用A() 然后B()

B b(8);//先调用A(int x) 然后B(int x)

销毁的时候 后入先销毁

实例:

class A

{

public:

virtual void foo()

{

cout << "A's foo()" << endl;

bar();

}

virtual void bar()

{

cout << "A's bar()" << endl;

}

};

class B: public A

{

public:

void foo()

{

cout << "B's foo()" << endl;

A::foo();

}

void bar()

{

cout << "B's bar()" << endl;

}

};

int main()

{

B bobj;

A *aptr = &bobj;

aptr->foo();

A aobj = *aptr; //转化为A类对象

aobj.foo();

}

输出结果:

44f67cd6381c690ac993bb96878e9cca.png

B bobj;

A *aptr = &bobj;

aptr->foo(); //输出B's foo() A's foo() B's bar()

//因为aptr指向的是B类对象 先调用B类foo()

//而A::foo() 调用A类foo()和foo()中的bar()

A aobj = *aptr; //转化为A类对象

aobj.foo();//都是A类方法

//

Java

【1】父类和子类同时都有有参的构造函数和无参构造函数

Java中的子类初始化时初值为空。调用顺序为先调用父类无参构造函数,然后调用子类无参构造函数。

java中的子类初始化时初值不为空。调用顺序为先调用父类无参构造函数,然后调用子类有参构造函数。

081a78ddc387db428e1b34ff0bdefa4d.png

输出

b8601bfc87cbd73551ad3a2180dae301.png

先调用父类再调用子类

fb9164930dc4d271d7233a8ed98613fc.png

输出

19d7b5ceff64e3a999753de64cffa2e2.png

调用父类无参 子类带参

【2】父类和子类无无参构造函数只有有参构造函数

java中的子类初始化时初值不为空。调用顺序为先调用父类有参构造函数(必须在子类有参构造函数中加显示super),然后调用子类有参构造函数。

61ee6c3e66a001d25539384dd49d8ff8.png

输出结果

155170b1eb0888ff74c373eaeadb0f96.png

调用函数问题

定义一个父类

102d3b3a52caf05b433503df42de10c7.png

定义子类为

d247e47bf0ba8bd631dda5d0a0138292.png

执行命令

4a5203843df2480de035db9df4e99657.png

输出:

95975998704e6d829b613505fc6a250c.png

静态方法(随着类的加载而加载)

非静态方法和构造函数随着对象

静态>非静态>构造

同为静态加载顺序按先后,静态方法调用才执行

只执行

11753be1efc86ee91728f612cf8080e0.png

输出结果

a4dec6e8de0c9e28b22d82f0d253d04f.png

先加载父类的静态 然后加载本身静态

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值