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;
}

输出结果:
image

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(); 
}

输出结果:
image

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中的子类初始化时初值不为空。调用顺序为先调用父类参构造函数,然后调用子类有参构造函数。
image
输出
image
先调用父类再调用子类

image
输出
image
调用父类无参 子类带参

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

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

image

调用函数问题

定义一个父类
image
定义子类为
image

执行命令
image
输出:
image
静态方法(随着类的加载而加载)
非静态方法和构造函数随着对象
静态>非静态>构造
同为静态加载顺序按先后,静态方法调用才执行

只执行
image
输出结果
image
先加载父类的静态 然后加载本身静态

目录
相关文章
|
6天前
|
Java Android开发 C++
Java和C++
Java和C++
24 15
|
17天前
|
编译器 C++ 开发者
【C++】继承
C++中的继承是面向对象编程的核心特性之一,允许派生类继承基类的属性和方法,实现代码复用和类的层次结构。继承有三种类型:公有、私有和受保护继承,每种类型决定了派生类如何访问基类成员。此外,继承还涉及构造函数、析构函数、拷贝构造函数和赋值运算符的调用规则,以及解决多继承带来的二义性和数据冗余问题的虚拟继承。在设计类时,应谨慎选择继承和组合,以降低耦合度并提高代码的可维护性。
28 1
【C++】继承
|
21天前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
54 5
|
18天前
|
Java
在Java中,接口之间可以继承吗?
接口继承是一种重要的机制,它允许一个接口从另一个或多个接口继承方法和常量。
55 1
|
27天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
56 4
WK
|
1月前
|
安全 Java 编译器
C++和Java哪个更好用
C++和Java各具优势,选择取决于项目需求、开发者偏好及目标平台特性。C++性能出色,适合游戏、实时系统等;Java平台独立性强,适合跨平台、安全敏感应用。C++提供硬件访问和灵活编程范式,Java有自动内存管理和丰富库支持。两者各有千秋,需根据具体需求选择。
WK
20 1
|
2月前
|
IDE Java 程序员
C++ 程序员的 Java 指南
一个 C++ 程序员自己总结的 Java 学习中应该注意的点。
24 5
|
2月前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
23 3
|
2月前
|
Java
在Java多线程编程中,实现Runnable接口通常优于继承Thread类
【10月更文挑战第20天】在Java多线程编程中,实现Runnable接口通常优于继承Thread类。原因包括:1) Java只支持单继承,实现接口不受此限制;2) Runnable接口便于代码复用和线程池管理;3) 分离任务与线程,提高灵活性。因此,实现Runnable接口是更佳选择。
41 2
|
2月前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
34 2