java基础篇 之 构造器内部的多态行为

​ 我们来看下下面这段代码:

public class Main {
public static void main(String[] args) {
new Son(5);
}
} class Person{
void draw(){
System.out.println("person draw");
}
Person (){
System.out.println("before person draw");
draw();
System.out.println("after person draw");
}
} class Son extends Person{
private int radius = 1;
Son(int radius){
this.radius = radius;
System.out.println("son'radius="+radius);
}
@Override
void draw(){
System.out.println("son draw,radius="+radius);
}
}

我们可以来猜下,运行结果是什么呢?

before person draw
son draw,radius=0
after person draw
son'radius=5

看到这个结果有迷惑的同学吗?为什么中间会输出son draw,radius=0呢?

下面我来解释下,首先,我们知道,在创建一个子类对象时,子类构造函数执行的时候,会默认调用父类的空参构造(如果有的话,如果没有空参构造,必须显示调用)。我们将其补全就成了这样

    Son(int radius){
super();
this.radius = radius;
System.out.println("son'radius="+radius);
}

我们又知道Person的构造函数执行的时候,调用了draw();方法,其实前面也省略了默认的this,我们也将其补全

class Person{
void draw(){
System.out.println("person draw");
}
Person (){
System.out.println("before person draw");
this.draw();
System.out.println("after person draw");
}
}

看到这里不知道大家有没有明白一点?

在执行Son的构造方法时,会先调用Person类的构造函数,此时这个构造函数中,又调用了draw方法,并且是通过this调用的。这里this指向的是一个还未完全完成初始化的Son对象(因为构造Son的构造函数还未执行,此时还在执行父类的初始化),此时的radius被赋了一个默认初始值0。到这里大家应该明白了吧

java基础篇 之 构造器内部的多态行为的更多相关文章

  1. 小白—职场之Java基础篇

    java基础篇 java基础 目录 1.java是一种什么语言,jdk,jre,jvm三者的区别 2.java 1.5之后的三大版本 3.java跨平台及其原理 4.java 语言的特点 5.什么是字 ...

  2. 金三银四跳槽季,BAT美团滴滴java面试大纲(带答案版)之一:Java基础篇

    Java基础篇: 题记:本系列文章,会尽量模拟面试现场对话情景, 用口语而非书面语 ,采用问答形式来展现.另外每一个问题都附上“延伸”,这部分内容是帮助小伙伴们更深的理解一些底层细节的补充,在面试中可 ...

  3. Java基础-面向对象第三大特性之多态(polymorphism )

    Java基础-面向对象第三大特性之多态(polymorphism) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.多态概述 多态是继封装,继承之后,面向对象的第三大特性,多态的 ...

  4. Java基础篇 - 强引用、弱引用、软引用和虚引用

    Java基础篇 - 强引用.弱引用.软引用和虚引用 原创零壹技术栈 最后发布于2018-09-09 08:58:21 阅读数 4936 收藏展开前言Java执行GC判断对象是否存活有两种方式其中一种是 ...

  5. Java基础篇(JVM)——字节码详解

    这是Java基础篇(JVM)的第一篇文章,本来想先说说Java类加载机制的,后来想想,JVM的作用是加载编译器编译好的字节码,并解释成机器码,那么首先应该了解字节码,然后再谈加载字节码的类加载机制似乎 ...

  6. java基础篇---I/O技术

    java基础篇---I/O技术   对于任何程序设计语言而言,输入输出(I/O)系统都是比较复杂的而且还是比较核心的.在java.io.包中提供了相关的API. java中流的概念划分 流的方向: 输 ...

  7. java基础篇---HTTP协议

    java基础篇---HTTP协议   HTTP协议一直是自己的薄弱点,也没抽太多时间去看这方面的内容,今天兴致来了就在网上搜了下关于http协议,发现有园友写了一篇非常好的博文,博文地址:(http: ...

  8. java基础篇---I/O技术(三)

    接上一篇java基础篇---I/O技术(二) Java对象的序列化和反序列化 什么叫对象的序列化和反序列化 要想完成对象的输入或输出,还必须依靠对象输出流(ObjectOutputStream)和对象 ...

  9. java基础篇1

    JAVA基础篇1 注释 单行注释 //这是一个单行注释,由两个斜杠组成,不能嵌套多行注释 多行注释 /*这是一个 多行注释 ,//里面不能嵌套多行注释, 但是可以嵌套单行注释*/ 文档注释 /**ja ...

随机推荐

  1. AJ学IOS(51)多线程网络之GCD下载合并图片_队列组的使用

    AJ分享,必须精品 合并图片(图片水印)第一种方法 效果 实现: 思路: 1.分别下载2张图片:大图片.LOGO 2.合并2张图片 3.显示到一个imageView身上 // 异步下载 dispatc ...

  2. 跳转语句break与continue的使用环境

    break:改变程序控制流 常用于do-while.while.for .switch循环中,终止某个循环,程序跳转到循环块外的下一条语句 continue:跳出本次循环,进入下一次循环

  3. delphi使用ADO在sql数据库存取图片的方法

    我一直不认为能把代码写的和天书一样的程序员是好的程序员,那不过是因为我真的对delphi也就是略懂皮毛,太深了看不懂.网上查询数据库存取图片的方式,看的是一头雾水,有人提出保存路径使用时再调用,方法很 ...

  4. 用Taro做个微信小程序Todo, 小白工作记录

    微信小程序框架: Taro 做微信小程序的框架, 几个比较主流的: 官方的WePY: https://tencent.github.io/wepy/document.html#/ 美团的mpvue: ...

  5. Python下将一般对象打印成Json

    有的时候,我们在写Python程序的时候,在处理复杂对象的时候,有的时候过程中调试,需要去看看产生的对象如何,有的时候我们可以把它打印成json来看,这个是个不错的办法. 对每一个对象写一个独立的打印 ...

  6. Daily Scrum 1/7/2015

    Process: Zhaoyang: Do some code intergration and test the total feature in the IOS APP. Yandong: Cod ...

  7. E. 蚂蚁和斐波那契

    单点时限: 1.0 sec 内存限制: 512 MB 聪明的小蚂蚁最近学习了斐波那契数列,但是它想到了一个问题:从L到R之间斐波那契数列和的奇偶是什么呢?其中Fib[1]=1,Fib[2]=1 . 输 ...

  8. F. Count Prime Pairs

    单点时限: 2.0 sec 内存限制: 512 MB 对于数组a,如果i≠j并且ai+aj是一个质数,那么我们就称(i,j)为质数对,计算数组中质数对的个数. 输入格式 第一行输入一个n,表示数组的长 ...

  9. TortoiseSVN的使用,以及冲突解决办法

    接下来,试试用TortoiseSVN修改文件,添加文件,删除文件,以及如何解决冲突等. 添加文件 在检出的工作副本中添加一个Readme.txt文本文件,这时候这个文本文件会显示为没有版本控制的状态, ...

  10. python3爬虫 爬取动漫视频

    起因 因为本人家里有时候网速不行,所以看动漫的时候播放器总是一卡一卡的,看的太难受了.闲暇无聊又F12看看.但是动漫网站却无法打开控制台.这就勾起了我的兴趣.正好反正无事,去寻找下视频源. 但是这里事 ...