Java的多态特性

2023-11-19

//学习笔记

多态

简单说:就是一个对象对应着不同类型。
多态在代码中的体现:父类或者接口的引用指向其子类的对象

多态的好处:
提高可维护性(由多态前提所保证),提高了代码的扩展性

多态的弊端:
无法直接访问子类特有的成员。也就是说前期定义的内容不能使用(调用)后期子类的特有内容。

多态的前提:
1,子父类的继承关系
2,方法的重写
3,父类引用指向子类对象

另一个概念:动态绑定,指的是运行期间调用给的方法,是根据其具体的类型(只针对方法而言)

例子

    abstract class Animal
    {
    	abstract void eat();
    
    }
    
    class Dog extends Animal
    {
    	void eat()
    	{
    		System.out.println("啃骨头");
    	}
    	void lookHome()
    	{
    		System.out.println("看家");
    	}
    }
    
    class Cat extends Animal
    {
    	void eat()
    	{
    		System.out.println("吃鱼");
    	}
    	void catchMouse()
    	{
    		System.out.println("抓老鼠");
    	}
    }
    
    class Pig extends Animal
    {
    	void eat()
    	{
    		System.out.println("饲料");
    	}
    	void gongDi()
    	{
    		System.out.println("拱地");
    	}
    }

    class DuoTaiDemo 
    {
    	public static void method(Animal a)
    	{
    		a.eat();
    
    		if(a instanceof Cat)//instanceof:用于判断对象的具体类型。只能用于引用数据类型判断
    //						//通常在向下转型前用于健壮性的判断。 
    		{
    			Cat c = (Cat)a;
    			c.catchMouse();
    		}
    		else if(a instanceof Dog)
    		{
    			Dog d = (Dog)a;
    			d.lookHome();
    		}
    		else
    		{
    		
    		}
    		
    	}
    	public static void main(String[] args) 
	{
      Animal a = new Cat(); //自动类型提升,猫对象提升了动物类型。
                            //但是特有功能无法访问。作用就是限制对特有功能的访问。
                            //专业讲:向上转型。将子类型隐藏。就不用使用子类的特有方法。
        	                //如果还想用具体动物猫的特有功能。 
		                    //你可以将该对象进行向下转型。
	    //		Cat c = (Cat)a;   //向下转型的目的是为了使用子类中的特有方法。
	    //		c.eat();
	    //		c.catchMouse();    
	    //		注意:对于转型,自始自终都是子类对象在做着类型的变化。
	    //		Animal a1 = new Dog();
	    //		Cat c1 = (Cat)a1;//    

            
        }

向上转型:将子类型隐藏,就不能使用子类的特有方法(方法的隐藏)。
向下转型:目的是为了使用子类中的特有方法。

多态时,成员的特点:

1,成员变量。

编译时:参考引用型变量所属的类中的是否有调用的成员变量,有,编译通过,没有,编译失败。
运行时:参考引用型变量所属的类中的是否有调用的成员变量,并运行该所属类中的成员变量。
简单说:编译和运行都参考等号的左边。

          //举例
       class Fu
    {
    	   int num = 3;
    }
            
       class Zi extends Fu
    {
           int num = 4;
    }
        
    
    
    class  DuoTaiDemo3
    {
    	public static void main(String[] args) 
    	{
    	    Fu f = new Zi();
    	    System.out.println(f.num);
    	}
    }
    //输出的是3.

2,成员函数(非静态)。

编译时:参考引用型变量所属的类中的是否有调用的函数。有,编译通过,没有,编译失败。
运行时:参考的是对象所属的类中是否有调用的函数。
简单说:编译看左边,运行看右边。

因为成员函数存在覆盖特性。

          //举例
       class Fu
    {
	    	 void show()
	    {
	    	System.out.println("fu show");
	    }
    }
            
       class Zi extends Fu
    {
	         void show()
	    {
	    	System.out.println("zi show");
	    }
    }
        
    
    
    class  DuoTaiDemo3
    {
    	public static void main(String[] args) 
    	{
    	    Fu f = new Zi();
    	   	f.show();
    	}
    }
    //此时输出的是zi show

3,静态函数。

编译时:参考引用型变量所属的类中的是否有调用的静态方法。
运行时:参考引用型变量所属的类中的是否有调用的静态方法。
简单说,编译和运行都看左边。

其实对于静态方法,是不需要对象的。直接用类名调用即可。这也能解释为什么看的是左边了,因为左边才决定了该变量的类型。

         //举例
       class Fu
    {
	        static void method()
	    {
	    	System.out.println("fu static method");
	    }
    }
            
       class Zi extends Fu
    {
	          static void method()
	    {
	    	System.out.println("zi static method");
	    }
    }
        
    
    
    class  DuoTaiDemo3
    {
    	public static void main(String[] args) 
    	{
    	    Fu f = new Zi();
    	    f.method();
    	}
    }
    //此时输出的是fu static method



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java的多态特性 的相关文章

随机推荐

  • gojs 实用高级用法

    本文介绍的是在使用 gojs 制作图的过程中 你可能会碰到的问题的一些解决方案 gojs 是一个非常强大的可视化关系的js库 1 取消更新动画 问题 更新数据的时候 会触发渲染 有渲染动画 用户体验不好 方案 初始数据绘制 有动画 更新数据
  • disabled_button 攻防世界

    1 第一步还是看题目 重要知识点 按钮按不下去 前端知识 例如下面的代码
  • 【基础语法篇】Java必备基础(思维导图+代码)

    文章目录 基本语法 初识JDK 输入与输出 条件与循环 一维数组与二维数组 函数及其他补充 Java常用类 Number Math类 Arrays类 String类 关于 和equals 其他类 Object 异常处理 常见异常 异常的处理
  • 邻接表无向图--- C++

    邻接表无向图的介绍 邻接表无向图是指通过邻接表表示的无向图 上面的图G1包含了 A B C D E F G 共7个顶点 而且包含了 A C A D A F B C C D E G F G 共7条边 上图右边的矩阵是G1在内存中的邻接表示意图
  • CesiumJS 中文学习手册

    1 Getting Started 入门 2 Developer Guides 开发人员指南 Creating Entities 创建实体 Imagery 图层 Terrain 地形 3D Models 3D 模型 Camera
  • 短视频矩阵系统:批量剪辑+矩阵分发+线索收集产品开发搭建

    短视频矩阵系统是一种综合性的短视频营销链路 通过在不同平台上传布 推广和转载短视频内容 以达到品牌宣传的效果 通过不同平台的内容进行组合 剪辑 形成全方位 多渠道的短视频推广网络链路 一 短视频矩阵系统搭建常见问题 1 抖去推的短视频AI矩
  • go grpc环境安装

    1 安装protoc编译器 protoc可执行文件用于编译 protocolbuf proto文件 和 protobuf 运行时 它是 C 写的 其可以将proto文件翻译为指定语言的代码 比较简单的安装方式是直接下载编译好的二进制文件 仓
  • KNN算法优缺点、原理及参数最优解

    文章目录 1 KNN算法简介 1 1 简述 1 2 优缺点 1 3 适用数据范围 2 工作原理 2 1 训练样本集 2 2 电影类别的KNN分析 如何进行电影分类 在这里插入图片描述 2 3 欧几里得距离 Euclidean Distanc
  • java 反射、设计模式、枚举、注解

    类的对象 基于某个类 new 出来的对象 也称为实例对象 类对象 类加载的产物 封装了一个类的所有信息 类名 父类 接口 属性 方法 构造方法 通过反射获取类对象 通过类的对象 获取类对象 Student s new Student Cla
  • CSS层叠样式表-属性 /盒子模型

    1 属性 1 字体属性 官方文档 https www apiref com css zh properties font index htm 1 font style 指定字体风格 属性用法 描述 取值 normal italic obli
  • hbuilder 微信支付成功 需要通知服务器吗,整合Hbuilder,实现app的微信支付与支付宝支付...

    1 对于使用Hbuilder开发app对接的移动支付 相信关于这方面的文档有不少 本人今天简单说一下本身在作的时候碰见的坑 html 1 1 在app客户端 使用Hbuilder写客户端代码时候 必定要注意ios 这两个的顺序 要否则会出现
  • 计算机网络——数字数据的数字编码

    计算机网络 数字数据的数字编码 数字数据的数字编码就是如何把数字数据用物理信号的波形表示 即用高低电平表示二进制 1 不归零码 正电平代表1 负电平代表0 2 归零码 正脉冲代表1 负脉冲代表0 3 曼彻斯特编码 位周期中心的上跳代表0 周
  • 吴恩达与OpenAI官方合作的ChatGPT提示工程课程笔记

    吴恩达与OpenAI官方合作的ChatGPT提示工程课程笔记 下述代码均在煮皮特上运行喔 LLMs large language models Base LLM 基于文本训练数据来预测做 文字接龙 Instruction Tuned LLM
  • git小技巧:git blame && git show 查看某一行代码的修改历史

    先查看某行代码由谁写的 在哪个commit中提交的 git blame file name 其显示格式为 commit ID 代码提交作者 提交时间 代码位于文件中的行数 实际代码 类似于下面这样 f604879e yingyinl 201
  • 某某星图sign参数解密分析

    大家好 我是TheWeiJun 欢迎来到我的公众号 今天给大家带来星图sign参数的解密分析 希望大家能够喜欢 如果你觉得我的文章内容有价值 记得点赞 关注 特别声明 本公众号文章只作为学术研究 不用于其他用途 逆向与爬虫的故事 公众号 专
  • 主线程退出后,子线程会不会退出

    额 好吧 这是个标题党 其实所有的线程都是平级的 根本不存在主线程和子线程 下文所述为了方便 将在main函数中的线程看做主线程 其它线程看成子线程 特此说明 先考虑以下代码 include
  • 基于深度学习的正常衰老和痴呆症中的脑龄预测

    大脑衰老过程中会出现一系列功能和结构的改变 阿尔茨海默病 AD 作为一种典型的神经退行性疾病 与大脑加速衰老有关联 在本研究中 我们利用大量的氟脱氧葡萄糖正电子发射断层扫描 FDG PET 和结构磁共振成像 MRI 数据 构建了一个基于深度
  • 期货开户顺大市而逆小市

    期货的行情 有人愿意以更高的价来买入 就会涨 有人买意以更低的价格卖出 就会跌 现货市场上 一个馒头5角钱的时候 在期货市场上 如果有很多人争着买 这个馒头可能会涨到5块 或者50块 也是可能的 在这个馒头5块钱一个的时候 你感觉这个馒头太
  • Servlet+JDBC实战开发书店项目讲解第五篇:购物车实现

    Servlet JDBC实战开发书店项目讲解第五篇 购物车实现 引言 在之前的几篇博客中 我们讲解了如何使用Servlet和JDBC开发一个简单的书店管理系统 在本文中 我们将深入探讨购物车的实现 这是一个关键功能 允许用户将所需图书添加到
  • Java的多态特性

    学习笔记 多态 简单说 就是一个对象对应着不同类型 多态在代码中的体现 父类或者接口的引用指向其子类的对象 多态的好处 提高可维护性 由多态前提所保证 提高了代码的扩展性 多态的弊端 无法直接访问子类特有的成员 也就是说前期定义的内容不能使