JAVA多态学习1
多态–概念
所谓多态。就是指一个引用(类型)在不同情况下的多种状态。
也能够理解成:多态是指通过指向父类的指针,来调用在不同子类中实现的方法。
实现多态有两种方式:1、继承。2、接口
这一次我们先来演示一下:
继承、方法覆盖、多态以及向上转型的内容
package polimorphic;
public class Polimorphic {
public static void main(String[] args) {
//非多态演示
System.out.println("非多态演示:");
Cat cat=new Cat();
cat.cry();
//cat=new Dog(); //类型不匹配
Dog dog=new Dog();
dog.cry();
dog.bite();
System.out.println();
//多态演示
System.out.println("多态演示:");
Animal an=new Cat();
an.cry();
an=new Dog();
an.cry();
//an.bite(); // an虽指向子类对象,但此时丢失bite()方法
System.out.println();
//多重多态演示
System.out.println("多重多态演示:");
Master master=new Master();
master.feed(new Dog(),new Bone());
master.feed(new Cat(),new Fish());
}
}
//主人类
class Master{
//给动物喂食物,使用多态,仅仅要写一个方法
public void feed(Animal an,Food f){
an.eat();
f.showName();
}
}
//食物父类
class Food{
String name;
public void showName(){
System.out.println("食物");
}
}
//食物鱼子类
class Fish extends Food{
public void showName(){ //覆盖父类方法
System.out.println("鱼");
}
}
//食物骨头子类
class Bone extends Food{
public void showName(){ //覆盖父类方法
System.out.println("骨头");
}
}
//动物类Animal父类
class Animal{
String name;
int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//动物会叫
public void cry(){
System.out.println("不知道怎么叫");
}
//动物吃东西
public void eat(){
System.out.println("不知道吃什么");
}
}
//创建Dog子类并extends继承Animal父类及覆盖cry方法
class Dog extends Animal{
//狗叫
public void cry(){ //覆盖父类方法
System.out.println("汪汪叫");
}
//狗吃东西
public void eat(){ //覆盖父类方法
System.out.println("狗爱吃骨头");
}
public void bite(){
System.out.println("狗会咬人...");
}
}
class Cat extends Animal{
//猫自己叫
public void cry(){ //覆盖父类方法
System.out.println("猫猫叫");
}
//猫吃东西
public void eat(){ //覆盖父类方法
System.out.println("猫爱吃鱼");
}
}
结果截图
多态–注意事项:
1、java同意父类的引用变量引用它的子类的实例(对象)
Animal an=new Cat();//这样的转换时自己主动完毕的.
转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类能够复用父类的功能,假设父类不能满足当前子类的需求,则子类能够重写父类中的方法来加以扩展。
向上转型:子类引用的对象转换为父类类型称为向上转型。通俗地说就是是将子类对象转为父类对象。此处父类对象能够是接口
Animal dog 引用指向new Dog();子类对象当成父类对象,仅仅能调用父类的成员。假设子类重写了父类的方法就依据这个引用指向调用子类重写的这种方法(这种方法就是覆盖override)。这个调用过程就称为“动态绑定”。
转型须要注意的问题:
向上转型时,父类指向子类引用对象会遗失除与父类对象共同拥有的其它方法,也就是在转型过程中,子类的新有的方法都会遗失掉。在编译时,系统会提供找不到方法的错误。
比方:上述代码的
//an.bite(); // an虽指向子类对象。但此时丢失bite()方法
关于类型转换另一些详细的细节要求,我们在后面还要提,比方子类能不能转换成父类,有什么要求等等…
向下转型的问题我们下一节探讨。
JAVA多态学习1的更多相关文章
- JAVA多态学习3
这一节我们来学习抽象类 抽象类–深入讨论 抽象类是java中一个比較重要的类. 1.用abstract关键字来修饰一个类时.这个类就是抽象类. 2.用abstract关键字来修饰一个方法时,这种方法就 ...
- Java多态学习笔记
面向对象三大特性:封装,继承和多态.其中,封装,继承都比较通俗易懂,唯有多态令我甚是头疼.经过仔细研究之后,终于搞懂了一点,特来做一个分享.独乐乐不如众乐乐. 何为多态?多态的本质是:一个程序中同名的 ...
- JAVA多态学习2
好啦,这里紧接着上次没说的向下转型,请读者结合上次讨论的向上转型的样例一起探讨(事实上本次代码也有加上,放心). 我们这里希望从向下转型会出现的两种基本情况进行探讨 package downcasti ...
- [转帖]java基础学习总结——多态(动态绑定)
https://www.cnblogs.com/xdp-gacl/p/3644035.html 多态的概念 java基础学习总结——多态(动态绑定) 一.面向对象最核心的机制——动态绑定,也叫多态
- Java学习笔记二十六:Java多态中的引用类型转换
Java多态中的引用类型转换 引用类型转换: 1.向上类型转换(隐式/自动类型转换),是小类型到大类型的转换: 2.向下类型转换(强制类型转换),是大类型到小类型的转换: 3.instanceof运算 ...
- Java 多态——与C++的比较
学习了Java和C++之后,由于长期不使用C++,而java的基础知识掌握不牢,现在已经搞不清java多态了.现在先来谈谈java多态,稍后有时间再更新C++的多态,并进行比较~ 一. Java的多态 ...
- Java基础学习-- 继承 的简单总结
代码参考:Java基础学习小记--多态 为什么要引入继承? 还是做一个媒体库,里面可以放CD,可以放DVD.如果把CD和DVD做成两个没有联系的类的话,那么在管理这个媒体库的时候,要单独做一个添加CD ...
- java JDK8 学习笔记——助教学习博客汇总
java JDK8 学习笔记——助教学习博客汇总 1-6章 (by肖昱) Java学习笔记第一章——Java平台概论 Java学习笔记第二章——从JDK到IDEJava学习笔记第三章——基础语法Jav ...
- Java多态总结
面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 1.定义: 多态:指允许不同类的对象对同一消息做出响应.即同一消息可 ...
随机推荐
- iOS数据持久化 -- Core Data
Core Data是一个功能强大的层,位于SQLite数据库之上,它避免了SQL的复杂性,能让我们以更自然的方式与数据库进行交互.Core Data将数据库行转换为OC对象(托管对象)来实现,这样无需 ...
- 威胁报告:mDNS 反射式 DDoS 攻击
威胁报告:mDNS 反射式 DDoS 攻击 转自:https://www.akamai.com/cn/zh/about/our-thinking/threat-advisories/akamai-md ...
- nyoj--1233--差值(贪心模拟+大数)
差值 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 输入一个整数数组,将它们连接起来排成一个数,找出能排出的所有数字中最大,最小的两个,输出两个数的差值.例如输入数组{ ...
- [AGC018 B] Sports Festival 解题报告
题目链接:https://agc018.contest.atcoder.jp/tasks/agc018_b 题目: 题目大意: 有N个人参加M个体育项目,每个人对体育项目的喜爱程度有一个排名,A[i] ...
- Classes and functions
As another example of a user-defined type, we’ll define a class called Time that records the time of ...
- BZOJ 1336&1337最小圆覆盖
思路: http://blog.csdn.net/commonc/article/details/52291822 (照着算法步骤写--) 已知三点共圆 求圆心的时候 就设一下圆心坐标(x,y) 解个 ...
- POJ 3225 线段树+lazy标记
lazy写崩了--. 查了好久 /* U-> [l,r]–>1 I-> [1,l-1] [r+1,+无穷] –>0 D-> [l,r]–>0 C-> [1,l ...
- Fiddler 故障
如果只要打开 Fiddler 就没法进网页,重启 Fiddler 问题依旧.卸载并重装 Fiddler 后,提示 8888 端口被占,错误弹窗中包含“ipoverusbsvc:2492”,说明有设备在 ...
- Python有了asyncio和aiohttp在爬虫这类型IO任务中多线程/多进程还有存在的必要吗?
最近正在学习Python中的异步编程,看了一些博客后做了一些小测验:对比asyncio+aiohttp的爬虫和asyncio+aiohttp+concurrent.futures(线程池/进程池)在效 ...
- javascript常用收集一下
事件源对象 event.srcElement.tagName event.srcElement.type 捕获释放 event.srcElement.setCapture(); event.srcEl ...