OOP⑺
1.多态和instanceof
都是去买东西,但是根据我们给别人金额的不同,得到不同的结果!!!! 生活中的多态! 操作是否一致? 一致! 都是买东西!
什么不一样??
01.消费金额不一样
02.因为消费金额不一样 所以 得到的东西不一样 程序中的多态:
01.静态的多态 方法重载 String buySomething();
String buySomething(double money);
String buySomething(double money,String something); 02.动态的多态 Animal 是抽象类
Animal x=new X(); 同一个引用类型,使用不同的对象实例,而执行不同的操作,从而得到一个不同的结果! 如果X是Dog,等会执行eat()就是吃骨头;
如果X是Cat,等会执行eat()就是吃鱼; 01.Dog和Cat都是动物!! ===》同一个引用类型
02.一个Dog 一个Cat ===》不同的对象实例
03. 吃骨头 吃鱼 ===》不同的操作结果 多态存在的必要条件:
01.要有继承关系! Dog和Cat is a 动物 都是 extends Animal
02.子类要重写父类方法 ! eat()是重写了父类的方法
03.父类的引用指向了子类的对象! Animal x=new X(); X()子类的对象 多态的实际应用场景:
01.使用父类作为方法的参数! 我要买小动物! buy(Animal) buy(Dog) 对! 02.使用父类作为方法的返回值! 我要买小动物!
public Animal buy(Animal animal){
这个方法让我们返回一个Animal(动物)
我们返回一个Cat 小猫咪 行吗? 行!!!
return new Cat();
} **instanceof 判断某个对象 是否属于某个类型
所有的对象 instanceof Object 返回值都是true
2.代码
需求:
01.创建Dog Cat Animal 三个类
02.Dog Cat 分别继承 Animal
03.创建一个Master 主人类
04.在Master中新增一个 给宠物喂食的方法,方法的参数是???Animal
05.模拟主人给小动物 喂食的方法
/**
* 动物的抽象类
*/
public abstract class Animal { /**
* 所有动物的吃饭方法
*/
public abstract void eat(); }
多态
public class Cat extends Animal { @Override
public void eat() {
System.out.println("СèßäÔÚ³ÔÓã");
} }
多态
public class Dog extends Animal { @Override
public void eat() {
System.out.println("小狗狗在啃骨头");
} /**
* 小狗狗特有的游泳的方法
*/
public void swimming() {
System.out.println("小狗狗在游泳");
} }
多态
/**
* 宠物的主人类
*/
public class Master { /**
* 给所有宠物喂食的方法
* 有那么多小宠物? 喂谁???
* 关键点:
* 我们怎么知道 传递来的是 小猫咪还是小狗狗!!!
*
* instanceof 判断某个对象 是否属于某个类型
* 所有的对象 instanceof Object 返回值都是true
*/
public void feed(Animal animal) {
// animal.eat(); 那么子类中特有的方法我们无法访问
if (animal instanceof Dog) {
Dog dog = (Dog) animal;// 向下转型
dog.eat();
dog.swimming(); // 调用子类特有的方法
} else if (animal instanceof Cat) {
Cat cat = (Cat) animal;// 向下转型
cat.eat();
} }
}
多态
import java.util.Scanner; public class AnimalTest { public static void main(String[] args) {
// 实例化主人类
Master master = new Master();
System.out.println("请您选择需要喂食的宠物: 01.小猫咪 02.小狗狗");
Scanner input = new Scanner(System.in);
int choose = input.nextInt();
// 创建一个动物 抽象类 不能被实例化 具体是哪个动物我们不知道
Animal animal;
switch (choose) {
case 1: // 给小猫咪喂食
animal = new Cat(); // 父类的引用指向了子类的对象
master.feed(animal);
break;
case 2: // 给小狗狗喂食
animal = new Dog();
master.feed(animal);
break;
} }
}
多态
3.面试题
public class A {
/**
* ÏÂÃæÁ½¸ö·½·¨ÊÇÖØÔØ
*/
public String show(D d) {
return " A AND D";
} public String show(A a) {
return " A AND A";
} }
exam
public class B extends A { /**
* 下面两个方法是重载
*/
public String show(B b) {
return " B AND B";
} /**
*重写A类的方法
*/
public String show(A a) {
return " B AND A";
} }
exam
public class C extends B { }
exam
public class D extends B { }
exam
public class TestExam { public static void main(String[] args) {
A a1 = new A();
A a2 = new B(); // 父类的引用指向了子类的对象
B b = new B();
C c = new C();
D d = new D(); System.out.println(a1.show(b)); // A AND A
/**
* a1是A类的对象!
* 我们传递了一个C对象
* C类继承B类 ,B类继承A类
* 所以会执行 A类中的 show(A a)
*/
System.out.println(a1.show(c)); // A AND A
System.out.println(a1.show(d)); // A AND D
/**
* a2是父类的引用指向了子类的对象
* a2.show(b)应该去A类中查询 show()并且参数是B类型的!
* A类中没有参数为B的!
* 但是有参数是B类父类的方法的!show(A a)!
* 又因为子类B重写了A类的show(A a) 所以执行 B类的show(A a)
*/
System.out.println(a2.show(b)); // B AND A
System.out.println(a2.show(c)); // B AND A
System.out.println(a2.show(d)); // A AND D
System.out.println(b.show(b)); // B AND B
System.out.println(b.show(c)); // B AND B
/**
* b确实是B类的对象!
* 但是b.show(d)在B类中没有发现!
* 这时候 会去父类中查询 有没有对应的show(d) 因为B类继承了A类
* 所以说 A类中的 show(D d) B类中也有!只不过在A类中!
* A类中有就执行!否则就执行B类中的show(B b) 因为D类继承了B类
*/
System.out.println(b.show(d)); // A AND D } }
exam
OOP⑺的更多相关文章
- c#面向对象基础技能——学习笔记(二)基于OOP思想研究对象的【属性】
字段(成员变量): 字段只能从对象中访问实例字段,无法直接从类中访问(换言之,不创建实例就不能访问),可以理解为:字段一般用在内部数据交互使用,当需要为外部提供数据时,(要优先使用自动实现的属性而不是 ...
- 一个简单oop的changeTab
好多地方都会用到这样一个效果“点击tab切换内容页”,根据自己的想法实现了一下,写了个简单的插件.以前写代码都是标准的函数式编程,现在觉得面向对象编程看起来比较爽,并且更容易维护,于是就用oop的思想 ...
- Python OOP(面向对象编程)
一OOP的作用 在Python中,类是面向对象设计(OOP)的主要工具.通过使用类这种工具,OOP可以: 1.分解代码,最小化代码的冗余. 2.通过定制现有的代码,来编写新的程序,而不用在原处进行修改 ...
- OOP,WEB开发实用小技巧
偶然读到一篇博客,记录一下心得.这种设计对于新手来说一般是想不到的,它充分的发挥了OOP语言的特性,让代码专用而清爽.这是不是重构的思想呢? 我们在写业务层的时候,有很多方法是重复功能的,我们就可以使 ...
- 从OOP的角度看Golang
资料来源 https://github.com/luciotato/golang-notes/blob/master/OOP.md?hmsr=toutiao.io&utm_medium=tou ...
- 玩转JavaScript OOP[2]——类的实现
概述 当我们在谈论面向对象编程时,我们在谈论什么?我们首先谈论的是一些概念:对象.类.封装.继承.多态.对象和类是面向对象的基础,封装.继承和多态是面向对象编程的三大特性. JavaScript提供了 ...
- Atitit 面向对象编程(OOP)、面向组件编程(COP)、面向方面编程(AOP)和面向服务编程(SOP)的区别和联系
Atitit 面向对象编程(OOP).面向组件编程(COP).面向方面编程(AOP)和面向服务编程(SOP)的区别和联系 1. 面向组件编程(COP) 所以,组件比起对象来的进步就在于通用的规范的引入 ...
- iOS - 对OOA、OOD、OOP的理解
很多人在求职的时候,会遇到一个这样的问题:“对OOD/OOP有较深的理解”,这个时候有人就会问OOD.OOP是什么呢?那么今天咱们就一块来看一下OOA.OOD.OOP到底是什么! (一)OOA--面向 ...
- OOP感悟
行内讲的最多的就是出来一年内基本靠copy,一年后才基本懂得如何去写代码,而理解领悟oop,需要的时间却不定. 我工作中,我发现很多人拿着面向对相当的语言作者做着面向过程的事情,不需要知其所以然,只要 ...
- 初识JAVA之OOP
有一段时间没发博客了,每次手打还是很累,但感觉很充实.. 最近发现很多初学者到了面向对象编程这个知识点时,不太清楚类是如何转化成为对象的,很是困扰,今天我在这里谈谈我的理解,大家一起来研究学习... ...
随机推荐
- shell脚本linux命令连续执行
shell命令连续执行的三种方式: 1.命令1:命令2:命令3 依次执行命令,无论前一条命令是否执行成功. 2.命令1 && 命令2 && 命令3 前一条命令执行成功后 ...
- DEBUG(2)--函数的输入参数要做适当的检查
今天在调试程序时发现,在单步运行的情况下,程序执行没有问题,但是直接运行就会出问题.出问题的代码如下 for(int col=0;col<=9;++col) { int killid=Pos ...
- Tomcat部署项目定时任务跑了两次
在server.xml下面找到Host这行代码 <Host name="localhost" appBase="webapps" unpackWARs=& ...
- Linux中系统检测工具top命令
Linux中系统检测工具top命令 本文转自:https://www.cnblogs.com/zhoug2020/p/6336453.html 首先介绍top中一些字段的含义: VIRT:virtua ...
- SpringBoot集成ActiveMQ
前面提到了原生API访问ActiveMQ和Spring集成ActiveMQ.今天讲一下SpringBoot集成ActiveMQ.SpringBoot就是为了解决我们的Maven配置烦恼而生,因此使用S ...
- legend2---开发日志1(legend的数据库整体设计思路是什么)
legend2---开发日志1(legend的数据库整体设计思路是什么) 一.总结 一句话总结:不同种类的物品分不同的表放,不放到一个物品表里,取所有物品时一个个表的取就好了 不同种类的物品分不同的表 ...
- 在Winfrom 中,如何实现combox 的列表自动显示ToolTip提示 ?
//带ToolTip的combox类文件 public class ComboBoxWithTooltip : ComboBox { //tipProperty为显示ToolTip文本的数据源的属性 ...
- hdu-5985 概率DP
http://acm.hdu.edu.cn/showproblem.php?pid=5985 作为队里负责动态规划的同学,做不出来好无奈啊.思考了一个下午,最好还是参考了别人的思想才写出来,数学啊!! ...
- android--------自定义控件 之 ViewGroup
前面几篇讲了自定义控件的组合控件,地址:http://www.cnblogs.com/zhangqie/p/8985612.html 今天这篇博文主要来说说 自定义控件的 ViewGroup. 什么是 ...
- 宽度优先搜索BFS(Breadth-First-Search)
Breadth-First-Search 1. 与DFS的异同 相同点:搜索所有可能的状态. 不同点:搜索顺序. 2. BFS总是先搜索距离初始状态近的状态,它是按照:开始状态->只需一次转移就 ...