多态

“封装”通过合并特征和行为来创建新的数据类型。

“多态”的作用则是消除类型之间的耦合关系。

方法调用绑定

定义:将一个方法调用同一个方法主题关联起来被称为绑定。

若在程序执行前进行绑定(假设有的话,由编译器和链接程序实现),叫前期绑定。在执行时依据对象的类型进行绑定称为后期绑定,或执行时绑定。java中的多态就是通过动态绑定实现的。

java中除了static方法和final方法(private 方法属于final方法)之外,其它全部方法都是后期绑定。

缺陷:域与静态方法

一旦你了解了多态机制,你可能会觉得全部事物都是能够多态的发生的。然而,仅仅有普通的方法调用是能够多态的。假设你訪问某个域field,这个訪问将在编译期进行解析。看以下的样例:

class Super{
public int filed = 0;
public int getFiled(){
return filed;
}
} class Sub extends Super{
public int filed = 1;
public int getFiled(){
return filed;
} public int getSuperFiled(){
return super.filed;
}
}
public class FiledAccess { public static void main(String [] agrs){
Super sup = new Sub();
System.out.println("sup.field = " + sup.filed + ", sup.getField() = "+
sup.getFiled()); Sub sub = new Sub();
System.out.println("sub.field = " + sub.filed + ", sub.getField() = "+
sub.getFiled() + ", sub.getSuperField() = " + sub.getSuperFiled()); } }
sup.field = 0, sup.getField() = 1
sub.field = 1, sub.getField() = 1, sub.getSuperField() = 0

当Sub转型为Super引用时,不论什么域訪问操作都将由编译器解析,因此不是多态的。在本例中,为Super.field和Sub.field分配了不同的存储空间。这样,Sub实际上包括两个成为field的域:他自己的和它从Super处得到的。然而在引用Sub中的filed时所产生的默认域并不是Super版本号的field域。因此,为了得到Super.filed,必须显示的指明super.field。

这个问题看起来非常easy令人混淆,可是实际中却并不常发生。由于依据设计原则,我们经常将全部的域设置为private的,因此不能直接訪问他们,仅仅能通过方法来訪问。

总结:方法多态,域不多态訪问。

静态方法相同不具有多态性。由于静态方法是与类相关联的,而不是与单个对象相关联。看以下的样例消化一下^.^~:

class StaticSuper{
public static String staticGet(){
return "Base staticGet()";
} public String dynamicGet(){
return "Base dynamicGet()";
}
} class StaticSub extends StaticSuper{
public static String staticGet(){
return "Derived staticGet()";
} public String dynamicGet(){
return "Derived dynamicGet()";
}
}
public class StaticPolymorphism {
public static void main(String [] args){
StaticSuper sup = new StaticSub();
System.out.println(sup.staticGet());
System.out.println(sup.dynamicGet());
}
} output:
Base staticGet()
Derived dynamicGet() 

參考:《thinking in java》

[think in java] 第8章 多态的更多相关文章

  1. Java 第18章 多态

    18 章  --> 多态 继承: extends 抽象类 abstract (限制类的实例化) 抽象方法 public abstract void show(); //抽象方法只有方法的声明,没 ...

  2. java第三章多态

    多态: 多态不仅可以减少代码量,还可以提高代码的扩展和可维护性 (通过一个方法可以对所有所需方法一个运用)多态具体表现多种形态能力的特征,同一个实现接口使用不同实例而执行不同的操作 实现多态的三个条件 ...

  3. JAVA基础第二章-java三大特性:封装、继承、多态

    业内经常说的一句话是不要重复造轮子,但是有时候,只有自己造一个轮子了,才会深刻明白什么样的轮子适合山路,什么样的轮子适合平地! 我将会持续更新java基础知识,欢迎关注. 往期章节: JAVA基础第一 ...

  4. “全栈2019”Java第九十一章:内部类具有多态特性吗?

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  5. Java入门第二季——第4章 多态

    第4章 多态 多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作 4-1 Java 中的多态 注意:不能通过父类的引 ...

  6. java面向对象编程--第九章 多态和抽象

    9.1多态 在生物学中,是指一个生物或物种可以有多种不同的形式或阶段: 在OOP中,多态是指一个对象有多种形式的能力. 多态可以说是面向对象编程的精髓所在.java中之所以引入多态的概念,原因之一是它 ...

  7. 20190819 On Java8 第九章 多态

    第九章 多态 向上转型回溯 可扩展性 由于多态机制,在一个设计良好的面向对象程序中,许多方法,只与基类接口通信.这样的程序是可扩展的,因为可以从通用的基类派生出新的数据类型,从而添加新的功能.那些操纵 ...

  8. java提高篇之理解java的三大特性——多态

    面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承 ...

  9. Java基础学习小记--多态

    题外话:总结了多年的学习心得,不得不说,睡眠是一个学习者的必需品!所谓"早起毁一天"不是没有道理哪,特别对Coders来说,有几天不是加班到夜里.好吧,我承认对于初学Java的我, ...

随机推荐

  1. python 的spyder用法

    ctrl+tab可以进行跳转 https://blog.csdn.net/luckygirl0809/article/details/79929491

  2. express 的路由分离

    在做大型项目是一般不会把路由写入server.js里,所以就有了路由分离 1.在项目目录下创建router文件夹 user.js var express = require("express ...

  3. GO语言学习(一)Windows 平台下 Go 语言的安装和环境变量设置

    1. Go 语言 SDK 安装包下载和安装 GO语言安装包下载地址:https://www.golangtc.com/download 下载 go1.9.2.windows-amd64 2. Go 语 ...

  4. 使用stringstream进行类型转换与字符串分割

    C++标准库中的<sstream>提供了比ANSI C的<stdio.h>更高级的一些功能,即单纯性.类型安全和可扩展性. 如果你已习惯了<stdio.h>风格的转 ...

  5. UVA 11461 - Square Numbers 数学水题

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  6. css3-12 transition+css或transform实现过渡动画

    css3-12 transition+css或transform实现过渡动画 一.总结 一句话总结:首先要设置hover后的效果,然后在transition里面指定执行哪些样式和执行时间为多长. 1. ...

  7. ASCII码的问题

    数字0在ASCII的不同进制下表示:

  8. 4、linux下应用创建线程

    1.linux创建线程之pthread_create 函数简介 pthread_create是UNIX环境创建线程函数 头文件 #include<pthread.h> 函数声明 int p ...

  9. c#之mysql四种带事务批量插入

    前言 对于像我这样的业务程序员开发一些表单内容是家常便饭的事情,说道表单 我们都避免不了多行内容的提交,多行内容保存,自然要用到数据库,如果循环打扰我数据库,数据库也会觉得很累,从而增加数据库服务器压 ...

  10. php面试题四

    php面试题四 一.总结 二.php面试题四 01. 输出为 Mozilla/4.0(compatible;MSIE5.01;Window NT 5.0)时,可能的输出语句是:   A.$_S ...