首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么我新的子类实例和使用a()的函数,a()会运行b()的子类的函数?

这个问题涉及到面向对象编程中的继承和多态的概念。在面向对象编程中,继承是一种机制,允许一个类(称为子类)继承另一个类(称为父类)的属性和方法。当创建一个子类的实例时,该实例会继承父类的属性和方法。

在这个问题中,当你创建一个新的子类实例并调用函数a()时,a()会运行b()的子类的函数,这是因为子类继承了父类的方法,并且可以重写这些方法。当子类重写了父类的方法时,在调用该方法时,会优先执行子类中的方法。

这种行为称为多态,它允许不同的子类对象对相同的方法做出不同的响应。这样可以实现代码的灵活性和可扩展性,使得程序可以根据不同的对象类型执行不同的操作。

在云计算领域中,继承和多态的概念通常用于设计和实现各种云服务和功能。通过继承和多态,可以实现不同类型的云服务,如存储服务、计算服务、网络服务等,并且可以根据具体的需求和场景来定制和扩展这些服务。

腾讯云提供了丰富的云计算产品和服务,包括云服务器、云数据库、云存储、人工智能、物联网等。具体推荐的产品和产品介绍链接地址可以根据具体的需求和场景来选择,可以参考腾讯云官方网站的相关文档和产品介绍页面。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

创建子类对象时,父类构造函数中调用被子类重写方法为什么调用子类方法?

B(); } } 问题:为什么创建A对象时候父类会调用子类方法?...但是:创建B对象父类会调用父类方法? 答案: 当子类被加载到内存方法区后,继续加载父类到内存中。...如果,子类重写了父类方法,子类方法引用会指向子类方法,否则子类方法引用会指向父类方法引用。 如果子类重载了父类方法,则子类重载方法引用还指向子类方法。...如果子类方法没有重写也没有重载父类方法,则方法引用会指向父类方法。 当子类对象创建时,先行调用父类构造方法(构造方法也是方法),虚拟机会在子类方法区寻找该方法并运行。...B(); } } 看一下上边代码,是不是恍然大悟?

6.2K10
  • Java中子类父类构造函数

    参考链接: Java中继承构造函数 这篇文章总结了关于Java构造常见​​问题。  1)为什么创建一个子类对象要也需要调用父类构造函数? ...如果没有,编译器插入调用父类构造语句。这就是为什么在创建子类对象时父类中构造超函数会被调用。  这里没有创建两个对象,只有一个子对象。...这是上边Super类发生情况。  子类构造函数,无论有参构造还是无参构造,将会调用父类中默认无参构造函数。...3)子类显式调用父类构造函数  下面的代码是正常:    子类(Sub)构造函数显式地调用父类(Super)中带参构造参数。如果父类中定义了相对应构造函数,那将会被正常良好调用。  ...4)规则 简而言之,规则是:子类构造函数必须调用父类中构造函数,无论隐式调用还是显式调用,无论哪种方式,被调用构造函数必须得先被定义。

    2.2K20

    子类A继承父类B, A a = new A(); 则父类B构造函数、父类B静态代码块、父类B非静态代码块、子类A构造函数子类A静态代码块、子类A非静态代码块 执行先后顺序是?

    (1)子类A继承父类B, A a = new A(); 则: 父类B静态代码块->子类A静态代码块->父类B非静态代码块->父类B构造函数->子类A非静态代码块->子类A构造函数 (2)若子类构造函数中显式调用了父类某构造函数...String s) { System.out.print(s); } } class Test extends A { Test() { super("B"...(); } } CBB 首先new了一个子类对象,那么就要调用构造方法来初始化该子类对象,但是该类继承自A,所以要先调用父类构造方法,这里通过super(“B”)显示调用了父类带参构造...执行父类带参构造前要先对父类中对象进行初始化,对父类中c成员进行初始化,调用了C类无参构造,所以调用顺序为: 先调用C类无参构造 再调用A类带参构造 最后调用调用子类构造 (3...顺序为:父类静态变量, 父类静态代码块 ,子类静态变量,子类静态代码块。

    2.1K30

    父类返回子类类型函数写法

    不过由于我们这个 Event 类型比较多,因此希望写一个父类,来一个子类感受下: class DisposableEventBuilder : EventBuilder() { private....build() 我们调用完父类 retryLimit 方法后,想要设置下 delay,结果发现没有这个方法。 “ X,这什么玩意儿”,你嘟囔了一句。 因为返回是父类,所以链式调用掉链子了。...return this as T } abstract fun build(): PollingEvent } 这个泛型给父类加了一个泛型参数,这个参数则必须是当前类子类...子类改动就很简单了,只需要给父类加一个泛型参数为自己类型即可: class DisposableEventBuilder : EventBuilder....build() 这一点上 Kotlin Java 其实是一致,所以你也可以用 Java 写出类似的代码: abstract class SuperBuilder<T extends SuperBuilder

    4.8K10

    构造函数调用子类方法,写过吗?

    为什么Base构造函数与虚构函数即使调用虚函数,也是调自己函数呢?这跟构造函数与虚构函数调用顺序有关。子类对象构造时候,先调父类构造函数初始化父类,再调子类构造函数初始化子类。...子类对象虚构时候,恰恰相反,先调子类对象虚构函数,再调父类虚构函数。输出结果也证明了这点。 所以如果父类构造函数与虚构函数是调用子类函数,那就非常危险了。...因为父类构造函数执行时,子类构造函数还没有执行,说明子类还没有初始化,而这时就调用子类方法,很容易出错,甚至崩溃。...父类虚构函数执行时候,子类虚构函数已经执行完毕,说明子类资源已经被释放,而这时继续执行子类方法,也很容易崩溃。于是,C++规范为此作了此约束。...如果真的很想在构造函数内调用子类方法进行初始化,还是显示提供一个初始化函数,让子类对象实例化完后,显示调用初始化函数

    1.4K20

    (十七)AtomicInteger原子类介绍使用

    多线程系列目录: (一)线程是什么 (二)Java线程与系统线程生命周期 (三)Java线程创建方式 (四)为什么使用线程池 (五)四种线程池底层详解 (六)ThreadPoolExecutor自定义线程池...)ThreadLocal用法,如何解决内存泄漏 (十六)ReentrantLock可重入锁使用介绍 (十七)AtomicInteger原子类介绍使用 ---- 在第十四章(十四)volatile...但是并没有展开讲它详细用法,因为内容多,所以这一章节就来学习一下原子操作类——AtomicInteger AtomicInteger是对int类型一个封装,提供原子性访问更新操作,其原子性操作实现是基于...原子类一览图参考如下: ? 上面例子用到是AtomicInteger,还有其他场景数据要求也可以使用合适子类。...而LongAdder中每个线程维护自己一个计数器,在最后执行LongAdder.sum()方法时候才需要同步,把所有计数器全部加起来,不需要flushrefresh操作。

    86240

    【Kotlin】Kotlin 类继承 一 ( 类继承基本方式 | final 关键字 | 子类主构造函数 | 子类次构造函数 )

    类继承格式 : 使用 " : " 继承父类 ; 如果该父类有主构造函数 , 那么子类必须至少有一个主构造函数或次构造函数 , 子类构造函数下面会根据不同情况详细解析 ; //注意这里父类构造函数需要实际调用...类继承限制 : 子类使用 : 父类 ( 父类构造函数参数列表 ) ① 类继承限制 : 只有被 open 修饰类 , 才能有子类继承该类 , 普通类不允许被继承 ; ② 类方法被重写限制 : 只有被...open 修饰方法 , 才能被子类重写 , 被重写子类函数 , 必须使用 override 修饰 ; ③ open 修饰类限制 : open 关键字不能修饰 final 类 , 给 final 类添加...父类没有主构造函数 ---- 1 . 父类没有主构造函数 : 准确说是 , 父类主构造函数没有参数 , 省略了 constructor 关键字括号 () ; 2 ....省略 constructor () 代码示例 : 下面的两个类是等价 , 只是第一个是类定义标准形式 , 第二个省略了 constructor 关键字括号 ; open class Father

    1.3K10

    刚发现:虚函数可以突破子类private限制

    刚发现:虚函数可以突破子类private限制 先上代码: class Base { public://这里公共  virtual void myprint()=0;//{ //   cout...<<“I’m Sonn”;  }; }; void main() {  Base *pBase = new Son;  pBase->myprint();//打印“I’m Son”,成功访问到了子类私有函数...} 纯虚函数java语言中接口定义很相近,最近也学习以及复习这方面的知识, 刚写base类时,没有写public关键字,结果可想而知是通不过,默认base类里所有变量成员函数都是private...于是,发现,原来基类里公共函数在多态时要根据基类访问权限来调用。...Son原意是不想让别人访问myprint函数,但现在通过一个基类指针就可以访问到myprint函数认为这多少破坏了类封装性啊。

    35730

    【C++】多态 ⑥ ( 函数重定义涉及问题 - 子类覆盖父类函数名 )

    , 子类 覆盖 父类 函数名称 ; 执行 Child c; c.fun(1, 2, 3); 代码 , 尝试调用 父类 3 个参数 fun 函数 , 出现错误 , 报错 : error...: 函数重定义 带来问题 , 子类覆盖父类函数名 ; 函数重定义函数名称覆盖问题 : C++ 编译器 发现 Child c 对象要调用 void fun(int a, int b, int c) 函数..., 子类中已经存在 fun 函数了 , 子类 覆盖 父类函数名 , C++ 编译器只会在 子类查找 该函数 , 不会去父类 查找 ; 子类查找函数 : C++ 编译器 在 子类中找到了 void...fun(int a, int b) void fun(int a) 两个函数 , 没有找到 3 个参数函数 , 此时 C++ 编译器会报错 : error C2661: “Child::fun”...: 没有重载函数接受 3 个参数 ; 4、正确调用函数方法 在这种情况下 , 由于子类 重定义了部分 父类重载函数 , 导致 父类 函数名被覆盖 , 此时需要使用 域操作符 访问父类 被覆盖函数

    18020

    Atomic包下原子类使用,以及内部CAS实现原理

    先对比一下没有使用引发状况: [image] [image] [image] 可以看到没有达到预想效果,并且每次产生结果都不一样,这就是上篇 文章所说到,没有保证原子性,在执行+1操作时被其他线程插队...提供一个方法: [image] expert:期望值,即 期望改变值 update:更改值,即 将期望值更改为什么 这里第一次期望将初始值1更改为2,操作完成后 再次期望将1 更改为2,我们看下执行结果...1.根据传入对象内存偏移量地址 拿取对应位置最新值,为期望值 2.进行写操作,如果过程被其他线程更改,则期望值就会配对不上就会修改失败,继续循环直到成功。...总结一下: 为什么明明可以在 自增方法添加一个Synchronized关键字就可以解决为什么要通过原子类CAS来解决。...Synchronized比较笨重在上方例子,没必要杀鸡用牛刀,刚好也可以借助上方例子说一下CAS,他在使用时会将它修饰代码块给锁住,其他线程不可以访问,大大降低并发。

    1.3K40

    【C++】继承 ⑥ ( 继承中构造函数析构函数 | 类型兼容性原则 | 父类指针 指向 子类对象 | 使用 子类对象 为 父类对象 进行初始化 )

    地方 , 都可以使用 " 公有继承 " 派生类 ( 子类 ) 对象 替代 , 该 派生类 ( 子类 ) 得到了 除 构造函数 析构函数 之外 所有 成员变量 成员方法 ; 功能完整性 :..." 公有继承 " 派生类 ( 子类 ) 本质上 具有 基类 ( 父类 ) 完整功能 , 使用 基类 可以解决问题 , 使用 公有继承派生类 都能解决 ; 特别注意 : " 保护继承 " ..." 私有继承 " 派生类 , 是 不具有 基类 完整功能 , 因为 最终继承 后派生类 , 无法在 类外部调用 父类 公有成员 保护成员 ; 2、类型兼容性原则应用场景 " 类型兼容性原则..." 应用场景 : 直接使用 : 使用 子类对象 作为 父类对象 使用 ; 赋值 : 将 子类对象 赋值给 父类对象 ; 初始化 : 使用 子类对象 为 父类对象 初始化 ; 指针 : 父类指针 指向...// 子类对象 可以调用 父类公有函数 child.funParent(); // 将指向子类对象指针传给接收父类指针函数 // 也是可以 fun_pointer

    28420

    Atomic包中原子类使用,以及内部CAS实现原理

    先对比一下没有使用引发状况: ? ? ?...注:加上volatile也是产生一样结果!因为volatile不能保证原子性。 接下来我们使用AtomicInteger来试一下: ? ? 可以看到,达到了我们预期效果。...**expert:**期望值,即 期望改变值 **update:**更改值,即 将期望值更改为什么 这里第一次期望将初始值1更改为2,操作完成后 再次期望将1 更改为2,我们看下执行结果: ?...总结一下: 为什么明明可以在 自增方法添加一个Synchronized关键字就可以解决为什么要通过原子类CAS来解决。...Synchronized比较笨重在上方例子,没必要杀鸡用牛刀,刚好也可以借助上方例子说一下CAS,他在使用时会将它修饰代码块给锁住,其他线程不可以访问,大大降低并发。

    78740

    使用通配符泛型:完成父子类关系List对象类型匹配

    泛型通配符 使用泛型通配符都可以让一个方法所表示算法逻辑适应多种类型。...Java中具备继承关系类A、B(A extends B)它们集合ListList之间是没有继承关系, 可以使用泛型或通配符来让一个方法支持同时接受ListList。...代码场景 这里分别定义类Animal、DogCat,很显然,DogCat是Animal子类。...通配符实现 使用List这样形参,就可以接收集合项为Animal子类任意List。...泛型参数也可以是多个,而且之间存在关系。 小结 以上通过一个不太实际案例说明了使用泛型通配符来解决List泛型集合之间“匹配”问题。这也是它们主要用途之一。 (本文使用Atom编写)

    2.7K00

    使用通配符泛型:完成父子类关系List对象类型匹配

    泛型通配符 使用泛型通配符都可以让一个方法所表示算法逻辑适应多种类型。...Java中具备继承关系类A、B(A extends B)它们集合ListList之间是没有继承关系, 可以使用泛型或通配符来让一个方法支持同时接受ListList。...代码场景 这里分别定义类Animal、DogCat,很显然,DogCat是Animal子类。...通配符实现 使用List这样形参,就可以接收集合项为Animal子类任意List。...泛型参数也可以是多个,而且之间存在关系。 小结 以上通过一个不太实际案例说明了使用泛型通配符来解决List泛型集合之间“匹配”问题。这也是它们主要用途之一。

    1.6K70

    Pythonin,isid函数代码实例

    ,相同'数值'数据会使用同样内存空间。...可变数据类型不可变数据类型 不可变数据类型: 当该类型变量值发生了改变,它对应内存地址也会发生改变。 可变数据类型 :当该类型变量值发生了改变,它对应内存地址不发生改变。...这里可变不可变,是指内存中值内容(value)是否可以被改变。如果是不可变类型,在操作对象本身时候,必须在内存申请一块内存(因为原内存内容是不可变)。...如果是可变类型,操作对象时候,不需要再在其他地方申请内存,只需要在此对象后面连续申请内存,所以它地址保持不变,但该内存区域大小会变化。...在python中: int,string,float,tuple —— 属于python不可变类型 object、list、set —— 属于python可变类型 使用:可以使用内建函数id()来确认对象地址在两次赋值前后是否发生了变化

    75530

    【C++】多态 ⑩ ( 不建议将所有函数都声明为 virtual 虚函数 | 多态理解层次 | 父类指针子类指针步长 )

    是 根据 指针类型 进行 , 指针 自增 ++ , 指针地址值 增加 指针类型字节大小 ; 指针 步长 是 根据 指针 指向 内存空间 数据类型确定 ; 子类 继承 父类 , 如果 子类...虚函数 , 但是 这样降低 运行效率 , 每次访问 成员函数 时 , 都需要通过 vptr 指针获取 虚函数表 中函数地址 , 显然极大降低效率 ; 如果 调用 非虚函数 , 可以直接通过 对象...这里建议不需要将有 多态 需求函数声明为 虚函数 ; 二、多态理解层次 多态理解层次 : 多态实现效果 : 相同代码调用 , 有不同表现形态 ; 父类指针 可 指向子类对象 , 使用父类指针...; 三、父类指针子类指针步长 指针数据类型 : C++ 中 指针 是 数据类型 一种 , 对 指针 进行 自增 ++ 或 自减 – 操作 , 指针 地址值 是根据 指针类型 改变 ; 指针运算...void fun() { cout << "执行 子类 virtual void fun(int a) 函数" << endl; } int b; }; int main() { Parent

    27850
    领券