参考并摘自:http://www.runoob.com/java/java-polymorphism.html

多态

多态是一个行为具有多个不同表现形式的能力。

多态就是同一个接口,使用不同的实例而执行不同的操作。

多态存在的三个必要条件:

1.继承  2.重写  3.父类引用指向子类对象

如Parent a = new Child();

当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。

多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。

多态实例:

abstract class Animal{
abstract void eat();
}
class Cat extends Animal{
public void eat(){
System.out.println("eat fish");
}
public void work(){
System.out.println("catch mouse");
}
}
class Dog extends Animal{
public void eat(){
System.out.println("eat bone");
}
public void work(){
System.out.println("watch home");
}
}
public class Test{
public static void main(String[] args){
show(new Cat()); //以cat对象调用show方法
show(new Dog()); //以dog对象调用show方法
Animal a = new Cat(); //向上转型
a.eat();
Cat c = (Cat)a; //向下转型
c.work();
}
public static void show(Animal a){
a.eat();
    //类型判断
if(a instanceof Cat){
Cat c = (Cat)a;
c.work();
}else if(a instanceof Dog){
Dog c = (Dog)a;
c.work();
}
}
}
//运行结果
eat fish
catch mouse
eat bone
watch home
eat fish
catch mouse

 虚方法:

class Animal{
public Animal(int a){
System.out.println("superclass...");
}
public void eat(){
System.out.println("superclass test....");
}
public void eat2(){
System.out.println("superclass eat2...");
}
public void doeat(){
//空方法,实际运行子类方法
}
}
class Cat extends Animal{
public Cat(){
super(100);//父类构造器带参数时,子类构造器中必须通过super调用父类构造器并配参数。
System.out.println("subclass..");
}
public void eat2(){
System.out.println("subclass eat2...");
}
public void doeat(){
eat(); //父类有,子类没有,子类直接调用
eat2(); //父类有,子类重写,调用子类方法直接调用
this.eat2();//同上
super.eat2();//父类有,子类重写,调用父类方法用super
}
}
public class Test{
public static void main(String[] args){
Animal a = new Cat(); //父类引用指向子类对象
a.doeat();
}
}
//运行结果:
superclass...
subclass..
superclass test....
subclass eat2...
subclass eat2...
superclass eat2...

编译的时候,编译器使用父类中的方法验证,运行时使用子类方法执行,该过程称为虚拟方法调用,该方法称为虚拟方法。

java中所有方法都能以这种方式表现,因此重写的方法能在运行时调用,不管编译时源代码中引用变量是什么数据类型。

多态的实现方式:

方式一:重写

方式二:接口

方式三:抽象类和抽象方法

Java之旅_面向对象_多态的更多相关文章

  1. JAVA之旅(八)——多态的体现,前提,好处,应用,转型,instanceof,多态中成员变量的特点,多态的案例

    JAVA之旅(八)--多态的体现,前提,好处,应用,转型,instanceof,多态中成员变量的特点,多态的案例 学习是不能停止的 一.多态 我们今天又要学习一个新的概念了,就是多态,它是面向对象的第 ...

  2. Java之旅_面向对象_封装

    参考并摘自:http://www.runoob.com/java/java-encapsulation.html 在面向对象的程序设计方法中,封装(英语 :Encapsulation)是指一种将函数接 ...

  3. Java之旅_面向对象_抽象类

    参考并摘自:http://www.runoob.com/java/java-abstraction.html Java抽象类: 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有 ...

  4. Java之旅_面向对象_包(Package)

    http://www.runoob.com/java/java-package.html 包的作用: 1.把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用. 2.如同文件夹一样,包也采用 ...

  5. Java之旅_面向对象_接口

    参考摘自:http://www.runoob.com/java/java-interfaces.html 接口(interface)在Java中是一个抽象类型,是抽象方法的集合. 一个类通过imple ...

  6. Java之旅_面向对象_重写和重载

    参考并摘自:http://www.runoob.com/java/java-override-overload.html 重写(Override) 子类对父类(允许访问的)方法的实现过程进行重新编写, ...

  7. java语言基础(四)_面向对象_类_对象_封装_构造

    面向对象 Java语言是一种面向对象的程序设计语言,而面向对象思想是一种程序设计思想,我们在面向对象思想的指引下,使用Java语言去设计.开发计算机程序. 这里的对象泛指现实中一切事物,每种事物都具备 ...

  8. Python笔记_第三篇_面向对象_7.多态

    1. 多态的概念 多态:一种事物的多种形态.其表现形式就是连续的继承关系. 还以人喂食动物的例子.最终目标是人可以喂食任何一种动物.如果人要喂食100多种动物,难道要写100中方法吗?多态就是把属性和 ...

  9. Java笔记(十五)……面向对象IV多态(polymorphism)

    概述 定义:某一类事物的多种存在形态. 例:动物中猫,狗. 猫这个对象对应的类型是猫类型 猫 x = new 猫(); 同时猫也是动物中的一种,也可以把猫称为动物. 动物 y = new 猫(); 动 ...

随机推荐

  1. 20款最好的jQuery文件上传插件

    当它是关于开发网络应用程序和网页的时候,文件上传功能的重要性是不容忽视的.一个文件上传功能可以让你上传所有类型的文件在网站上,包括视频,图像,文件和更多.创建一个文件上传功能,对你的网站是不是很难,有 ...

  2. winform 操作注册表提示没有权限解决办法

    1.打开VS2005.VS2008.VS2010.VS2012.VS2013.VS2015工程,查看工程文件夹中的Properties文件夹下是否有app.manifest这个文件:如没有,按如下方式 ...

  3. 如何搭建WebRTC信令服务器

    WebRTC 有一整套规范,如怎样使用它的接口.使用SDP进行媒体协商.通过ICE收集地址并进行连通性检测等等.除此之外,WebRTC还需要房间服务器将多端聚集到一起管理,以及信令服务器进行信令数据交 ...

  4. QTableView 二次整理

    一.设置可视化的组件 参考: http://www.cnblogs.com/ribavnu/p/4810412.html 二.常用基本属性 http://www.cnblogs.com/ribavnu ...

  5. SpringMVC Jsp include 错误404 不显示页面

    一.问题描述: 1. 新建了taglibs.jsp存放jstl标签库和 jsp建站基本变量ctx 和basPath 如下  (位置WEB-INF\common) <%@ page import= ...

  6. SharePreferences

    SharePreferences是一种轻量级的数据存储方式,它是以key-value的形式保存在 data/data/<packagename>/shared_prefs 下的xml文件中 ...

  7. 求教如何在win7 X64系统上安装.net 3.5 sp1

    其实win7系统已自带net 3.5.1了.开始菜单——控制面板——程序——打开或关闭windows功能,找到Microsoft .NET Framework 3.5.1,去掉选项,确定.然后再进入“ ...

  8. duilib进阶教程 -- TreeView控件的不足 (7)

    上一个教程中,虽然播放列表的框架和迅雷一样了,但是字体大小.文字居中还没有解决.如果是刚学duilib,搞定这个可不容易,因为在有了入门教程的指导后,很容易就想到去看[属性列表.XML],但是当你试了 ...

  9. 升级 Centos 6.5/6.7 的 php 版本

    Centos 6.5/6.7 的 php 预设是用 5.3.3 这个版本号 wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-releas ...

  10. Redmine发布新闻,自动发送邮件功能失效恢复

    问题描述:操作数据库,修改项目公开状体后,创建新闻,自动发送邮件功能失效. 问题检查和恢复测试: 1.检查管理员权限 2.重新手动配置项目公开状态,覆盖数据操作 3.对比其他正常项目数据库状态,进行恢 ...