Java自学手记——多态
对象转型
学习多态前先明白一个叫对象转型的概念,如:
1 class Animal{ 2 void sleep(){ 3 System.out.println("睡觉"); 4 } 5 } 6 7 class Cat extends Animal{ 8 void catchMouse(){ 9 System.out.println("捕鼠"); 10 } 11 } 12 13 class Dog extends Animal{ 14 15 } 16 17 public class Test { 18 19 public static void main(String[] args) { 20 Animal a = new Cat(); //向上转型 21 Cat c = (Cat) a; //向下转型 22 c.catchMouse(); 23 // Dog d = (Dog) a; 运行时会报错,a实际是Cat,不能转成Dog,两者没有关系 24 System.out.println(a instanceof Animal); 25 } 26 27 }
Cat向上转型之后,视为Animal类,只能访问到父类中的成员,而不能访问Cat中的成员,如需访问,需再次强制转向下转换成Cat类,使用多态过程中,一般都默认会涉及到对象转型。
多态概述
多态体现在父类引用指向子类对象。实现多态的前提是:1.类与类之间存在关系,可以是继承关系或者是实现关系;2.而且子类中必须要有方法的重写;3.有父类或者父类接口引用指向子类对象。代码示例:
1 class Animal{ 2 void sing(){ 3 System.out.println("唱歌"); 4 } 5 } 6 7 class Cat extends Animal{ 8 void sing(){ 9 System.out.println("喵喵"); 10 } 11 } 12 13 class Dog extends Animal{ 14 void sing(){ 15 System.out.println("汪汪"); 16 } 17 } 18 19 public class Test { 20 21 public static void main(String[] args) { 22 Cat c = new Cat(); 23 function(c); 24 // Dog d = new Dog(); 25 // function(d); 26 } 27 28 public static void function(Animal a){ //相当于Animal a = new Cat()对象转型 29 a.sing(); 30 } 31 32 }
这段代码最终运行输出的是:喵喵。主函数中创建了一个c对象,并调用function方法,很明显function方法中参数为Animal a,由于Cat继承了Animal,没有问题,可是最终输出为什么不是Animal中的方法唱歌,这是由多态成员方法的特点来决定的。
1.编译期间:参阅的是引用型变量所属的类中是否有调用的方法,很明显这里的Animal是有方法的sing的;
2.运行期间:参阅对象所属的类中是否有调用方法,很明显这里的Cat中也是有sing方法的;
所以最终运行出来的是Cat中的方法。也就是说子类中必须要有重写,才是多态。
多态的分类
1.具体类多态,如:
1 class Fu{] 2 3 class Zi extends Fu {} 4 5 Fu f = new Zi();
2.抽象类多态,如:
abstract class Fu {} class Zi extends Fu {} Fu f = new Zi();
3.接口多态,如:
interface Fu{} class Zi implements Fu{} Fu f = new zi();
多态中的成员访问特点
1.对于成员变量:编译看左边,运行看左边。(即编译的时候检查父类中是否存在该变量名,运行的时候访问的也是父类中该变量的值)
2.对于构造方法:子类的构造都会默认访问父类构造。
3.对于成员方法:编译看左边,运行看右边。
4.对于静态方法:编译看左边,运行看右边。
转载于:https://www.cnblogs.com/elecdog/p/4749840.html
Java自学手记——多态相关推荐
- java自学手记——继承
java面向对象三大特点封装.继承和多态.继承作为三大特点之一,主要是为了实现多态的,即多态的前提条件是继承.代码示例: 1 class Person{ 2 String name; 3 String ...
- Java自学手记——servlet3.0新特性
servlet3.0出来已经很久了,但市场上尚未普遍应用,servlet3.0有三个比较重要的新特性:使用注解来代替配置文件,异步处理以及上传组件支持. 支持servlet3.0的要求:MyEclip ...
- 《 郝斌 java自学视频 完结 》_《[郝斌]Java自学视频[完结]》AVI[压缩包]
中文名: [郝斌]Java自学视频[完结]资源格式: 压缩包版本: AVI发行时间: 2009年地区: 大陆对白语言: 普通话文字语言: 简体中文简介: 特别说明: 视频原始来源为互联网,原始格式为F ...
- 有什么好的Java自学教程视频,适合初学者
动力节点Java培训最新上线Java实验班,等你来测试自己适不适合学习Java编程哦! 随着互联网的发展,视频教程充斥着网络,很多人为了能够在视频教程中捞取一桶金,纷纷投入视频售卖的大军之中,其中不乏 ...
- JAVA自学笔记08
JAVA自学笔记08 1.构造方法私有,外界就不能再创建对象 2.说明书的制作过程 1)写一个工具类,在同一文件夹下,测试类需要用到工具类,系统将自动编译工具类:工具类的成员方法一般是静态的,因此在测 ...
- Java自学笔记——Java面向对象——04.抽象类、接口、内部类
Java 面向对象各节 Java自学笔记--Java面向对象--01.回顾方法 Java自学笔记--Java面向对象--02.构造器.类和对象 Java自学笔记--Java面向对象--03.封装.继承 ...
- 我与Java的故事以及0基础Java自学之路(2022最新版)
文章目录 我与Java的故事 一.JSP.Servlet推荐自学路线 二.Spring推荐自学路线 三 SpringMVC推荐自学路线 四 Mybatis.MyBatisPlus推荐自学路线 五 Sp ...
- Java 自学路线图之 Java 进阶自学
文章目录 Java 自学路线图的第二阶段是 Java 语言进阶自学,在自学了第一阶段的 Java 基础自学后,大家对 Java 语言编程有了初步的了解和认识,建议在第一部分自学后整理一下自己的自学思路 ...
- java自学能学会吗_自学java能学会吗?有没有捷径能尽快学会?
作为一种灵活多变,前景可瞻,又易学习的编程语言,Java备受年轻人关注,很多开发爱好者,或者想从事Java开发的年轻人放出豪言"我要自学Java,拿高薪,走上人生巅峰" 但是:Ja ...
最新文章
- 彻底理解大数据 HDFS 分布式文件系统,这篇就够了
- 我的android studio开发环境搭建历程(一部辛酸史)
- Codeforces Round #311 (Div. 2) A. Ilya and Diplomas 水题
- oracle vm virtualbox 无法安装mac,【总结】在VirtualBox上面安装Mac的注意事项
- c语言里 如何取得线程的lpparameter'参数,请问线程函数如何访问对话框类中的变量...
- matlab 动画_MATLAB绘图动画(1)
- cad考试题库绘图题答案_2019年低压电工作业操作证考试最新版题库及答案(一)...
- 电脑qq收藏在哪里打开_外贸询盘怎么来?零成本用Linkedin批量开发客户!外贸人收藏...
- Windows下80端口被进程SystemPID=4占用的解决方法
- shell编程cp强制覆盖拷贝时仍需确认问题的处理方法
- 传智播客 网络通信过程学习笔记
- rk3399调试ov2659(camera模块@dvp接口)--移植过程
- 什么是计算机网络中域名,什么是域名?
- 华为手机灵敏度设置_和平精英灵敏度怎么调最稳华为手机?华为二指灵敏度调整设置一览[多图]...
- 安装kubernetes_如何在Kubernetes中安装和使用Linkerd
- 数据库实验三 嵌套查询和视图操作
- 菜鸟、大牛和教主,三者的区别
- LVGL之学习篇(一)
- 控制霍尔编码器电机(有刷)的一个思路
- 【HDOJ】4607 Park Visit_天涯浪子_新浪博客
热门文章
- java home bin java home jre bin_Tomcat 启动找不到配置好的 $JAVA_HOME和$JRE_HOME 变量?
- python文档字符串格式_Python字符串及文本模式方法详解
- 怎么查看任天堂账号是哪个服务器的,科普:任天堂账号和NS的本地用户有什么区别?...
- 用python写三角形_python写个三角形的问题
- php 类自动执行方法,php类讲解8:PHP 自动加载类 __autoload() 方法
- 缓存穿透、缓存击穿、缓存雪崩概述缓存一致性的解决方案
- python 爬取网页内容 snmp_python通过SNMP协议收集服务器监控信息
- PG基于repmgr实现自动和手动故障切换
- mysql 5.6安装图解 linux_Windows下MySQL 5.6安装及配置详细图解
- java 线程退出cmd_java 线程的终止与线程中断