参考并摘自: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. Android开发(十五)——ListView中Items的间距margin

    ListView中Items没有margin 参考:http://www.cnblogs.com/xitang/p/3677528.html

  2. Springboot学习笔记(五)-条件化注入

    前言 将Bean交给spring托管很简单,根据功能在类上添加@Component,@Service,@Controller等等都行,如果是第三方类,也可以通过标有@Configuration的配置类 ...

  3. Java基础复习笔记基本排序算法

    Java基础复习笔记基本排序算法 1. 排序 排序是一个历来都是很多算法家热衷的领域,到现在还有很多数学家兼计算机专家还在研究.而排序是计算机程序开发中常用的一种操作.为何需要排序呢.我们在所有的系统 ...

  4. 【netcore基础】.NET Core使用EPPlus实现MVC API里的Excel导出功能 配置中文表头

    EPPlus 用来操作excel非常方便,不用依赖微软的office包,所以推荐使用. 下面是具体步骤和代码 首先用nuget安装 EPPlus.Core 我装的版本是 1.5.4 然后就可以用 Ex ...

  5. Qt编写自定义控件1-汽车仪表盘

    前言 汽车仪表盘几乎是qt写仪表盘控件中最常见的,一般来说先要求美工做好设计图,然后设计效果图给到程序员,由程序员根据效果来实现,主要靠贴图,这种方法有个好处就是做出来的效果比较逼真,和真实效果图基本 ...

  6. Get Started with the Google Fonts API

    Get Started with the Google Fonts API This guide explains how to use the Google Fonts API to add fon ...

  7. genieacs Installation on Ubuntu14.04

    Beside the installation guide on the main page, here is a guide to install GenieACS off a freshly in ...

  8. h5 打造全屏体验 element.requestFullscreen()

    google打造全屏体验 https://developers.google.cn/web/fundamentals/native-hardware/fullscreen/ 以前github上的 ht ...

  9. yii2优化 - 开启 Schema 缓存

    开启 Schema 缓存 Schema 缓存是一个特殊的缓存功能,每当你使用活动记录时应该要开启这个缓存功能.如你所知, 活动记录能智能检测数据库对象的集合(例如列名.列类型.约束)而不需要手动地描述 ...

  10. db2 删除过期的日志和备份文件(转)

    DB2 删除过期备份和日志 $ db2 list history archive log all forpayment2    ------列出归档日志 $ db2 list history back ...