Day22:多态详解
方法的多态
1.1什么是多态?
指一个对象在不同时刻拥有不同的形态。
例:猫 cat=new 猫();
动物 animal=new 猫();
多态建立的条件:
- 建立在继承的关系上;
- 有方法重写;
- 有父类的引用指向子类对象(父类引用指向即 动物 animal)
我们通过代码进一步了解多态:
将多态建立的条件加入代码之中
//建立一个父类
public class Animals{
//创建父类方法
public void eat(){
System.out.println("动物在吃东西");
}
}
//建立一个子类
public class Cat extends Animals{//建立继承关系
//方法重写
public void eat(){
System.out.println("猫在吃鱼");
}
}
//建立一个测试类
public class Aplication{
public static void main(String[] args){
//建立父类的引用指向子类对象
Animals a=new Cat();
}
}
以上根据多态的三个前提条件我们建立了多态。
1.2多态中的成员访问特点
多态中的成员访问特点:
成员属性:编译和运行都看左边;
成员方法:编译看左边,运行看右边。
我们通过以下代码对特点进一步的了解:
//建立一个父类
public class Animals{
int age=40;
public void eat(){
System.out.println("动物在吃东西");
}
public void play(){
Sysem,out,println("动物在玩游戏");
}
}
//建立一个子类
public class Cat extends Animals{//建立继承关系
String name="花儿";
int age=5;
public void eat(){
System.out.println("猫在吃鱼");
}
public void shout(){
System.out.println("猫在叫");
}
}
//建立一个测试类
public class Aplication{
public static void main(String[] args){
Animals a=new Cat();
//分别调用成员并输出
Sytem.out.println(a.age);
Sytem.out.println(a.name);
Sytem.out.println(a.eat);
Sytem.out.println(a.play);
Sytem.out.println(a.shout);
}
}
//输出结果
40
ClassCastException
猫在吃鱼
动物在玩游戏
ClassCastException
我们来对结果进行分析:
父类中的成员属性有age;子类的成员属性有name、age
我们建立的对象引用是父类的;但对象的实际本质是子类对象
这也就将对象实例化分为了左右,而外界看到的则是左侧的引用类型
所以当我们调用属性、方法时,最开始编译就从左边开始,然后运行右边
引用类型为父类,其成员含有age、eat、play;当我们调用age、eat、play时,我们是能够成功调用的;而调用name(非父类成员)时发现报错
由此我们可以得出第一个结论:
多态现象中,我们可以调用什么成员是由左边的引用类型决定的!
我们从结果发现a.age的结果是父类的属性
由此我们得到第二个结论:
多态现象中,属性的编译和运行都是由左边的引用类型决定的!
我们从输出结果发现我们调用eat方法时,输出的结果却是子类eat方法(重写)的结果;而调用play(未重写)方法时,输出的是父类的play方法;而调用shout方法则无法调用
由此我们可以得出第三个结论:
多态现象中,方法的编译是看左边,运行是看右边!
总结以上结论:
成员属性:编译和运行都看左边;
成员方法:编译看左边,运行看右边。
Day22:多态详解的更多相关文章
- “全栈2019”Java第五十四章:多态详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- day22作业详解
1.面向对象作业1 2.作业详解 点击查看详细内容 #1. class Li(object): def func1(self): print('in func1') obj = Li() obj.fu ...
- Java基础进阶:多态与接口重点摘要,类和接口,接口特点,接口详解,多态详解,多态中的成员访问特点,多态的好处和弊端,多态的转型,多态存在的问题,附重难点,代码实现源码,课堂笔记,课后扩展及答案
多态与接口重点摘要 接口特点: 接口用interface修饰 interface 接口名{} 类实现接口用implements表示 class 类名 implements接口名{} 接口不能实例化,可 ...
- 18.Java 封装详解/多态详解/类对象转型详解
封装概述 简述 封装是面向对象的三大特征之一. 封装优点 提高代码的安全性. 提高代码的复用性. "高内聚":封装细节,便于修改内部代码,提高可维护性. "低耦合&quo ...
- C++多态详解
多态是面向对象的程序设计的关键技术.多态:调用同一个函数名,可以根据需要但实现不同的功能.多态体现在两个方面,我们以前学过的编译时的多态性(函数重载)和现在我们这一章将要学习的运行时的多态性(虚函数) ...
- 【转】java多态详解
1. Java中除了static和final方法外,其他所有的方法都是运行时绑定的.private方法都被隐式指定为final的,因此final的方法不会在运行时绑定.当在派生类中重写基 ...
- [置顶] JAVA从零单排4-----继承、封装和多态详解
继承 Java三大特征之一:继承.Java的继承具有单继承的特点,每个子类只能有一个直接父类. 继承的特点 Java的继承用extends关键字来实现,被继承的类成为父类,实现继承的类被称为子类.子类 ...
- java之多态详解
前言 什么叫多态?多态就是一种事物可以有多种表现形式 多态三要素 1.被动方必须有继承关系 2.子类一般都要重写父类方法 3.必须将主动方的功能函数的参数设置为 被动方父类的类型 举个例子司机开车 假 ...
- c# 中的封装、继承、多态详解
面向对象有封装.继承.多态这三个特性,面向对象编程按照现实世界的特点来管理复杂的事物,把它们抽象为对象,具有自己的状态和行为,通过对消息的反应来完成任务.这种编程方法提供了非常强大的多样性,大大增加了 ...
- C++ 多态详解及常见面试题
今天,讲一讲多态: 多态就是不同对象对同一行为会有不同的状态.(举例 : 学生和成人都去买票时,学生会打折,成人不会) 实现多态有两个条件: 一是虚函数重写,重写就是用来设置不同状态的 二是对象调 ...
随机推荐
- OpenFOAM编程 | Hello OpenFOAM
写在前面 OpenFOAM 是一个非常好用的开源程序包,笔者一直在研究和使用,其编程语言是笔者非常喜欢使用的 C++.但是笔者不是很喜欢 OpenFOAM 自己的构建工具 wmake,更倾向于使用 C ...
- 使用C#编写一个.NET分析器(一)
译者注 这是在Datadog公司任职的Kevin Gosse大佬使用C#编写.NET分析器的系列文章之一,在国内只有很少很少的人了解和研究.NET分析器,它常被用于APM(应用性能诊断).IDE.诊断 ...
- ConcurrentDictionary<T,V> 的这两个操作不是原子性的
好久不见,马甲哥封闭居家半个月,记录之前遇到的一件小事. ConcurrentDictionary<TKey,TValue>绝大部分api都是线程安全且原子性的, 唯二的例外是接收工厂委托 ...
- Github-CLI
Github-CLI Github 的官方命令行工具 Github CLI.Mac 系统可以通过 homebrew 安装或者直接下载免安装包来使用. 命令 Github CLI 的所有命令均以gh开头 ...
- LVGL 虚拟键盘使用
一.使用例程 二.使用方式 函数的详细说明请看 lv_keyboard.h 文件 创建对象 lv_obj_t * lv_keyboard_create(lv_obj_t * parent); lv_o ...
- Alertmanager集成Dingtalk/Wechat/Email报警
grafana对报警的支持真的很弱,而Prometheus提供的报警系统就强大很多 Prometheus将数据采集和报警分成了两个模块.报警规则配置在Prometheus Servers上,然后发送报 ...
- core-js/modules/es.error.cause.js 报错
解决方法: 1.先删除 node_modules 依赖 npm rm -rf node_modules 2.首先安装 报错的插件 npm install --save core-js 3.最后再 np ...
- Linux+Wine玩火影忍者究极风暴3指南
如果你的系统没有Wine先装Wine,Wine在各大发行版的源都能找到.记住32位和64位的Wine都要装 去https://www.playonlinux.com/wine/binaries/pho ...
- C字符串和C++中string的区别
在C++中则把字符串封装成了一种数据类型string,可以直接声明变量并进行赋值等字符串操作.以下是C字符串和C++中string的区别: C字符串 string对象(C++) 所需的头文件名称 ...
- 洛谷P1725 琪露诺 (单调队列/堆优化DP)
显然的DP题..... 对于位置i,它由i-r~i-l的位置转移过来,容易得到方程 dp[i]=dp[i]+max(dp[i−r],...,dp[i−l]). 第一种:n2的暴力,只能拿部分分. 1 ...