【Java】多态

概念

多态 是面向对象三大特征之一。

同一个对象,在不同的时刻表现出来的不同形态。

举例:狗

狗就是狗        狗 dog = new 狗();

我们也可以说 动物 animal = new 狗();

这里狗在不同的时刻表现出来的形态,这就是多态。

多态的前提和体现

  1. 有继承 / 实现关系
  2. 方法重写
  3. 有父类引用指向子类对象

示例代码:

AnimalParent.java

package com.面向对象.Demo22;public class AnimalParent {// 父类public void eat(){System.out.println("这是动物类 都有eat 方法");}
}

Dog.java

package com.面向对象.Demo22;public class Dog extends AnimalParent {// 子类/*** 多态的基本的条件* 1.有继承 或 实现(后面会学习到接口的概念)的关系* 2.方法的重写——子类重写父类的方法* 3.有父类的引用指向子类*/@Overridepublic void eat() {System.out.println("子类(狗类)重写了父类 eat 方法");}
}

AnimalDemo.java

package com.面向对象.Demo22;public class AnimalDemo {public static void main(String[] args) {// 本身的类型指向引用 new 本身的对象Dog dog = new Dog();dog.eat();// 有父类的引用指向子类对象  多态AnimalParent animalParent = new Dog();animalParent.eat();}
}

运行结果:


多态的访问特点

  • 成员变量:编译看左边,执行看左边;
  • 成员方法:编译看左边,执行看右边。

为什么成员变量和成员方法的访问不一样呢?

∵ 成员方法有重写,而成员变量是没有的。

示例代码:

AnimalParent.java

package com.面向对象.Demo22;public class AnimalParent {public int age = 20;// 父类public void eat() {System.out.println("这是动物类 都有eat 方法");}
}

Dog.java

package com.面向对象.Demo22;public class Dog extends AnimalParent {public int age = 10;public int weight = 20;// 子类/*** 多态的基本的条件* 1.有继承 或 实现(后面会学习到接口的概念)的关系* 2.方法的重写——子类重写父类的方法* 3.有父类的引用指向子类*/@Overridepublic void eat() {System.out.println("子类(狗类)重写了父类 eat 方法");}public void show(){}
}

AnimalDemo.java

package com.面向对象.Demo22;public class AnimalDemo {/*** AnimalParent animalParent = new Dog();* 成员属性 编译阶段是看左边(父类animalParent)执行也是看左边(父类animalParent);* 成员方法 编译阶段是看左边(父类animalParent)执行是看右边(子类Dog);* @param args*/public static void main(String[] args) {/*** 本身的类型指向引用 new 本身的对象* 非多态*/Dog dog = new Dog();dog.eat();System.out.println(dog.age);System.out.println(dog.weight);/*** 有父类的引用指向子类对象* 多态*/AnimalParent animalParent = new Dog();animalParent.eat();System.out.println(animalParent.age);//20,这个age 是父类animalParent里的 age
//        System.out.println(animalParent.weight);//报错,Cannot resolve symbol 'weight'(无法解析weight)//成员属性 编译阶段是看左边(父类animalParent),父类没有这个属性,所以报错//        animalParent.show();//报错,Cannot resolve method 'show' in 'AnimalParent'// 成员方法 编译阶段是看左边(父类animalParent),父类没有show这个方法,所以报错,//执行虽然看的右边 子类有show(),但是这个show()没有重写父类的show()// (父类没有show())所以,在编译阶段都报错,何谈执行阶段animalParent.eat(); // 输出:子类(狗类)重写了父类 eat 方法//父类和子类都有eat()方法,但是 执行是看右边的(子类Dog)里的eat()// Ctrl + Alt + 鼠标点击eat,可以看到都有那些类里面有eat()方法}
}

下一篇文章:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/124351.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL教程】| (1-1) 2023MySQL-8.1.0 安装教程

文章目录 一、安装包下载二、安装配置1、解压安装包2、编写MySQL配置文件3、初始化MySQL数据库3、安装mysql服务并启动4、MySQL服务5、连接MySQL6、修改密码 三、配置环境变量四、防止mysql自启动拖慢开机时间 近日有粉丝问到mysql在win11的安装中遇到一些问题,应粉…

智慧工地源代码 SaaS模式云平台

伴随着技术的不断发展,信息化手段、移动技术、智能穿戴及工具在工程施工阶段的应用不断提升,智慧工地概念应运而生,庞大的建设规模催生着智慧工地的探索和研发。 什么是智慧工地? 伴随着技术的不断发展,信息化手段、移…

C/C++学习 -- 分组加密算法(DES算法)

数据加密标准(Data Encryption Standard,DES)是一种对称密钥加密算法,是信息安全领域的经典之作。本文将深入探讨DES算法的概述、特点、原理,以及提供C语言和C语言实现DES算法的代码案例。 一、DES算法概述 DES算法是…

数据库存储引擎和数据类型详细介绍

目录 一、数据库存储引擎(了解)1.了解MySQL体系结构2.存储引擎(了解)2.1.存储引擎的介绍2.2.存储引擎分类2.3.如何选择引擎? 3.事务控制语言(TCL)事务的四个特性(ACID) 二、数据类型(了解)1.整型…

JavaScript系列从入门到精通系列第十二篇:JavaScript中对象的简介和对象的基本操作以及JavaScript中的属性值和属性名

文章目录 前言 一:对象分类 1:内建对象 2:宿主对象 3:自建对象 二:对象的基本操作 1:创建对象 2:向对象中添加属性 3:读取对象中的属性 4:修改对象中的属性 三…

《幸福之路》罗素(读书笔记)

目录 作者简介 作者的感悟 经典摘录 一、不幸福的成因 1、一部分要归咎于社会制度 2、一部分则得归咎于个人心理——当然,你可以说个人心理是社会制度的产物。 二、欠缺某些想要的东西,是快乐的必要条件 三、无聊与刺激 四、现代人的精神疲劳 五…

FFmpeg 命令:从入门到精通 | ffplay 播放控制选项

FFmpeg 命令:从入门到精通 | ffplay 播放控制选项 FFmpeg 命令:从入门到精通 | ffplay 播放控制选项选项表格图片 FFmpeg 命令:从入门到精通 | ffplay 播放控制选项 选项表格 项目说明Q,Esc退出播放F,鼠标左键双击全…

Vue实现Hello World

<div id"aa"> <p>{{h}}</p> </div> <script src"https://cdn.jsdelivr.net/npm/vue2/dist/vue.js"></script> <script> const hello new Vue({ el:#aa, data:{ h : Hello World } }) </script>

Appleid苹果账号自动解锁改密(自动解锁二验改密码)

目前该项目能实现以下功能&#xff1a; 多用户使用&#xff0c;权限控制多账号管理账号分享页&#xff0c;支持设置密码、有效期、自定义HTML内容自动解锁与关闭二步验证自动/定时修改密码自动删除Apple ID中的设备代理池与Selenium集群&#xff0c;提高解锁成功率允许手动触发…

python二次开发CATIA:为选中元素上色

先打开一个零件文档&#xff0c;然后用鼠标选中元素&#xff0c;再运行如下python程序&#xff1a; import win32com.client import pywintypes # 导入pywintypes模块 import random # 启动CATIA应用 catia win32com.client.Dispatch(CATIA.Application) catia.visible1try:…

基于Java的银行记账与审核系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

Linux CentOS7 vim多窗口编辑

我们在用vim编辑文件时&#xff0c;有各种需求。如有时需要在多个文件之间来回操作&#xff0c;一会关闭一个文件&#xff0c;一会再打开另外一个文件&#xff0c;这样来回操作显得太笨拙。有时&#xff0c;vim编辑多行的大文件&#xff0c;来回查看、编辑前面一部分及最后一部…