`

父类构造多态调用的陷阱

    博客分类:
  • java
SUN 
阅读更多
 class Parent {
  public Parent() {
   callMethod();
  }

  public void callMethod() {
   System.out.println("我是父类里的方法");
  }
 }
 class Child extends Parent{
  int a;
  public Child() {
   /**
    * 这里是我猜想---
    * 编译器编译的时候在这里插入
    * super();
    * 因为super()只是sun用于引用本类的父类一个标志,
    * 其语义应该是类似方法的调用,我们应该知道,在类里,除了static方法外,
    * 其他的方法,编译器在处理的时候都会秘密加入this,this代表当前对象,
    * 从而方法里的方法调用或变量 知道它自己是属于谁的。
    * super属于子类,super()调用的时候是子类中调用父类中的构造,super()可以看做类似方法的东西
    * 编译器会为其传入当前对象this,
    * 因此Parent() {callMethod();},内传入的this是Child的对象
    * 所以多态调用的是Child里的方法,
    * 这样就可以解释清楚为什么打印的时
    * ----我是子类里的方法0------------了
    *
    *由此而引发的问题是不可预料的!!!!!!!!!!!!!!!1
    *你如果在父类构造函数里调用了子类里方法,
    *而且在父类初始化的时候,子类不可能初始化,所以a是显示0
    *可以想象,变量此时会被初始化null或者0之类的,你的程序会因此而非常糟糕,排错也不是那么轻松
    *所以要注意!!!!!!!!!!!!!!!
    *
    *
    *from sunflower 2008-9-28

    */
   a=10;
   
  }
  public void callMethod() {
   System.out.println("我是子类里的方法"+a);
  }
 }
 public class Test {
  public static void main(String[] args) {
   new Child();
  }
 }
1
1
分享到:
评论

相关推荐

    java 多态 经典讲解

    构造方法的调用顺序遵循继承关系,子类构造方法总是首先调用父类构造方法。多态在构造方法中的体现较少,但重要的是理解,尽管构造方法不能被重写,它们可以被子类覆盖以初始化特定状态,从而支持更复杂的构造逻辑。...

    C++面向对象编程的一些总结

    动态多态则依赖于虚函数和纯虚函数,通过基类指针或引用调用派生类的成员函数,实现运行时的多态行为。 深入探索C++对象模型中文版是一本帮助开发者理解C++底层机制的书籍,它涵盖了C++内存管理、对象生命周期、...

    java易犯错误.pdf

    // 调用父类构造函数 System.out.println("Child constructor called"); } } public class Test { public static void main(String[] args) { Child c = new Child(); // 输出 "Parent constructor called" 和...

    V20-Java笔记整理-重要概念和常见陷阱梳理.docx

    - **Super**:引用父类的一个实例,可以调用父类的属性和方法。 **5.3 抽象类与接口** - **抽象类**:不能实例化的类,包含抽象方法和具体方法。 - **接口**:一组抽象方法的集合,不包含具体的实现。 **5.4 方法...

    InsidetheC++ObjectModel

    复制构造和赋值操作是处理对象副本的关键,理解它们的工作原理对于避免常见的陷阱至关重要,如浅拷贝和深拷贝的区别。 C++的运行时类型信息(RTTI)和动态类型检查也是书中的重要部分。RTTI允许我们在运行时查询...

    深度探索 C++ 对象模型

    6. **继承与多态**:子类继承父类,可以获得父类的所有公有和保护成员。动态多态通过虚函数实现,使得指针或引向基类的对象可以调用派生类的重写函数。 7. **虚函数与多态性**:虚函数使得程序能够根据运行时的对象...

    深度探索C++对象模型

    4. **继承与多态**:C++的继承机制使得类之间可以形成层次结构,子类可以扩展或修改父类的功能。多态是面向对象编程的重要特性,通过虚函数和纯虚函数实现。虚函数使得基类指针可以调用派生类的重写函数,实现动态...

    最全的cc++面试试题

    实现多态参数传递通常采用引用或指针,尤其是虚函数调用时。如果不使用这种方式,可能是因为不需要多态性,或者为了防止参数被意外修改。 6. 设计模式是解决常见软件设计问题的通用解决方案,例如工厂模式用于创建...

    小议Java中final关键字使用时的注意点

    - 在初始化过程中,如果父类构造器调用了非`final`方法,可能会导致意外的结果,如例子中的`draw()`方法。在子类的构造器执行之前,子类的实例字段可能尚未初始化,这时调用子类方法可能导致错误行为。 - 为了避免...

    初探JavaScript 面向对象(推荐)

    - **借助构造函数实现继承**:通过在子类中调用父类的构造函数(如`Parent.call(this)`),可以共享父类的属性,但这种方式并不完整,因为没有继承到原型链上的方法。 - **借助原型链实现继承**:通过`Child....

    高质量C、C 编程指南

    3. 继承与多态:继承允许创建新的类(子类)来扩展已存在的类(父类),多态则允许通过基类指针调用派生类的方法,实现灵活的设计。 4. 封装与抽象:封装是将数据和操作数据的方法绑定在一起,而抽象则通过接口...

    《面向对象程序设计》2010期中考试

    继承允许一个类(子类)继承另一个类(父类)的属性和方法,实现代码的复用,并允许子类扩展或覆盖父类的功能。多态则是指同一种操作可以作用于不同的对象,产生不同的效果,增强了程序的灵活性。 在《面向对象程序...

    more effective c++

    多态是C++中一种强大的特性,允许子类重写父类的虚函数,从而实现动态绑定。然而,当涉及到数组时,多态性可能会导致问题。如果数组元素是多态类型,那么析构函数可能不会被正确调用,导致资源泄露。为了避免这种...

    Inside the C++ Object Model

    然而,这也会带来内存占用和构造/析构函数调用的复杂性。 虚函数是C++多态性的关键。每个具有虚函数的类都会有一个虚函数表,其中包含了该类所有虚函数的地址。当通过基类指针调用虚函数时,实际上是通过这个vptr...

    Java编写中容易搞错的一些东西.rar

    向上转型(父类引用指向子类对象)可以调用父类的方法,但无法访问子类特有的属性和方法。在设计类继承结构时,需考虑多态的影响。 以上只是Java编程中的一些常见易错点,实际上还有许多细节需要注意,如字符串的...

    常见C++Bug大围剿.rar

    5. **多态与虚函数**:不当使用多态可能导致错误的函数调用。确保基类的纯虚函数定义正确,子类覆盖父类的方法时遵循多态原则。 6. **异常安全**:编写异常安全的代码是C++中的重要一环。理解异常传播的规则,使用...

    accp5.0 Chapter2

    例如,我们可以定义一个`Drive`接口,让`Car`和`SportsCar`都实现这个接口,然后调用相同的`drive()`方法,但实现方式各不相同。 在上机部分,学习者将有机会实际编写代码,通过创建类和对象,实现封装、继承和多态...

    vc编程系列之Addison Wesley - Inside the C++ Object Model

    6. **动态绑定与虚函数表**:C++的虚函数系统是实现多态的基础,书中深入剖析了虚函数表(vtable)的工作原理,以及如何通过虚函数调用来实现运行时类型识别。 7. **内存管理与异常安全**:了解C++的对象生命周期...

    道法自然 面向对象实践指南7-7

    3. **多态**:多态性是指不同对象对同一消息(方法调用)可以有不同的响应。它增强了程序的灵活性,允许我们设计出更通用的代码,比如抽象类和接口的使用,使得不同的子类可以共享相同的接口,但实现方式各不相同。 ...

Global site tag (gtag.js) - Google Analytics