`

父类构造多态调用的陷阱

    博客分类:
  • 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
分享到:
评论

相关推荐

    C#中CLR虚方法的多态调用

    C#中CLR虚方法的多态调用C#中CLR虚方法的多态调用C#中CLR虚方法的多态调用C#中CLR虚方法的多态调用C#中CLR虚方法的多态调用

    Java多态调用唯一性确定.pdf

    Java多态调用唯一性确定.pdf

    Java基础精品课11-多态录屏5.多态调用演示.mp4

    Java基础精品课11-多态录屏5.多态调用演示.mp4

    任务二:编写主题类、回复类,实现多态

    需要完成的任务 ...(1)主题类继承帖子类,并增加属性:主题id、版块id ...(3)帖子类的getInfo ()方法实现多态 (4)使用super关键值调用父类构造方法 2.技能训练 ...(3)会使用super关键字调用父类构造方法

    用API编写的俄罗斯方块

    一个简单的俄罗斯方块游戏,用API编写,没有使用二维表

    C++虚函数与多态性

    C++多态性是通过虚函数来实现的,虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖(override),或者称为重写。而重载则是允许有多个同名的函数,而这些函数的参数列表不同,允许参数个数不同,...

    使用抽象方法实现多态

    使用抽象方法实现多态使用抽象方法实现多态

    大连理工大学Java小学期华为云作业答案

    大连理工大学Java小学期华为云作业答案(前七章) 7.2_3 对输入的字符进行打印 ...利用多态性质,父类调用子类方法,定义一个移动卡、联通卡,手机类继承父类。实现动态调用,对输入手机号打印输出结果。

    C++mfc俄罗斯方块的实现

    这个是代码, 由于整个工程太大 放不了, 所以只放了代码部分, 不需要的就没放

    C++构造和析构的多态

    C++的多态是通过虚表指针来实现的。但是在构造和析构函数中调用虚函数,情况如何呢?是否还能实现多态呢?本文档从内存角度揭示了这其中的多态实现过程。

    《java面向对象程序设计-继承和多态》教案.doc

    super () 方法始终指向调用类的父类 调用父类构造方法 演示:示例 3 多态性 2-1 多态性是指¡°多种形式¡± 它使用不同的实例而执行不同操作 多态包括方法重写和方法重载 多态性 2-2 方法重载 2-1 方法重载 2-2 ...

    多态示例代码

    应用场合,类型转换,instanceof运算符,使用父类作为方法形参实现多态,使用父类作为返回值实现多态

    Java面向对象总结

    调用子类的构造方法时,会先调用父类的构造方法。默认隐式调用父类无参数的构造方法 4.如果要在子类的构造方法中显式调用父类的构造方法。使用super(参数列表),但是这行代码必须是在 子类的构造方法的第一行。

    Python语言基础:多态的简单实现.pptx

    在Python中,多态是一种使用对象的方式,子类重写父类的方法,调用不同的子类对象相同的父类方法可以产生不同的执行结果。 多态的优点 调用灵活,有了多态更容易写出通用的代码,以便适应需求的不断变化实现步骤。 在...

    C++ 多态 虚表 分析 图解 .doc

    C++ 中的虚函数的作用主要是实现了多态的机制...关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技 术可以让父类的指针有“多种形态”,这是一种泛型技术。

    C#多态测试C#多态测试C#多态测试

    C#多态测试C#多态测试C#多态测试C#多态测试C#多态测试

    Java面向对象程序设计-父类作为返回值实现多态.pptx

    农业信息系统开发

    java的编译时多态和运行时多态

    java的编译时多态和运行时多态,保证一看就会

    C#程序设计 之 俄罗斯方块

    C#程序设计 之 俄罗斯方块 很精彩的讲解

    对C# 多态的理解

    其实呢,多态非常简单,就一句话:调用同一种方法产生了不同的结果。 具体实现方式有三种。 一、重载 重载很简单。 public string GetValue(string x) { return x; } public string GetValue(string x, string y)...

Global site tag (gtag.js) - Google Analytics