Java学习个人备忘录之多态
对象的多态性
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学习个人备忘录之多态的更多相关文章
- Java学习笔记--继承和多态(中)
1.通过继承来开发超类(superclass) 2.使用super 关键词唤起超类的构造方法 3.在超类中覆盖方法 4.区分override和overload 5.在Object类中探索toStrin ...
- java学习之接口、多态和内部类
接口是一组行为的规范.定义.接口是面向对象编程体系中的思想精髓之一,使用接口可以让我们的程序更加利于变化. 接口的格式: interface 接口名称{ 全局变量: 抽象方法: } 接口中的成员修饰符 ...
- Java学习个人备忘录之继承
继承的好处1. 提高了代码的复用性.2. 让类与类之间产生了关系,给第三个特征多态提供了前提. java中支持单继承,不直接支持多继承,但对C++中的多继承机制进行改良.java支持多层继承. C继承 ...
- Java学习笔记--继承和多态(上)
1.通过继承来开发超类(superclass) 2.使用super 关键词唤起超类的构造方法 3.在超类中覆盖方法 4.区分override和overload 5.在Object类中探索toStrin ...
- Java学习笔记 抽象类 接口 多态
instanceof 对象名 instanceof 类名 该对象是否属于该类 Animal animal = new Dog(); if(animal instanceof Dog){ Dog d = ...
- Java学习个人备忘录之线程间的通信
线程间通讯多个线程在处理同一资源,但是任务却不同. class Resource { String name; String sex; } //输入 class Input implements Ru ...
- Java学习个人备忘录之多线程
进程:正在进行中的程序(直译). 线程:就是进程中一个负责程序执行的控制单元(执行路径) 一个进程中可以有多个执行路径,称之为多线程. 一个进程中至少要有一个线程. 开启多个线程是为了同时运行多部分代 ...
- Java学习个人备忘录之异常
概述 异常:是在运行时期发生的不正常情况. 在java中用类的形式对不正常情况进行了描述和封装对象. 描述不正常的情况的类,就称为异常类. 以前正常流程代码和问题处理代码相结合,现在将正常流程代码和问 ...
- Java学习个人备忘录之接口
abstract class AbsDemo { abstract void show1(); abstract void show2(); } 当一个抽象类中的方法都是抽象的时候,这时可以将该抽象类 ...
随机推荐
- 【Linux】Linux 的慢动作基础
了解一下刀片服务器: 刀片服务器是指在高标准度的机架式机箱内插装多个卡式的服务器单元,是一种实现HAHD的低成本服务器平台,其中每一片刀片实际上就是一块系统主板. Linux: Linux操作系统构成 ...
- 第一课、安装登录CentOS7
一.学习之初 1.学习这个课程的目的是,高薪就业,搞运维. 2.应该在宁波发展. 3.大概给自己定的计划是4个月能学习2遍. 4.学好之后就跳槽. 5.2年左右的时间要达到1.5W争取. 学习方法: ...
- python中函数参数的引用方式
值传递和引用传递时C++中的概念,在python中函数参数的传递是变量指向的对象的物理内存地址!!! python不允许程序员选择采用传值还是传引用.Python参数传递采用的肯定是“传对象引用”的方 ...
- C语言,初次见面~
C语言是一门介于低级语言(如汇编语言)和高级语言(如Java,Python)之间的一门编程语言,所以它兼有两类语言的一些优点,并且具有自身的一些特点. 1.c语言的高效性.c语言具有通常是汇编语言才具 ...
- centos下安装python的过程
Linux下默认系统自带python2.6的版本,这个版本被系统很多程序所依赖,所以不建议删除,如果使用最新的Python3那么我们知道编译安装源码包和系统默认包之间是没有任何影响的,所以可以安装py ...
- BZOJ1452_Count_KEY
题目传送门 二维树状数组,对于每个颜色开一个树状数组,用容斥求解. code: #include <cstdio> using namespace std; int read() { ') ...
- 北京Uber优步司机奖励政策(12月22日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 杭州优步uber司机第三组奖励政策
-8月9日更新- 优步杭州第三组: 定义为激活时间在2015/8/3之后(含)的车主(以优步后台数据显示为准) 滴滴快车单单2.5倍,注册地址:http://www.udache.com/如何注册Ub ...
- 长沙优步Uber奖励政策(7.27~8.2)
奖励前提 *必须满足当周评分4.7星及以上,且当周接单率70%及以上,才有资格获得奖励 *当周上线时间不低于7小时 *刷单和红线行为立即封号并取消当周全部奖励! *机场高速费用不参与翻倍奖励 *早高峰 ...
- 老曹眼中的Linux基础
Linux 几乎无处不在,不论是服务器构建,还是客户端开发,对操作系统的基本理解和基础技能的掌握对全栈来说都是必备的. 系统的选择 Linux发行版本大体分为两类,一类是商业公司维护的发行版本,一类是 ...