向上转型
  定义:把某个对象的引用视为对其基类类型的引用的做法被称为向上转型
方法调用绑定
  将一个方法调用同一个方法主体关联起来被称作绑定。
  前期绑定:程序执行前进行的绑定叫做前期绑定,前期绑定也是java中默认的绑定方式
  后期绑定(动态绑定或运行时绑定):在运行时根据对象的类型进行绑定。在java中除了static方法和final方法之外,其他所有的方法都是后期绑定,也就是说,通常情况下,我们不用判断是否应该进行后期绑定,它会自动发生。
构造器和多态

  构造器调用顺序:

  (1) 调用基类构造器,此步骤会不断反复递归下去,首先是构造这种层次结构的根,然后是下一层导出类,一直到最低层的导出类

  (2) 按声明顺序调用成员的初始化方法。

  (3) 调用导出类构造器的主体    

  父类(静态变量、静态初始化块)>子类(静态变量、静态初始化块)>
  父类(变量、初始化块)>父类构造器>子类(变量、初始化块)>子类构造器。(变量和初始化块按定义顺序初始化)    
构造器内部的多态方法的行为

  构造器调用的层次结构带来一个有趣的两难问题,如果在一个构造器的内部调用正在构造的对象的某个动态绑定方法,会发生什么情况呢?众所周知,在一般的方法内部,动态绑定的调用是在运行时才决定的,因为对象无法知道它是属于方法所在的类,还是属于那个类的导出类。如果调用构造器内部的一个动态绑定方法,就要用到那个方法的被覆盖后的定义。这个调用的效果相当难预料,因为被覆盖的方法在对象被完全构造之前就会被调用,这可能会造成一些难于发现的错误。

  

 public class Test {

     public static void main(String[] args) {
new RoundGlyph(5);
}
}
class Glyph{
void draw(){ System.out.println("Glyph.draw()"); }
Glyph(){
System.out.println("Glyph before draw()");
draw();
System.out.println("Glyph after draw()");
}
}
class RoundGlyph extends Glyph{
private int radius = 1;
RoundGlyph(int r){
radius = r;
System.out.println("RoundGlyph.RoundGlyph(), radius = " + radius);
}
void draw(){ System.out.println("RoundGlyph.draw(), radius = " + radius); }
}

  代码运行结果:

  

  结果是不是和你预想的结果不太一样,嘿嘿,不用急,我们来分析一下代码是怎么变成这样的。首先在main方法中new了一个RoundGlyph类,然后类加载器发现它继承了Glyph类,这时就会去加载Glyph类,运行Glyph类的构造方法,并在构造方法中调用draw()方法,但是这个方法在导出类中被覆盖了,所以此时会调用子类的draw()方法,注意!关键来了,代码运行到这的时候只是加载了子类,并没有给子类中的radius变量进行初始化,现在radius的值只是java默认分配的一个初始值,当父类运行draw()方法时,它的值只是初始值,所以这个时候会输出0。

  因此我们得出一个惊喜的结论:当我们在基类的构造器内调用了某个方法,并且该方法被导出类所覆盖,此时调用的是导出类内的方法而不是基类本身的方法。

  对于前面的初始化顺序我们应该更正一下:

  (1) 在其他任何事物发生之前,将分配给对象的存储空间初始化成二进制的零

  (2) 调用基类构造器

  (3) 按照声明的顺序调用成员的初始化方法

  (4) 调用导出类的构造器主体

  最后: 编写构造器有一条有效的准则:用尽可能简单的方法使对象进入正常状态,如果可以的话,避免调用其他方法。

抽象类和抽象方法

  抽象类:通用接口建立起一种基本形式,以此表示所有导出类的共同部分

  抽象方法:仅有声明而没有方法体的方法。

  包含抽象方法的类叫做抽象类,如果一个类包含一个或者多个抽象方法,那么该类必须被限定为抽象的。

  接口:interface关键字使抽象的概念更向前迈进了一步,abstract关键字允许人们在类中创建一个或多个没有任何定义的方法,但是没有提供任何相应的具体实现,这些实现是由此类的继承者创建的。interface关键字产生一个完全抽象的类,它根本没有提供任何具体实现,接口只提供了形式,不提供任何具体实现。

  

《java编程思想》多态与接口的更多相关文章

  1. java编程思想第九章接口

    9.1抽象类和抽象方法 为什么要有抽象类? 是希望通过通用接口操作一系列类. 那么抽象类的形式是什么样的呢? 声明类的使用使用abstract关键字,且在该类中应该具有抽象方法. 注:抽象方法被关键字 ...

  2. Java编程思想学习笔记——接口

    1.抽象类和抽象方法 抽象方法:不完整的,仅有声明而没有方法体. abstract void f(); 抽象类:包含抽象方法的类.(若一个类包含一个或多个抽象方法,则该类必须限定为抽象的.) 1.用抽 ...

  3. java编程思想-多态

    java中除了static方法和final方法(private方法属于final方法)之外,其他所有的方法都是动态绑定即运行时绑定. public class test { private void ...

  4. Java编程思想之九 接口

    接口和内部为我们提供了一种将接口与实现分离的更加结构化的方法. 抽象类和抽象方法 创建一个抽象类是希望通过这个通用接口操纵一系列类. Java提供了一个叫做抽象方法的机制,这种方法是不完整的:仅声明而 ...

  5. Java编程思想 第九章 接口

    第九章 接口 抽象类和抽象方法 抽象:从具体事物抽出.概括出它们共同的方面.本质属性与关系等,而将个别的.非本质的方面.属性与关系舍弃,这种思维过程,称为抽象. 这句话概括了抽象的概念,而在Java中 ...

  6. Java编程思想学习(一)----对象导论中多态的理解

    1.1抽象过程 1)万物皆对象. 2)程序是对象的集合,他们通过发送消息来告知彼此所要求做的. 3)每个对象都有自己的由其他对象所构成的存储. 4)每个对象都拥有其类型. 5)某一特定类型的所有对象都 ...

  7. 《Java编程思想》学习笔记_多态

    多态 多态指一个行为产生多种状态,针对父类类型可接收其子类类型,最终执行的状态由具体子类确定,其不同子类可呈现出不同状态.例如人[父类]都会跑步[行为],但小孩[子类]跑步.成年人[子类]跑步.运动员 ...

  8. Java编程思想重点笔记(Java开发必看)

    Java编程思想重点笔记(Java开发必看)   Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而 ...

  9. java编程思想-复用类总结

    今天继续读<java 编程思想>,读到了复用类一章,看到总结写的很好,现贴上来,给大家分享. 继承和组合都能从现有类型生成新类型.组合一般是将现有类型作为新类型底层实现的一部分来加以复用, ...

  10. java编程思想

    Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而且在大型项目开发中也是常用的知识,既有简单的概念理 ...

随机推荐

  1. 使用node打造自己的命令行

    一.实现一个简单的功能 二.环境 1.系统: window 10 2.编辑器: vscode 3.node版本: 8.7.0 三.开始玩 1.打开命令行,新建一个pa'ckage.json npm i ...

  2. 搭建Flutter开发环境需要注意的几个小Tips

    目录 下载SDK 安装 Android Stdio + SDK + tool SDK + 创建模拟器 + 插件(flutter和dart) Xcode + cocoapods VSCode + Flu ...

  3. Vue项目二、vue-cli2.x脚手架搭建build文件夹及config文件夹详解

    build文件夹下 build.js 'use strict' // js的严格模式 require('./check-versions')() // node和npm的版本检查 process.en ...

  4. django 博客搭建

    comment1.安装django pip install django 2.创建项目 django-admin startproject mysite 3.在mysite文件夹下创建app pyth ...

  5. 复制图片链接和标题生成Markdown文本

    写Markdown的时候常常会需要复制图片链接和标题以插入图片,不借助其他工具的话,一般需要先在Markdown文件中输入插入图片的格式,然后在浏览器中复制图片链接和标题将其依次粘贴到Markdown ...

  6. TLS/SSL 梳理

    数据加密通篇都是为了防止第三方的劫持伪造,保证连接安全, 毫无遮掩的明文传输只有民风淳朴的时候才是安全的. 先是一些基础的内容: 对称加密 最开始为了对数据进行加密,使用的是对称加密算法,即双方协商好 ...

  7. nodeJS中定时任务cron的使用

    cron模块可以帮助我们在node中定时执行任务.如果你的定时需求是简单的setInterval()与setTimeout()计时器所无法满足的比较复杂的定时规则,推荐使用cron来配置. 安装cro ...

  8. 玩转控件:重写/重绘Dev中MessageBox弹窗控件

    很久没有更新博客了,本想着直接发一篇<手撕ERP>系列,从控件重写.重绘,到框架搭建,再到部分模块实现+业务的.但是每次动手的时候,都觉得难以下手.直接从数据库设计开始吧,模块设计还没定下 ...

  9. MVC设计模式简介

    刚刚学习了MVC相关知识,在这里进行一下总结MVC设计模式提高了Java开发中的代码可读性,提高了开发效率,实乃开发利器 1在MVC中由客户端发送一个带参数的请求,经过servlet处理后做出相应的处 ...

  10. Fiddler1 简单使用

    1.Fiddler下载地址:https://www.telerik.com/download/fiddler 2.Fiddler设置: Fiddler是强大的抓包工具,它的原理是以web代理服务器的形 ...