对象转型

  学习多态前先明白一个叫对象转型的概念,如:

 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自学手记——多态相关推荐

  1. java自学手记——继承

    java面向对象三大特点封装.继承和多态.继承作为三大特点之一,主要是为了实现多态的,即多态的前提条件是继承.代码示例: 1 class Person{ 2 String name; 3 String ...

  2. Java自学手记——servlet3.0新特性

    servlet3.0出来已经很久了,但市场上尚未普遍应用,servlet3.0有三个比较重要的新特性:使用注解来代替配置文件,异步处理以及上传组件支持. 支持servlet3.0的要求:MyEclip ...

  3. 《 郝斌 java自学视频 完结 》_《[郝斌]Java自学视频[完结]》AVI[压缩包]

    中文名: [郝斌]Java自学视频[完结]资源格式: 压缩包版本: AVI发行时间: 2009年地区: 大陆对白语言: 普通话文字语言: 简体中文简介: 特别说明: 视频原始来源为互联网,原始格式为F ...

  4. 有什么好的Java自学教程视频,适合初学者

    动力节点Java培训最新上线Java实验班,等你来测试自己适不适合学习Java编程哦! 随着互联网的发展,视频教程充斥着网络,很多人为了能够在视频教程中捞取一桶金,纷纷投入视频售卖的大军之中,其中不乏 ...

  5. JAVA自学笔记08

    JAVA自学笔记08 1.构造方法私有,外界就不能再创建对象 2.说明书的制作过程 1)写一个工具类,在同一文件夹下,测试类需要用到工具类,系统将自动编译工具类:工具类的成员方法一般是静态的,因此在测 ...

  6. Java自学笔记——Java面向对象——04.抽象类、接口、内部类

    Java 面向对象各节 Java自学笔记--Java面向对象--01.回顾方法 Java自学笔记--Java面向对象--02.构造器.类和对象 Java自学笔记--Java面向对象--03.封装.继承 ...

  7. 我与Java的故事以及0基础Java自学之路(2022最新版)

    文章目录 我与Java的故事 一.JSP.Servlet推荐自学路线 二.Spring推荐自学路线 三 SpringMVC推荐自学路线 四 Mybatis.MyBatisPlus推荐自学路线 五 Sp ...

  8. Java 自学路线图之 Java 进阶自学

    文章目录 Java 自学路线图的第二阶段是 Java 语言进阶自学,在自学了第一阶段的 Java 基础自学后,大家对 Java 语言编程有了初步的了解和认识,建议在第一部分自学后整理一下自己的自学思路 ...

  9. java自学能学会吗_自学java能学会吗?有没有捷径能尽快学会?

    作为一种灵活多变,前景可瞻,又易学习的编程语言,Java备受年轻人关注,很多开发爱好者,或者想从事Java开发的年轻人放出豪言"我要自学Java,拿高薪,走上人生巅峰" 但是:Ja ...

最新文章

  1. 彻底理解大数据 HDFS 分布式文件系统,这篇就够了
  2. 我的android studio开发环境搭建历程(一部辛酸史)
  3. Codeforces Round #311 (Div. 2) A. Ilya and Diplomas 水题
  4. oracle vm virtualbox 无法安装mac,【总结】在VirtualBox上面安装Mac的注意事项
  5. c语言里 如何取得线程的lpparameter'参数,请问线程函数如何访问对话框类中的变量...
  6. matlab 动画_MATLAB绘图动画(1)
  7. cad考试题库绘图题答案_2019年低压电工作业操作证考试最新版题库及答案(一)...
  8. 电脑qq收藏在哪里打开_外贸询盘怎么来?零成本用Linkedin批量开发客户!外贸人收藏...
  9. Windows下80端口被进程SystemPID=4占用的解决方法
  10. shell编程cp强制覆盖拷贝时仍需确认问题的处理方法
  11. 传智播客 网络通信过程学习笔记
  12. rk3399调试ov2659(camera模块@dvp接口)--移植过程
  13. 什么是计算机网络中域名,什么是域名?
  14. 华为手机灵敏度设置_和平精英灵敏度怎么调最稳华为手机?华为二指灵敏度调整设置一览[多图]...
  15. 安装kubernetes_如何在Kubernetes中安装和使用Linkerd
  16. 数据库实验三 嵌套查询和视图操作
  17. 菜鸟、大牛和教主,三者的区别
  18. LVGL之学习篇(一)
  19. 控制霍尔编码器电机(有刷)的一个思路
  20. 【HDOJ】4607 Park Visit_天涯浪子_新浪博客

热门文章

  1. java home bin java home jre bin_Tomcat 启动找不到配置好的 $JAVA_HOME和$JRE_HOME 变量?
  2. python文档字符串格式_Python字符串及文本模式方法详解
  3. 怎么查看任天堂账号是哪个服务器的,科普:任天堂账号和NS的本地用户有什么区别?...
  4. 用python写三角形_python写个三角形的问题
  5. php 类自动执行方法,php类讲解8:PHP 自动加载类 __autoload() 方法
  6. 缓存穿透、缓存击穿、缓存雪崩概述缓存一致性的解决方案
  7. python 爬取网页内容 snmp_python通过SNMP协议收集服务器监控信息
  8. PG基于repmgr实现自动和手动故障切换
  9. mysql 5.6安装图解 linux_Windows下MySQL 5.6安装及配置详细图解
  10. java 线程退出cmd_java 线程的终止与线程中断