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(); } 当一个抽象类中的方法都是抽象的时候,这时可以将该抽象类 ...
随机推荐
- MySQL学习之变量
变量 MySQL本质是一种编程语言,需要很多变量来保存数据,mysql中很多的属性控制都是通过MySQL中固有的变量来实现的. 系统变量 系统内部定义的变量,系统变量针对的是所有用户(MySQL客户端 ...
- ubuntu系统的软件包管理工具
ubuntu系统的软件包管理工具有两种,一种是离线管理,另一种是在线管理 1.离线管理 dpkg工具可以对本地存放的deb安装包进行安装,卸载,查看状态等. dpkg -i app_name_vers ...
- 安装mysql8.13用Navicat Premium链接本地数据库报2059
推荐使用已下命令: ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER; #修改加密规则 ALTE ...
- Angular.js进阶
1.常用指令 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UT ...
- Python对文件目录的操作
python中对文件.文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块. 得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd()返回指定目录下的所有文件和目录 ...
- B/S与C/S架构简介
概念: C/S结构,即Client/Server(客户机/服务器)结构,是大家熟知的软件系统体系结构,通过将任务合理分配到Client端和Server端,降低了系统的通讯开销,可以充分利用两端硬件环境 ...
- python中的__all__
在定义一个模块的时候,在开头处加上 “ __all__ = ["xxx1", "xxx2"] ”(xxx可以是方法.类.变量等希望让外界访问的值),那么在外部通 ...
- 异 形 卵 南阳acm709
异 形 卵 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 我们探索宇宙,是想了解浩瀚星空的奥妙,但我们却很少意识到宇宙深处藏匿的危险,它们无时无刻不紧盯着我们的地球 ...
- C语言实现左旋字符串
#include<stdio.h> #include<stdlib.h> #include<string.h> void left_rotate(char *str ...
- 优步北京B组奖励政策
用户组:优步北京B组(2015年7月20日前激活的部分司机) 更新日期:2015年8月4日 滴滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最 ...