对象的多态性

class 动物
{} class 猫 extends 动物
{} class 狗 extends 动物
{} 猫 x = new 猫();
//意思是建立本类的对象 new 猫(),并通过本类的引用指向本类的对象。 动物 x = new 猫();//所以也可以这样写  一个对象两种形态.
//上面的代码表示,用猫类型创建对象,用动物类型指向.
//它的表现就是  父类型的指向子对象
//这就是多种形态.

猫这类事物即具备着猫的形态,又具备着动物的形态。
这就是对象的多态性。

简单说:就是一个对象对应着不同类型。

多态在代码中的体现:
父类或者接口的引用指向其子类的对象。

abstract class Animal
{
abstract void eat();
} class Dog extends Animal
{
void eat()
{
System.out.println("啃骨头");
}
void lookHone()
{
System.out.println("看家");
}
} class Cat extends Animal
{
void eat()
{
System.out.println("吃鱼");
}
void catchMouse()
{
System.out.println("抓老鼠");
}
} class Pig extends Animal
{
void eat()
{
System.out.println("饲料");
}
void gongDi()
{
System.out.println("拱地");
}
} class DuoTaiDemo
{
public static void main(String[] args)
{
Cat c = new Cat();
//c.eat();
method(c);
Dog d = new Dog();
method(d);
Pig p = new Pig();
method(p); //改进后
Animal a = new Cat();//这叫自动类型提升,猫对象提升了动物类型. 但是特有功能无法访问.
//作用就是限制对特有功能的访问.
//专业讲:向上转型
a.eat(); //如果我还想用具体动物猫的特有功能.
//你可以将该对象进行向下转型.
Cat c = (Cat)a; //向下转型的目的是为了使用子类中特有方法.
c.eat();
c.catchMouse(); //注意,对于转型,自始至终都是子类对象在做着类型的变化.
}
}
public static void method(Pig p)
{
p.eat();
} public static void method(Cat c)
{
c.eat();
} public static void method(Dog d)
{
d.eat();
}

每加一个动物,就要再写一个函数,这样很麻烦.
不如我直接让"动物们去吃饭"就可以了

public static void method(Animal a)
{
a.eat();
}//这样就行了.省了很多的代码

这就是多态的简单使用。

多态的好处:
提高了代码的扩展性,前期定义的代码可以使用后期的内容.

多态的弊端:
前期定义的内容不能使用(调用)后期子类的特有内容.

多态的前提:
1. 必须有关系:继承,实现
2. 要有覆盖.

类型判断

public static void method(Animal a)
{
a.eat(); if (a instanceof Cat)//instanceof:用于判断对象的具体类型,只能用于引用数据类型的判断. (也可以判断接口)
{
Cat c = (Cat)a;
c.catchMouse();
}
else if (a instanceof Dog)
{
Dog d = (Dog)a;
d.lookHome();
}
}

成员变量

多态时:
成员的特点:
1. 成员变量.
编译时:参考引用型变量所属的类中的是否有调用的成员变量,有,编译通过,没有,编译失败.
运行时:参考引用型变量所属的类中的是否有调用的成员变量,并运行该所属类型中的成员变量
简单说:编译和运行都参考等号的左边.

2. 成员函数(非静态):
编译时:参考引用类型变量所属的类中的是否有调用的函数,有,编译通过.
运行时:参考对象所属的类中是否调用的函数.
简单说:编译看左边,运行看右边.

3. 静态函数:
编译时:参考引用型变量所属的类中的是否有调用的静态方法.
运行时:参考引用型变量所属的类中的是否有调用的静态方法.
简单说,编译和运行都看左边.

其实对于静态方法,是不需要对象的,直接用类名调用即可。

Java学习个人备忘录之多态的更多相关文章

  1. Java学习笔记--继承和多态(中)

    1.通过继承来开发超类(superclass) 2.使用super 关键词唤起超类的构造方法 3.在超类中覆盖方法 4.区分override和overload 5.在Object类中探索toStrin ...

  2. java学习之接口、多态和内部类

    接口是一组行为的规范.定义.接口是面向对象编程体系中的思想精髓之一,使用接口可以让我们的程序更加利于变化. 接口的格式: interface 接口名称{ 全局变量: 抽象方法: } 接口中的成员修饰符 ...

  3. Java学习个人备忘录之继承

    继承的好处1. 提高了代码的复用性.2. 让类与类之间产生了关系,给第三个特征多态提供了前提. java中支持单继承,不直接支持多继承,但对C++中的多继承机制进行改良.java支持多层继承. C继承 ...

  4. Java学习笔记--继承和多态(上)

    1.通过继承来开发超类(superclass) 2.使用super 关键词唤起超类的构造方法 3.在超类中覆盖方法 4.区分override和overload 5.在Object类中探索toStrin ...

  5. Java学习笔记 抽象类 接口 多态

    instanceof 对象名 instanceof 类名 该对象是否属于该类 Animal animal = new Dog(); if(animal instanceof Dog){ Dog d = ...

  6. Java学习个人备忘录之线程间的通信

    线程间通讯多个线程在处理同一资源,但是任务却不同. class Resource { String name; String sex; } //输入 class Input implements Ru ...

  7. Java学习个人备忘录之多线程

    进程:正在进行中的程序(直译). 线程:就是进程中一个负责程序执行的控制单元(执行路径) 一个进程中可以有多个执行路径,称之为多线程. 一个进程中至少要有一个线程. 开启多个线程是为了同时运行多部分代 ...

  8. Java学习个人备忘录之异常

    概述 异常:是在运行时期发生的不正常情况. 在java中用类的形式对不正常情况进行了描述和封装对象. 描述不正常的情况的类,就称为异常类. 以前正常流程代码和问题处理代码相结合,现在将正常流程代码和问 ...

  9. Java学习个人备忘录之接口

    abstract class AbsDemo { abstract void show1(); abstract void show2(); } 当一个抽象类中的方法都是抽象的时候,这时可以将该抽象类 ...

随机推荐

  1. SHOPEX快递物流单号查询插件

    本SHOPEX快递物流单号跟踪插件提供国内外近2000家快递物流订单单号查询服务例如申通快递.顺丰快递.圆通快递.EMS快递.汇通快递.宅急送快递.德邦物流.百世快递.汇通快递.中通快递.天天快递等知 ...

  2. Random类与Random方法

    class Test{ public static void main(String[] args){ int min=2; //定义随机数的最小值 int max=102; //定义随机数的最大值 ...

  3. 解决protobuf import路径的问题

    网上关于protobuf import的文章不太详细,有些问题说的不全,比如import时的路径是在哪个目录中搜索的,比如: 我有一个这样的目录结构,我怎么在demo2/protoDemo2.prot ...

  4. R语言爬虫:CSS方法与XPath方法对比(表格介绍)

    css 选择器与 xpath 用法对比 目标 匹配节点 CSS 3 XPath 所有节点 ~ * //* 查找一级.二级.三级标题节点 <h1>,<h2>,<h3> ...

  5. Prism for WPF 搭建一个简单的模块化开发框架(二)

    原文:Prism for WPF 搭建一个简单的模块化开发框架(二) 今天又有时间了,再改改,加了一些控件全局的样式 样式代码 <ResourceDictionary xmlns="h ...

  6. 北京Uber优步司机奖励政策(2月19日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  7. 5 多进程copy文件

    1.如何进行开发? 2.版本1:程序大框架 #1.创建一个文件夹 #2.获取old文件夹中所有的文件名字 #3.使用多进程的方式copy原文件夹中的所有文件到新文件夹中 3.版本2:创建一个文件夹 1 ...

  8. spark 执行架构

    术语定义 Application:Spark Application的概念和Hadoop MapReduce中的类似,指的是用户编写的Spark应用程序,包含了一个Driver 功能的代码和分布在集群 ...

  9. php常用几个数组的区别

    本文主要介绍的php数组函数主要有:sort.rsort.asort.arsort.ksort.krsort 测试数据定义一个关联数组如下: $data=[ 'f'=>123, 'b'=> ...

  10. 怎样通过Qt编写C/C++代码查询当前Linux的版本号?

    遇到一个问题:如题. 我的开发环境是:嵌入式ARM + Linux系统 + Qt 4.5 + C/C++ 现在需要查询 当前Linux系统的版本号. 问题: 1)Qt 4.5 提供怎样的API来获取? ...