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
有一段时间没发博客了,每次手打还是很累,但感觉很充实.. 最近发现很多初学者到了面向对象编程这个知识点时,不太清楚类是如何转化成为对象的,很是困扰,今天我在这里谈谈我的理解,大家一起来研究学习... ...
随机推荐
- Python全栈开发-Day5-常用模块学习
本节大纲: 模块介绍 time &datetime模块 random os sys shutil shelve xml处理 pyyaml处理 configparser hashlib re正则 ...
- 修改TP5中common模块默认不能使用问题
在TP5框架中common模块是一个特殊的模块,默认是禁止直接访问的,一般用于放置一些公共的类库用于其他模块的继承.其实是可以访问common模块的, 只需要把convention.php文件中的 / ...
- python爬虫学习(二):定向爬虫例子-->使用BeautifulSoup爬取"软科中国最好大学排名-生源质量排名2018",并把结果写进txt文件
在正式爬取之前,先做一个试验,看一下爬取的数据对象的类型是如何转换为列表的: 写一个html文档: x.html<html><head><title>This is ...
- Getting started with Processing 第七章总结
媒体 如何将文件导入 Processing 中 在 Processing 中,程序是通过应用 data 文件夹中的文件来显示的,这个文件夹可以通过菜单栏中的 Sketch>show sketch ...
- 20165327 2017-2018-2《Java程序设计》课程总结
20165327 2017-2018-2<Java程序设计>课程总结 预备作业一:我期望的师生关系 预备作业二:学习基础和C语言基础调查 预备作业三:预备作业3 Linux安装及学习 第一 ...
- springboot ----> sts如何启动两个实例
idea 实现启动两个spring boot工程实例的方法 可以参考这篇博客. 因为使用spring tool suite 学习spring cloud 需要实例化两个spring boot 工程来构 ...
- 可访问范围 与 visual 或 abstract “修饰符”
protected:在当前类内定义,则在当前类“内部”可以调用,则在 派生子类"内部" 也可以调用 private,除去,在 派生子类"内部" 也可以调用,其它 ...
- 8.2 DRAM和SRAM
计算机组成 8 存储层次结构 8.2 DRAM和SRAM SRAM比较快,DRAM比较慢:SRAM比较贵,DRAM比较便宜.记住这些结论是很容易的,但是比是什么更重要的是为什么.那在这一节我们就从电路 ...
- LeetCode--429--N叉树的层序遍历
问题描述: 给定一个N叉树,返回其节点值的层序遍历. (即从左到右,逐层遍历). 例如,给定一个 3叉树 : 返回其层序遍历: [ [1], [3,2,4], [5,6] ] 说明: 树的深度不会超过 ...
- PaaS平台型IT运维&运营模式能给企业带来什么?
关注嘉为科技,获取运维新知 什么是PaaS平台型IT自动化运维&运营模式 PaaS平台型IT运维和运维模式是指:将通用的运维能力与具体的运维场景解耦合,将能够复用的,具备独立功能的通用能力纳入 ...