一个小时搞定JAVA面向对象(6)——多态

文章目录

  • 多态
    • 多态条件下成员的访问特点
      • 成员变量
      • 成员方法
    • 多态的好处
    • 多态的缺点
    • 多态中的转型
      • 向上转型
      • 向下转型
      • 类型转换异常

多态

多态必须要子父类继承或者接口实现关系,必须有方法的重写.

定义格式:

​ new对象:父类引用指向子类对象

Fu fu = new Zi( )理解为大类型接收了一个小类型的数据

注意:

​ 多态下不能直接调用子类特有功能

案例:

public abstract class Animal {public abstract void eat();
}public class Dog extends Animal{@Overridepublic void eat() {System.out.println("狗啃骨头");}//特有方法public void lookDoor(){System.out.println("狗会看门");}
}public class Cat extends Animal{@Overridepublic void eat() {System.out.println("猫吃鱼");}//特有方法public void catchMouse(){System.out.println("猫会捉老鼠");}
}public class Test01 {public static void main(String[] args) {//原始方式Dog dog = new Dog();dog.eat();//重写的dog.lookDoor();//特有的Cat cat = new Cat();cat.eat();//重写的cat.catchMouse();//特有的System.out.println("==================");//多态形式new对象Animal animal = new Dog();//相当于double b = 10animal.eat();//重写的 animal接收的是dog对象,所以调用的是dog中的eat
//      animal.lookDoor();   多态前提下,不能直接调用子类特有成员Animal animal1 = new Cat();animal1.eat();//cat重写的}
}

多态条件下成员的访问特点

成员变量

看等号左边是谁,先调用谁中的成员变量

public class Fu {int num = 1000;
}public class Zi extends Fu{int num = 100;
}public class Test01 {public static void main(String[] args) {Fu fu = new Zi();System.out.println(fu.num);}
}

成员方法

new的是谁,先调用谁中的成员方法,子类没有就找父类

public class Fu {int num = 1000;public void method(){System.out.println("我是父类中的method方法");}
}public class Zi extends Fu{int num = 100;public void method(){System.out.println("我是子类中的method方法");}
}public class Test01 {public static void main(String[] args) {Fu fu = new Zi();System.out.println(fu.num);//父类中的numfu.method();//子类中重写的method方法}
}

多态的好处

多态方法和原始方式new对象的优缺点:

  • 原始方式:
    1. 优点:既能调用重写的,还能调用父类非私有的,还能调用自己特有的
    2. 缺点:扩展性差
  • 多态方法:
    1. 优点:扩展性强
    2. 缺点:不能直接调用子类特有功能

总结:

  1. 形参传递父类类型,调用此方法父类类型可以接收任意它的子类对象
  2. 传递哪个子类对象,就指向哪个子类对象,就调用哪个子类对象重写的方法

案例:

public abstract class Animal {public abstract void eat();
}public class Dog extends Animal {@Overridepublic void eat() {System.out.println("狗啃骨头");}//特有方法public void lookDoor(){System.out.println("狗会看门");}
}public class Cat extends Animal {@Overridepublic void eat() {System.out.println("猫吃鱼");}//特有方法public void catchMouse(){System.out.println("猫会捉老鼠");}
}
public class Test01 {public static void main(String[] args) {Dog dog = new Dog();dog.eat();//重写的dog.lookDoor();//特有的//dog = new Cat();System.out.println("=============");method(dog);Cat cat = new Cat();method(cat);/* houzi houzi = new houzi();method(houzi);bird bird = new bird();method(bird);*/}public static void method(Dog dog){dog.eat();dog.lookDoor();}public static void method(Cat cat){cat.eat();cat.catchMouse();}/* public static void method(houzi houzi){cat.eat();cat.catchMouse();}*/
}
public class Test02 {public static void main(String[] args) {/*double b = 10;b = 100L;*/Animal animal = new Dog();animal.eat();animal = new Cat();animal.eat();System.out.println("=================");Dog dog = new Dog();method(dog);Cat cat = new Cat();method(cat);}/*形参传递父类类型,调用此方法父类类型可以接收任意它的子类对象传递哪个子类对象,就指向哪个子类对象,就调用哪个子类对象重写的方法*/public static void method(Animal animal){//Animal animal = dog   Animal animal = catanimal.eat();}
}

多态的缺点

在多态中如果我们想要调用子类特有的方法是实现不了的.

多态中的转型

向上转型

表现形式:父类类型 对象名1 = new 子类对象()

向下转型

意思就是将父类强制转换成子类.

表现形式:子类类型 对象名2 = (子类类型)对象名1

转型案例:

public abstract class Animal {public abstract void eat();
}public class Cat extends Animal {@Overridepublic void eat() {System.out.println("猫吃鱼");}//特有方法public void catchMouse(){System.out.println("猫会捉老鼠");}
}public class Dog extends Animal {@Overridepublic void eat() {System.out.println("狗啃骨头");}//特有方法public void lookDoor(){System.out.println("狗会看门");}
}public class Test01 {public static void main(String[] args) {//多态new对象  向上转型Animal animal = new Dog();animal.eat();//dog重写的//animal.lookDoor();//多态不能调用子类特有功能//向下转型Dog dog = (Dog) animal;dog.eat();dog.lookDoor();}
}

类型转换异常

  1. 如果等号左右两边类型不一致,会出现类型转换异常(ClassCastException).

  2. 解决办法:使用**instanceof进行判断**, 判断的是关键字前面的对象是否符合关键字后面的类型

  3. 使用方法:
    对象名 instanceof 类型
    【测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据】

  4. 代码案例:

    public abstract class Animal {public abstract void eat();
    }public abstract class Animal {public abstract void eat();
    }public class Dog extends Animal {@Overridepublic void eat() {System.out.println("狗啃骨头");}//特有方法public void lookDoor(){System.out.println("狗会看门");}
    }public class Cat extends Animal {@Overridepublic void eat() {System.out.println("猫吃鱼");}//特有方法public void catchMouse(){System.out.println("猫会捉老鼠");}
    }public class Test01 {public static void main(String[] args) {Dog dog = new Dog();method(dog);System.out.println("===============");Cat cat = new Cat();method(cat);}public static void method(Animal animal){//animal = dog    animal = cat/*  animal.eat();*//*这里会出现类型转换异常(ClassCastException)原因:当调用method,传递Cat对象时,animal代表的就是cat对象此时我们将代表cat对象的animal强转成了dog此时等号左右两边类型不一致了,所以出现了类型转换异常*//*Dog dog = (Dog) animal;dog.lookDoor();*/if (animal instanceof Dog){Dog dog = (Dog) animal;dog.eat();dog.lookDoor();}if (animal instanceof Cat){Cat cat = (Cat) animal;cat.eat();cat.catchMouse();}}
    }
    

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

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

相关文章

持续总结中!2024年面试必问 20 道 Kafka面试题(六)

上一篇地址:持续总结中!2024年面试必问 20 道 Kafka面试题(五)-CSDN博客 十一、Zookeeper 对于 Kafka 的作用是什么? Apache ZooKeeper是一个开源的分布式协调服务,它为分布式应用提供一致性服务&#xf…

Linux线程 -- 互斥锁 和 条件变量

在多线程编程中,互斥量(mutex)是用于保护共享资源的同步机制,确保在任一时刻只有一个线程能够访问共享资源。互斥量用于防止竞态条件(race conditions),确保数据一致性。 基本概念 互斥量&…

python学习笔记-04

高级数据类型 一组按照顺序排列的值称为序列,python中存在三种内置的序列类型:字符串、列表和元组。序列可以支持索引和切片的操作,第一个索引值为0表示从左向右找,第一个索引值为负数表示从右找。 1.字符串操作 1.1 切片 切片…

不同平台账号究竟要如何运营?新媒体矩阵这样做,不怕没结果!

干货分享 越来越多企业要求做矩阵化运营,众多平台一把抓,那么对于新媒体人来说,可能会有些困惑,都是新媒体平台,他们各有什么特质?今天冲鸭老师就对目前新媒体4大热榜平台进行分析。 抖音 用户特点 年轻…

Flutter 中的 ErrorWidget 小部件:全面指南

Flutter 中的 ErrorWidget 小部件:全面指南 Flutter 是一个由 Google 开发的跨平台 UI 框架,它允许开发者使用 Dart 语言构建高性能、美观的应用。在 Flutter 的丰富组件库中,ErrorWidget 是一个特殊的组件,用于在渲染过程中捕获…

Unity 编辑器扩展 一键替换指定物体下的所有材质球

先看效果 实现方案 1:创建几个用于测试的Cube 2:创建一个脚本 3:编写脚本内容 主要是这部分的逻辑 附上完整代码 using System.Collections; using System.Collections.Generic; using UnityEditor; using UnityEngine;public class Tool {[MenuItem(…

json文件操作和异常处理

目录 按行读取文件readline() 读取大文件: json文件: json文件介绍: json的语法: 读取json文件: json文件写入: 异常: 捕获异常: 捕获指定类型的异常: 捕获未知类型的异常(使用最多): 异常捕获的完整结构: 异常传递: ​编辑抛出异常: 按行…

[HDCTF 2023]Normal_Rsa(e,phi不互素)

题目: from Crypto.Util.number import * mbytes_to_long(bxxxxxx) pgetPrime(256) qgetPrime(256) e74 np*q cpow(m,e,n) print("p",p) print("q",q) print("c",c) #p 8605358291738634342256717476404047103323438810696848883487…

如何评价GPT-4o?【模板】

如何评价GPT-4o? 简介:最近,GPT-4o横空出世。对GPT-4o这一人工智能技术进行评价,包括版本间的对比分析、GPT-4o的技术能力以及个人感受等。 提醒:在发布作品前,请把不需要的内容删掉。 方向一:对比分析 提…

C++字符串转base64编码

上一篇博客中分享的案例里面base64编码的工具函数单独拿出来分享一下,为不想自己写的大佬提供快捷的CV路径 const std::string base64_chars "ABCDEFGHIJKLMNOPQRSTUVWXYZ""abcdefghijklmnopqrstuvwxyz""0123456789/";std::string ba…

java如何通过循环计算阶乘

比如说要计算5的阶乘 先定义一个变量a5 再定义一个变量b1 通过一个循环 b*a a-- 示例代码如下 public class HelloWorld { public static void main(String[] args) { int a5; int b1; do { b*a; a--; } while(a>0); System.out.println(b); } }

openAI项目

文章目录 为什么单独提供chatgpt-sdk? 分而治之,不同的模块修改,不会影响到整体的变动。比如就只是 sdk 调整,或者再引入新的 sdk 都会非常容易管理。资源问题,如果公司内有多个系统都需要用到这个 sdk,那么…

A6500-LC LVDT 前置器,用于A6500-UM, 导轨安装

电源 22.5V to 32VDC <30mA <0.1%/V <60V( 使用SELV/PELV 供电电源) 约2.2Vrms,5kHz IP20 IEC 60529 -35C to 75C(-31F to 167F) -35C to 85C(-31F to 185F) 电流损耗 供电电压对 运行温度 存储温度 0.35mm(0.014 in ),10 to 55Hz 15g 根据 EN 60068-2-27 根据IEC 613…

北邮21硕后端开发笔记

blog 整理北邮21渣硕Java后端开发知识网络&#xff0c;阅读笔记以及技术博客&#xff0c;持续更新&#xff01;欢迎Star&#xff01; GitHub: https://github.com/WeiXiao-Hyy/blog Java 基础篇 一文带你搞懂final关键字 Java并发编程 fucking-java-concurrency解读 CS…

linux必学基础命令大全

一切皆文件&#xff0c;每个文件都有具体的用途 命令快捷查看目录 常用命令 - 目录类1、ls 查看当前目录下的文件2、man查看命令详细信息3、pwd 查看当前目录 -4、cd 进入目录5、清屏命令6、mkdir创建目录7、du查看文件或者文件夹大小 常用命令 - 文件类1、vim/vi使用2、cat 查…

Maven实战: 从工程创建自定义archetype

在上一节中(创建自定义archetype)我们手动创建了一个项目模板&#xff0c;经过5步能创建出一个项目模板&#xff0c;如果我有一个现成的项目&#xff0c;想用这个项目作为模板来生成其他项目呢&#xff1f;Maven提供了基于项目生成archetype模板的能力&#xff0c;我们分3步来讲…

Windows下 CLion中,配置 OpenCV、LibTorch

首先按照win下C部署深度学习模型之clion配置pytorchopencv教程记录 步骤配置。 LibTorch 部分 在测试LibTorch时会出现类似 c10.dll not found 的问题&#xff08;Debug才有&#xff09;&#xff1a; 参考C部署Pytorch&#xff08;Libtorch&#xff09;出现问题、错误汇总和 …

行业分析---造车新势力之理想汽车

1 前言 在之前的博客中&#xff0c;笔者撰写了多篇行业类分析的文章&#xff08;科技新能源&#xff09;&#xff1a; 《行业分析---我眼中的Apple Inc.》 《行业分析---马斯克的Tesla》 《行业分析---造车新势力之蔚来汽车》 《行业分析---造车新势力之小鹏汽车》 此类文章的受…

js - WebWorkers

多线程: Web Workers 允许你创建一个或多个独立的线程来运行JavaScript&#xff0c;这些线程与主执行线程&#xff08;UI线程&#xff09;分离。 不阻塞UI: 因为脚本在单独的线程中运行&#xff0c;所以即使它们需要很长时间来执行&#xff0c;也不会阻塞用户界面或影响用户交…

vulntarget-b记录(Sliver学习)

网络环境 域控&#xff08;Win2016&#xff09; vulntarget\administrator&#xff1a;Admin123、&#xff08;首次登陆要改密码修改为Admin123&#xff09; vulntarget\win101&#xff1a;admin#123 边界Web主机突破 nmap扫描发现81端口 通过扫描&#xff0c;fuzz出来了后…