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
有一段时间没发博客了,每次手打还是很累,但感觉很充实.. 最近发现很多初学者到了面向对象编程这个知识点时,不太清楚类是如何转化成为对象的,很是困扰,今天我在这里谈谈我的理解,大家一起来研究学习... ...
随机推荐
- Android集成人脸识别demo分享
本应用来源于虹软人工智能开放平台,人脸识别技术工程如何使用? 1.下载代码 git clone https://github.com/andyxm/ArcFaceDemo.git 2.下载虹软人脸识别 ...
- pipenv安装.whl
windows下很多库安装不方便,主要是编译C之类的. 之前这样做: 1去https://www.lfd.uci.edu/~gohlke/pythonlibs/ 下载各种版本编译好的.whl 2 pi ...
- (转载)Attempting to add QLayout "" to MainWindow "", which already has a layout
给QWidget或者QDialog设置布局的时候方式很简单.创建好一个布局:mainLayout,然后不停地把各个控件往mainLayout里面放,最后调用setLayout(mainLayout)就 ...
- Qt访问注册表并调用子进程
在实际应用中需要在一个进程启动另外一个进程,可以将子进程的路径写入注册表中,然后主进程读取注册表中子进程路径,启动子进程,并以命令行参数的形式传入参数,启动子进程.具体实现方式如下 (1) ...
- type convert
背景# 在开发中,我们会碰到诸如String类型转换为Int等等问题,虽然处理起来简单,但是本着DRY(Don't Repeat Yourself )原则,还是有必要封装处理下: 具体代码:Maste ...
- hdoj1043
8数码问题有解:除0外逆序数%2相等.16数码有解:除0外,如果0的行数相差奇数个,逆序也差奇数个,vice versa.
- 动手动脑java异常处理
1>请阅读并运行AboutException.java示例,然后通过后面的几页PPT了解Java中实现异常处理的基础知识. import javax.swing.*; class AboutEx ...
- 电脑用U盘启动
除了根据提示按DEL或者F2进入到BIOS界面更改设置之外. 还可以在开机时按F8或F12进入到引导界面,可直接选择USB. 当把登录用户登录,其他用户都被禁用时,电脑登不进去.要制作启动U盘,进入到 ...
- Windows下如何使用Heroku
1. 安装 进入https://devcenter.heroku.com/articles/heroku-cli#windows,选择对应版本安装 安装后使用heroku -v可检查版本号 2. 登陆 ...
- sql百万级查询优化(转)
< 数据库技术内幕 > 处理百万级以上的数据提高查询速度的方法: 1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进 ...