[Java]构造函数内部多态的行为所引起的灾难
构造函数内部的多态行为所产生的意想不到的结果
一.Java版本
1 package com.company;
2 import static com.brianyi.util.Print.*;
3
4 class Base {
5 void draw() { println("Base draw"); }
6 Base() {
7 draw();
8 }
9 }
10
11 class Derive extends Base{
12 @Override
13 void draw() { println("Derive draw, id = " + id); }
14 private int id = 1;
15 }
16
17 public class Main {
18 public static void main(String[] args)
19 {
20 new Derive();
21 }
22 }

从概念上讲,构造函数的工作实际上是创建对象,由于构造函数的调用时由内到外的,首先会调用Base(),由于派生类Derive重写了draw方法,因此Base()内部会调用派生类Derive的draw(),而实际上Derive的id会为0(这与Java初始化的过程有关)。
Java初始化的实际过程是:
1)在其他任何事物发生之前,将分配给对象的存储空间初始化为二进制0。
2)调用基类构造函数。这个步骤会不断的反复递归下去,首先是这种类层次结构的根类,然后是下一层的派生类(导出类),等等,直到最低层的派生类。
3)按声明顺序调用成员的初始化方法。
4)调用导出类的构造函数的主体。
二.C++版本
1 #include <stdio.h>
2
3 class Base {
4 public:
5 void draw() { printf("Base draw\n"); }
6 Base() {
7 draw();
8 }
9 };
10
11 class Derive:public Base {
12 public:
13 //@Override
14 void draw() { printf("Derive draw, id = %d\n", id); };
15 private:
16 int id = 1;
17 };
18
19 int main()
20 {
21 new Derive();
22 return 0;
23 }

[Java]构造函数内部多态的行为所引起的灾难的更多相关文章
- java 构造函数内部的多态方法 完全剖析
我们先来看一个例子,如果你读过<java编程思想>的话 应该会有印象 package com.test.zj; public class PolyConstructors { public ...
- java构造器内部多态方法
public class TestC { public static void main(String []args) { new Graph(5); }}class Grp{ void draw() ...
- Java基础之多态和泛型浅析
Java基础之多态和泛型浅析 一.前言: 楼主看了许多资料后,算是对多态和泛型有了一些浅显的理解,这里做一简单总结 二.什么是多态? 多态(Polymorphism)按字面的意思就是“多种状态”.在面 ...
- java中实现多态的机制是什么?
多态性是面向对象程序设计代码重用的一个重要机制,我们曾不只一次的提到Java多态性.在Java运行时多态性:继承和接口的实现一文中,我们曾详细介绍了Java实现运行时多态性的动态方法调度:今天我们再次 ...
- Java开发知识之Java的继承多态跟接口*
Java开发知识之Java的继承多态跟接口 一丶继承 1.继承的写法 在Java中继承的 关键字是 extends 代表一个类继承另一个类. 继承的含义以及作用: 继承就是基于某个父类的扩展.制定出来 ...
- Java 继承和多态
Java 继承和多态 Java 继承 继承的概念 继承是java面向对象编程技术的一块基石,因 ...
- Java类的多态机制
Java中将一个方法调用同一个方法主体关联起来被称作绑定. 绑定分为前期绑定和后期绑定.前期绑定是在编译器决定的,而后期绑定是在程序运行时决定的.Java中除了static方法和final方法(pri ...
- 通过实例聊聊Java中的多态
Java中的多态允许父类指针指向子类实例.如:Father obj=new Child(); 那么不禁要发问?? 使用这个父类型的指针访问类的属性或方法时,如果父类和子类都有这个名称的属性或方法,哪 ...
- Java对象和多态
Java对象和多态 (面向对象) 面向对象基础 面向对象程序设计(Object Oriented Programming) 对象基于类创建,类相当于一个模板,对象就是根据模板创建出来的实体(就像做月饼 ...
随机推荐
- Win7.窗口自动滚动回到屏幕
PS:笔记本 ThinkPad E440 1.前提:窗口 的一部分位于在屏幕的外面,此窗口处于激活的状态 操作:鼠标放置在窗口内部,鼠标继续往屏幕外部移动,鼠标没有任何其他事件(只有 MouseMov ...
- meta 标签代码解决IE兼容问题,IE6,IE7,IE8,IE9,IE10(包括360的兼容模式)
最近做了一个项目,客户反映,在360下布局错位,远程调试了一下,发现客户使用的是360的兼容模式,然而我在自己的电脑上测试的时候是正常的(兼容模式也正常):简单研究了一下360的兼容模式,在360的兼 ...
- 问题杂烩(scrollTop/背景透明度动画)
今天给同学找我帮忙写js,是公司里的活..我是不是应该跟他要钱哈哈,不过一顿饭肯定是免不了的了. 言归正传,今天写了三个小东西,因为兼容性的问题,用jq写的(很是别扭的说,但是没办法啊,一边看api一 ...
- Navicate一个有用的注册码
NAVH-WK6A-DMVK-DKW3 百度直接得到,
- Android的五大基本组件
Android的基本组件 1.Activity Activity 是最基本的模块,一般称之为“活动”,在应用程序中一般一个Activity就是一个单独的屏幕.每一个活动都被实现为一个独立的类,并且从活 ...
- ffmpeg用法(心得体会还有你见过的用法)
ffmpeg的常用用法很多,我这里提供的用法有可能有许多地方是你没见过的. 一.ffmpeg合并视频 我经常需要切割再把一些零碎的视频给拼接起来,这样可以省许多磁盘空间.其实用mencoder挺不错的 ...
- 如何实现1080P延迟低于500ms的实时超清直播传输技术
再来当一次技术搬运工,内容来自高可用框架,学霸君工程师袁荣喜的如何实现1080P延迟低于500ms的实时超清直播传输技术. 导语:视频直播是很多技术团队及架构师关注的问题,在实时性方面,大部分直播是准 ...
- bzoj 2823: [AHOI2012]信号塔 最小圆覆盖
题目大意: 给定n个点,求面积最小的园覆盖所有点.其中\(n \leq 10^6\) 题解: 恩... 刚拿到这道题的时候... 什么???最小圆覆盖不是\(O(n^3)\)的随机增量算法吗????? ...
- UITextField常见用法
//实例变量和全局变量的区别 //1.定义位置有区别:全局变量定义在方法的外部,实例变量写在接口文件或者延展中的大括号之内 //2.生命周期:全局变量生命周期和应用程序生命周期相同,实例变量的生命周期 ...
- Log Structured Merge Trees(LSM) 原理
http://www.open-open.com/lib/view/open1424916275249.html