对象的多态性

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. 日期格式操作,在oracle和mysql中的实现

    oracle add_months(日期格式值 , 整数n)  当整数n=12时,代表一年,向后推迟一年,若n=-12代表回退一年 如 to_char(add_months(to_date('2018 ...

  2. 【补】英语对IT工作者的重要性

    浅谈程序员的英语学习   作为在中国工作的程序员,不懂得英语似乎也不妨碍找到好工作,升职加薪.但程序员这个工种则稍有不同,因为程序,尤其是高级语言,基本上都是由英语和数字表达式构成的.英语对于程序员十 ...

  3. 04.nginx使用

    博客为日常工作学习积累总结: 1.安装依赖包 安装pcre :yum install pcre pcre-devel -y        安装openssl:yum install openssl o ...

  4. IO流,字节流

    /** * IO流,字节流 */ import java.io.FileInputStream; import java.io.FileOutputStream; public class ByStr ...

  5. seleniun 爬取淘宝网

    import re from selenium import webdriver from selenium.common.exceptions import TimeoutException fro ...

  6. SublimeText配置Python3运行环境

    1.查看python3安装路径which python3 2.打开sublime text 3,点击上部菜单栏Tools->Build System->new Build System 3 ...

  7. 生成Ipa安装包的plist文件后生成下载链接

    假设生成的plist文件的下载链接是: https://www.xx.com/download/xx.plist 那么如果想让苹果手机的浏览器点击后开始下载苹果软件包,则网页中的下载链接需要拼接成 i ...

  8. 闰年相关的问题v3.0——计算有多少闰年

    # include<stdio.h>int main(){ int a,b,i; int sum = 0; printf("Input your birth year:" ...

  9. 【8086汇编-Day7】关于多个段的程序的实验

    实验一 实验二 实验三 实验四 实验五 实验六 总结 在集成环境下,内存从0770段开始按照段的先后顺序和内容多少分配,并且分配的都是16的倍数 关于实际占用的空间公式的话其实极容易想到(假设有N个字 ...

  10. Java设计模式(16)——行为模式之模板方法模式(Template)

    一.概念 概念 UML简图 角色 使用场景 其实我们常用得抽象类就是这个模式得运用,所以基本上属于比较好理解的一种模式. 二.实践 根据上述角色,给出相应代码 抽象模板 /** * 抽象模板 * * ...