辉仔日记之学代码第八期——葫芦娃原来是多态!
目录
一、多态小故事
二、走进多态
1、多态继承的三个必要条件
三、具体多态
四、抽象类多态
1、认识抽象类:
2、抽象类的特点:
五、接口类多态
1、认识接口
2、接口类的特点
前言:多态,顾名思义是对象有多种形态。继承是多态的基础,没有继承就没有多态。多态分为具体多态、抽象多态和接口多态。下面我们将从这三个方面具体的为大家介绍多态。
一、多态小故事
多态其实有点像葫芦娃的感觉,七个兄弟,七中不同的能力,他们的思想都传承于爷爷,都要降妖除魔!只是各自的方法不同!
爷爷说:孙儿们啊,一定要长大出掉蝎子精和蛇精啊!
大娃说:爷爷看我的,我用巨石砸死他们!
二娃说:“爷爷别怕我有顺风耳和千里眼!”
三娃说:“爷爷看我用千里眼、顺风耳去帮大娃!”
四娃说:“爷爷我会喷火!,让我烧了他们!”
五娃说:“我会喷水,让我淹了这些妖怪!!!”
六娃说:“我会隐身,我去救哥哥他们!”
七娃说:“爷爷看我,用我的宝葫芦,收了这些妖怪!”
因为爷爷教育葫芦娃要降妖除魔,保卫一方平安!所以每个葫芦娃都有自己的绝招来斩妖除魔!爷爷并没有说怎么除魔!所以每个葫芦娃都有自己的方法!在面对对象的多态里面,“爷爷”就像一个抽象类,“葫芦娃”继承了爷爷的思想,并用自己的方法除魔!每个“葫芦娃”就是子类拥有自己独特的属性和行为。比如火娃能喷火,水娃能喷水,都有自己独特的属性,便有不同的行为!
蛇精的如意,蝎子精也可以用!如意可以理解为一个接口!我可以继承到我的实现类蛇精和蝎子精身上!
讲到这里大概应该有个大概的了解了!那么辉仔带大家更加理论的学习多态!
二、走进多态
多态就是对象面对不同事物,在不同时刻,具有不同的形态。就像你用steam玩游戏,你可能会玩自由城类的GTA5、也有可能玩大逃杀模式PUBG、还有可能玩FPS竞技的CSGO。他们的共性都是通过steam这个游戏平台进行游戏,但是在不同的时刻,具有不同的内容与表现形式。你可以随意在steam添加游戏或者删除游戏,说明了其有很强的扩展性与替换性。并且每个游戏互不冲突,你玩CSGO的时候,不会影响其他游戏的运行。说明了减少了耦合行。
通过steam这个列子我们能发现,多态具有以下优点
优点1:扩展性和替换性强。 优点2:减少了类与类之间的耦合性
优点3:灵活性和简化性。
1、多态继承的三个必要条件
继承、子类重写父类方法、父类引用指向子类对象。
三、具体多态
我个人理解具体类多态,就是父类能够被实例化,可以实现自己的具体行为的。子类可以调用父类的方法和子类自己特有的方法。在实际使用中其实几乎不用。没有多大的意义。所以这里只进行简单的描述。
四、抽象类多态
1、认识抽象类:
什么是抽象类呢?我理解的抽象类是多个具有共性的子类归纳出来的一个父类。是一个由下到上的一个过程。就像中国人用筷子吃饭、印度人用手抓饭、欧洲人习惯用刀叉吃饭。他们的共性就是吃饭的方式,具体的实现都是不同的。是一般到特殊的过程。而他们的共性归纳出了这个抽象类,因为一个父类无法具体实现三种不同的行为,它只需要一种模糊的概念——吃饭的方式,具体怎么吃,那就用子类自己去实现。
2、抽象类的特点:
①抽象类必须用abstract来修饰。
public abstract class 类名 {}
②抽象类中的抽象方法,可以有,也可以没有。但是!没有的话就没啥意义。
public abstract void 方法名();
③抽象如何实例化,采用多态的方式,这就是抽象类的多态。
向上转型:父类 对象名 = new 子类()
编译看父类,执行看子类。缺点:不能实例化子类特有的方法。
向下转型:子类 对象名 = (子类)父类引用
④ 抽象类的成员特点。
❶成员变量 ❷构造方法 ❸成员方法
既可以是变量 空参构造 抽象方法
也可以是常量 空参构造 普通方法
代码测试:
//抽象类
public abstract class Animal {private int age = 20;private final String city = "北京";public Animal() {}public Animal(int age) {this.age = age;}public void show() {age = 40;System.out.println(age);
// city = "上海";System.out.println(city);}public abstract void eat();}//猫类
public class Cat extends Animal {@Overridepublic void eat() {System.out.println("猫吃鱼");}
}//测试类
public class AnimalDemo {
public static void main(String[] args) {Animal a = new Cat();a.eat();a.show();}
}
五、接口类多态
1、认识接口
如果要给接口下定义,那么是这样的,接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用。接口注重的是对行为的抽象,而抽象是对属性和行为的抽象。一般情况下类只能继承一个抽象类。所以抽象类主要表达对象根源性问题,就是对象是什么。而接口侧重于对象能做什么。就像学生会跑,狗会跑,他们的共性是跑这样理解就不太对了。学生是人,狗是动物。他们的行为,可以用接口实现。这样抽象类回到了自己的本质工作上,接口就单纯的变成一个体系外的额外功能。说明接口是由上到下,是因为有这个行为,才实例到有需求的类上。
2、接口类的特点
①接口类必须用interface来修饰。
public interface 接口名 {}
②类实现接口用implements表示
public class 类名 implements 接口名 {}
③接口如何实例化,采用多态的方式,这就是接口类的多态。
④ 接口的实例,要不重写接口的抽象方法,要不实例进行抽象。
⑤接口成员特点
❶成员变量
只能是常量,默认修饰符为:public static final
❷构造方法
接口中没有构造方法
❸成员方法
接口中可以有抽象方法,默认修饰符为:public abstract
⑥接口中还可以存在默认方法、静态方法和私有方法
❶默认方法
格式:
public default void show3() { }
解释:
默认方法不是抽象方法,所以不强制被重写。但是可以被重写,重写的时候去掉default关键字 (public可以省略,default不能省略)。
❷静态方法
格式:
public static 返回值类型 方法名(参数列表) { }
public static void show() {}解释:
静态方法只能通过接口名调用,不能通过实现类名或者对象名调用
( public可以省略,static不能省略)
❸私有方法
格式:
private static void method() { }
解释:
默认方法可以调用私有的静态方法和非静态方法
静态方法只能调用私有的静态方法
代码测试:
//动物类
public abstract class Animal {private String name;private int age;public Animal() {}public Animal(String name, int age) {this.name = name;this.age = 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 abstract void eat();
}//跳高接口
public interface Jumpping {public abstract void jump();
}//猫类
public class Cat extends Animal implements Jumpping {public Cat() {}public Cat(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println("猫吃鱼");}@Overridepublic void jump() {System.out.println("猫可以跳高了");}
}//测试类
public class Cat extends Animal implements Jumpping {public Cat() {}public Cat(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println("猫吃鱼");}@Overridepublic void jump() {System.out.println("猫可以跳高了");}
}
辉仔故事也讲了,理论也讲了,希望大家多多点赞呀!评论!每一次点赞都是对辉仔的激励!!!
辉仔日记之学代码第八期——葫芦娃原来是多态!相关推荐
- 辉仔日记之学代码第十八期——Mysql事务
目录 一.事务的概念和特性 1.概念: 2.特性: 二.MySQL存储引擎 三.执行事务的语法和流程 1.事物的创建 2.注意事项 四.事务的隔离级别 1.事务并发问题是如何产生的? 2事务并发问题: ...
- 辉仔日记之学代码第三期——家庭收支小程序
目录 标题1:操作主流程 标题2:主菜单 标题3:选项1 标题4:选项2 标题5:选项3 标题6:回到选项1 标题7:选项4 标题8:总结 前言::时隔一天我又回来啦,今天的任务只是编写一个超难超难的 ...
- 辉仔日记之学代码第十一期——集合来开会
目录 一.Collection是个单列集合 1.集合的Iteratoriterator遍历方法 二.Collection的子类Set接口 1.Set集合的特点 2.Set集合最常用的HashSet 3 ...
- 辉仔日记之学代码第十五期——IO流图书管理系统
嚯嚯嚯!今天也是写日记的一天啦! 温故而知新,完成了一个项目,及时总结才能继续成长!在写图书管理系统想过放弃,因为太多要注意的点,各种各样的问题.重打了很多的代码,几乎是推到重来!功夫不负有心人,果然 ...
- 辉仔日记之学代码第二十一期——单例模式
单例模式的定义 单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式. 单例模式有 3 个特点 单例类只有一个实例对象: 该单例对象必须由单例类自行创建: 单 ...
- 编程迷宫_跟我学编程第十期——迷宫游戏
编程改变世界 图源:APPLE官网 01 效 果 演 示 IEffect demonstration 跟我学编程公益课程又和你见面了!这期ray老师将带大家来学习编程制作一个迷宫小游戏! 怎么样,你也 ...
- [老老实实学WCF] 第八篇 实例化
老老实实学WCF 第八篇 实例化 通过上一篇的学习,我们简单地了解了会话,我们知道服务端和客户端之间可以建立会话连接,也可以建立非会话连接,通信的绑定和服务协定的 ServiceContract 的S ...
- 优化if-else代码的八种方案
前言 代码中如果if-else比较多,阅读起来比较困难,维护起来也比较困难,很容易出bug,接下来,本文将介绍优化if-else代码的八种方案. 优化方案一:提前return,去除不必要的else 如 ...
- 下载的长数据怎么分开R语言_R语言学习笔记(一):学代码,我们从最基础的开始...
*本文是本人在学习 res method 课程中反复学不会被自己蠢到的笔记作品,仅供本人娱乐使用,如果恰好里面的内容也能帮到你,那可真是太好了. 同学们,我们这节课来学习R语言,那么我们为什么要学习R ...
最新文章
- 徒手撸框架--实现 RPC 远程调用
- 计算机调查取证分析篇
- Focal Loss升级 E-Focal Loss让Focal Loss动态化,类别极端不平衡也得到提升
- scrapy的name变量_python-将file_name参数传递给管道以在scrapy中...
- boost::fusion::as_deque用法的测试程序
- php音频添加语音,PHP生成语音
- iphone如何使用CoreNFC
- VS编译器安装Eigen
- eslint是什么_一起来用 eslint 吧
- Since WWDC released the first developer
- Git显示漂亮日志的小技巧
- Gerrit代码提交: [remote rejected] prohibited by gerrit: ref update access denied报错解决
- 第一财经周刊:硅谷就是这样
- 人工智能必备知识储备之“数学篇”
- Xshell使用教程及WinSCP使用教程
- RHEL8【基础篇】 更改hostname
- interpersonal skill training
- 利用tabindex修复luckysheet点击工具栏按钮后Ctrl+z无效的问题
- Matlab求解线性方程组的三种方法(wzl)
- 仙境传说RO:添加商店物品教程