方法的多态

1.1什么是多态?

指一个对象在不同时刻拥有不同的形态。

例:猫 cat=new 猫();

​ 动物 animal=new 猫();

多态建立的条件:

  1. 建立在继承的关系上;
  2. 有方法重写;
  3. 有父类的引用指向子类对象(父类引用指向即 动物 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:多态详解的更多相关文章

  1. “全栈2019”Java第五十四章:多态详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  2. day22作业详解

    1.面向对象作业1 2.作业详解 点击查看详细内容 #1. class Li(object): def func1(self): print('in func1') obj = Li() obj.fu ...

  3. Java基础进阶:多态与接口重点摘要,类和接口,接口特点,接口详解,多态详解,多态中的成员访问特点,多态的好处和弊端,多态的转型,多态存在的问题,附重难点,代码实现源码,课堂笔记,课后扩展及答案

    多态与接口重点摘要 接口特点: 接口用interface修饰 interface 接口名{} 类实现接口用implements表示 class 类名 implements接口名{} 接口不能实例化,可 ...

  4. 18.Java 封装详解/多态详解/类对象转型详解

    封装概述 简述 封装是面向对象的三大特征之一. 封装优点 提高代码的安全性. 提高代码的复用性. "高内聚":封装细节,便于修改内部代码,提高可维护性. "低耦合&quo ...

  5. C++多态详解

    多态是面向对象的程序设计的关键技术.多态:调用同一个函数名,可以根据需要但实现不同的功能.多态体现在两个方面,我们以前学过的编译时的多态性(函数重载)和现在我们这一章将要学习的运行时的多态性(虚函数) ...

  6. 【转】java多态详解

    1.        Java中除了static和final方法外,其他所有的方法都是运行时绑定的.private方法都被隐式指定为final的,因此final的方法不会在运行时绑定.当在派生类中重写基 ...

  7. [置顶] JAVA从零单排4-----继承、封装和多态详解

    继承 Java三大特征之一:继承.Java的继承具有单继承的特点,每个子类只能有一个直接父类. 继承的特点 Java的继承用extends关键字来实现,被继承的类成为父类,实现继承的类被称为子类.子类 ...

  8. java之多态详解

    前言 什么叫多态?多态就是一种事物可以有多种表现形式 多态三要素 1.被动方必须有继承关系 2.子类一般都要重写父类方法 3.必须将主动方的功能函数的参数设置为 被动方父类的类型 举个例子司机开车 假 ...

  9. c# 中的封装、继承、多态详解

    面向对象有封装.继承.多态这三个特性,面向对象编程按照现实世界的特点来管理复杂的事物,把它们抽象为对象,具有自己的状态和行为,通过对消息的反应来完成任务.这种编程方法提供了非常强大的多样性,大大增加了 ...

  10. C++ 多态详解及常见面试题

    今天,讲一讲多态: 多态就是不同对象对同一行为会有不同的状态.(举例 : 学生和成人都去买票时,学生会打折,成人不会) 实现多态有两个条件: 一是虚函数重写,重写就是用来设置不同状态的   二是对象调 ...

随机推荐

  1. 【Java面试】面试遇到宽泛的问题,这么回答就稳了,谈谈你对Redis的理解

    "谈谈你对Redis的理解"! 面试的时候遇到这类比较宽泛的问题,是不是很抓狂? 是不是不知道从何开始说起? 没关系,今天我用3分钟教你怎么回答. 大家好,我是Mic,一个工作了1 ...

  2. 基于HBuilderX+UniApp+ThorUI的手机端前端的页面组件化开发经验

    现在的很多程序应用,基本上都是需要多端覆盖,因此基于一个Web API的后端接口,来构建多端应用,如微信.H5.APP.WInForm.BS的Web管理端等都是常见的应用.本篇随笔继续分析总结一下项目 ...

  3. int和String的相互转化

    int和String的相互转化 将int转化为String 通过valueof( )方法进行转化 int a=100;String num1=String.valueOf(a);        Sys ...

  4. MinIO存储桶通知指南

    官方文档地址:http://docs.minio.org.cn/docs/master/minio-bucket-notification-guide 存储桶(Bucket)如果发生改变,比如上传对象 ...

  5. 面试突击86:SpringBoot 事务不回滚?怎么解决?

    在 Spring Boot 中,造成事务不自动回滚的场景有很多,比如以下这些: 非 public 修饰的方法中的事务不自动回滚: 当 @Transactional 遇上 try/catch 事务不自动 ...

  6. 关于AWS-EC2或者多个资源的tag的批量添加-基于Resource Groups & Tag Editor 和 命令处理

    今天收到一个请求,需要对公司所有的ec2-添加上两个成本IO标签,因为机器太多了 想到了如下两种方案去批量处理 方案一:利用aws的 [Management Tools]下的 Resource Gro ...

  7. 在Tomcat中启用虚拟线程特性

    前提 趁着国庆前后阅读了虚拟线程相关的源码,写了一篇<虚拟线程 - VirtualThread源码透视>,里面介绍了虚拟线程的实现原理和使用示例.需要准备做一下前期准备: 安装OpenJD ...

  8. FluentValidation 验证(一):WebApi 中使用 基本使用

    FluentValidation.AspNetCore 引入包 public class Login2RequestValidator : AbstractValidator<Login2Req ...

  9. hmtl5 web SQL 和indexDB

    前端缓存有cookie,localStorage,sessionStorage,webSQL,indexDB: cookie:有缺点 localStorage:功能单一 sessionStorage: ...

  10. Failed to convert from type [java.lang.String] to type [java.util.Date] for value '2020-02-06'; nested exception is java.lang.IllegalArgumentException]解决

    今天做springbook项目前端输入日期传到数据库保存报了一下错误 Whitelabel Error Page This application has no explicit mapping fo ...