JAVA每日作业day6.26

news2024/10/7 12:17:38

ok了家人们,今天我们学习了面向对象-多态,话不多说我们一起来看看吧

.多态概述

面向对象的第三大特性:封装、继承、多态
我们拿一个生活中的例子来看
生活中,比如跑的动作,小猫、小狗和大象,跑起来是不一样
的。再比如飞的动作,昆虫、鸟类和飞机,飞起来也是不一样
的。可见,同一行为,通过不同的事物,可以体现出来的不同
的形态。
多态 : 是指同一行为,对于不同的对象具有多个不同表现形
式。
程序中多态 : 是指同一方法 , 对于不同的对象具有不同的实现。
多态前提条件
继承或者实现【二选一】
父类类型指向子类对象【格式体现】 父类类型 变量名 =
new 子类类型 ();
方法的重写【意义体现:不重写,无意义】

.多态的定义和使用

2.1 多态定义格式  

父类类型 变量名 = new 子类类型();
变量名.方法名();

2.2 普通类多态定义的格式

public class Person {

     public void run(){
         System.out.println("run...");
 }

}
public class Student extends Person{

     @Override
     public void run() {
         System.out.println("学生大步跑...");
     }
}
public class Teacher extends Person{

     @Override
     public void run() {
         System.out.println("老师碎步跑...");
 }

}
public class DemoTest {
     public static void main(String[] args) {

         Person p01=new Student();
         p01.run();
         Person p02=new Teacher();
         p02.run(); 
    }

 }

2.3 抽象类多态定义的格式

public abstract class Animal {

 public abstract void eat();

 }
public class Cat extends Animal{

     @Override
     public void eat() {
         System.out.println("猫吃鱼...");
     }

 }
public class Dog extends Animal{

     @Override
     public void eat() {
         System.out.println("狗吃肉...");
     }

 }
public class DemoTest {
     public static void main(String[] args) {

         Animal a1=new Cat();
         a1.eat();
         Animal a2=new Dog();
         a2.eat();
     }
 
}

2.4 接口多态定义的格式

public interface MyInter {

     public void fly();

 }
public class Bird implements MyInter{

     @Override
     public void fly() {
         System.out.println("鸟靠翅膀飞...");
     }

 }
public class Plane implements MyInter{

     @Override
     public void fly() {
         System.out.println("飞机靠动力飞...");
     }

 }
public class DemoTest {
     public static void main(String[] args) {

         MyInter my01=new Bird();
         my01.fly();
         MyInter my02=new Plane();
         my02.fly();
    }

}

.多态时访问成员的特点

  • 多态时成员变量的访问特点:编译看父类,运行看父类
  • 多态时成员方法的访问特点:编译看父类,运行看子类
public class Fu {

     int num=20;
     public void method(){
         System.out.println("fu...method...");
     }

 }
public class DemoTest {
     public static void main(String[] args) {
         Fu fu=new Zi();
             System.out.println(fu.num);
             fu.method();
     }

 }
public class Zi extends Fu{

         int num=20;
         public void method(){
             System.out.println("zi...method...");
     } 

}

.多态的好处与弊端

  • 好处:提高了代码的扩展性。实际开发的过程中,父类类
    型作为方法形式参数,传递子类对象给方法,进行方法的
    调用,更能体现出多态的扩展性与便利。
  • 弊端:多态的情况下,只能调用父类的共性内容,不能调
    用子类的特有内容。
public abstract class Animal {

     public abstract void eat();

 }
public class Cat extends Animal{

     @Override
     public void eat() {
         System.out.println("猫吃鱼...");
    }

}
public class Dog extends Animal{

     @Override
     public void eat() {
         System.out.println("狗吃肉...");
     }
     public void lookHome(){
         System.out.println("狗看家...");
     }

 }
public class DemoTest {
     public static void main(String[] args) {

     Animal animal=new Cat();
     animal=new Dog();
    
 /* 父类类型的变量可以接收该父类的所有子类对象 */
     /*Dog dog=new Dog();
     method01(dog);
     Cat cat=new Cat();
     method02(cat);*/

     Animal a01=new Dog();

     //a01.lookHome();
     无法访问子类独有的方法
     Animal a02=new Cat(); method(a01);

    //实参赋值给形参:
    Animal a01 = new Dog();method(a02);

    //实参赋值给形参:
    Animal a02 = new Cat();
}
//优化代码:方法的形参为父类类型,就可以接收该父类的所 有子类对象 
    public static void method(Animal animal){
         animal. Eat();
}

//定义方法,可以接收Dog类对象和Cat类对象,并在该方法 中调用eat方法
     public static void method01(Dog dog){
         dog. Eat(); 
}

    public static void method02(Cat cat){ 
        cat. Eat();
     } 
}

4.2 类型转换

  • 向上转型:子类类型向父类类型向上转换的过程,这个过
    程是默认的。
Fu fu = new Zi();
  • 向下转型:父类类型向子类类型向下转换的过程,这个过
    程是强制的。
     Aniaml animal = new Cat();
     Cat c = (Cat)animal;
//向下转型
     c.catchMouse();
// 可以访问 子类独有的功能,解决多态的 弊端
  • instanceof关键字
        为了避免ClassCastException 的发生, Java 提供了 instanceof
        关键字,给变量做类型的校验。
 变量名 instanceof 数据类型
 如果变量属于该数据类型,返回true。
 如果变量不属于该数据类型,返回false。
public abstract class Animal {

     public abstract void eat();

 }
public class Cat extends Animal{

     @Override
     public void eat() {
         System.out.println("猫吃鱼...");
     }

 }
public class Dog extends Animal{

     @Override
     public void eat() {
         System.out.println("狗吃肉...");
 }

     public void lookHome(){
         System.out.println("狗看家...");
     }

 }
public class DemoTest {
     public static void main(String[] args) {
         Animal animal=new Dog();
         animal. Eat();
         //animal.lookHome();
         //编译报错 无法调用子 类特有的功能

         Dog dog=(Dog)animal;
         dog.lookHome();
         // Cat cat=(Cat)animal; 类型转换异常
         if(animal instanceof Dog){ 
         Dog d=(Dog)animal;
         d.lookHome();
         }

     }
 }

.多态的几种表现形式

5.1 形参多态

public abstract class Animal {

     public abstract void eat();

 }
public class Cat extends Animal{

         @Override 
         public void eat() {
         System.out.println("猫吃鱼...");
     }

        public void catchMouse(){
        System.out.println("猫抓老鼠...");
     }

 }
public class Dog extends Animal{

     @Override
     public void eat() {
     System.out.println("狗吃肉...");
     }

     public void lookHome(){
     System.out.println("狗看家...");
     }
    
 }
public class DemoTest {
     public static void main(String[] args) {

         Dog dog=new Dog();
         method(dog); 
         Cat cat=new Cat();
         method(cat);
     }

public static void method(Animal animal){
     animal. Eat();
     if(animal instanceof Dog){
         Dog dog=(Dog)animal;
         dog.lookHome();
     }
    
    if(animal instanceof Cat){
         Cat cat=(Cat)animal;
         cat.catchMouse();
         }

     }
 }

5.3 返回值多态

public abstract class Animal {

     public abstract void eat();

}
public class Cat extends Animal{

     @Override
     public void eat() {
     System.out.println("猫吃鱼...");
     }

     public void catchMouse(){
     System.out.println("猫抓老鼠...");
     } 

}
public class Dog extends Animal{

     @Override
     public void eat() {
     System.out.println("狗吃肉...");
     }

     public void lookHome(){
     System.out.println("狗看家...");
     } 

}
public class DemoTest {
     public static void main(String[] args) {
         Cat cat=new Cat();
         Dog dog=new Dog();
         Animal a01 = method01(cat);
         Animal a02 = method01(dog);
         Animal animal = method02();
    }

    public static Animal method01(Animal animal) {
     //一系列操作,操作后,返回操作后的对象
         return animal;
 }

    public static Animal method02(){
 /* Dog dog = new Dog(); return dog;*/ 
        return new Cat();
     }

 }

ok了家人们明天见

        

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

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

相关文章

CAN总线学习之路

闻道有先后,术业有专攻。我们接触新的事物时总会有个学习过程,如今现场总线非常繁多,CAN总线就是其中不可忽视的一种,在此以个人的学习过程与大家共勉! 我大学时的专业是电子科学与技术,专业课程是数电、模…

从写下第1个脚本到年薪40W,我的测试开发心路历程!

对于任何职业来说,薪资始终都会是众多追求的重要部分。前几年测试行业还是风口,但是随着不断新鲜血液的加入,再加上就业大环境不好,企业也都在“降本增效”。目前内卷也是越来越激烈。不得不承认当下的现状,已经不仅仅…

视频分享的二维码怎么做?多种视频可用的二维码制作技巧

视频分享的快捷操作技巧可以在二维码生成器上来制作,与传统分享方式相比用二维码的方法能够更快捷,有利于用户能够在不下载视频占用空间的同时,就能够扫描二维码观看视频内容。视频二维码能够应用于很多的场景下,那么制作一个视频…

【Linux】使用ntpdate同步时间

ntpdate 是一个在 Linux 系统中用于同步系统时间的命令行工具,它通过与 NTP 服务器通信来调整本地系统时钟。然而,需要注意的是,ntpdate 已经被许多现代 Linux 发行版弃用。 安装 yum install -y ntpdate 查看时间 date同步时间 ntpdate ntp…

防火墙双机热备

防火墙双机热备 随着移动办公、网上购物、即时通讯、互联网金融、互联网教育等业务蓬勃发展,网络承载的业务越来越多,越来越重要。所以如何保证网络的不间断传输成为网络发展过程中急需解决的一个问题。 防火墙部署在企业网络出口处,内外网之…

想远程控制手机,用哪个软件好?

很多人都想知道安卓系统或iOS系统要如何实现手机远程控制手机、电脑远程控制手机,分别需要用到什么软件,这篇文章一次说清楚。 注意,安卓系统需要是7.0及以上版本,iOS系统需要是11及以上版本。具体使用步骤请点击关注,…

633. 平方数之和(中等)

633. 平方数之和 1. 题目描述2.详细题解3.代码实现3.1 Python3.2 Java内存溢出溢出代码正确代码与截图 1. 题目描述 题目中转:633. 平方数之和 2.详细题解 本题是167. 两数之和 II - 输入有序数组(中等)题目的变型,由两数之和变…

数字图像分析(第三部分)

文章目录 第11章 基于概率图模型的图像分析概率有向图模型因子分解生成式模型链式图条件独立性有向图模型的马尔科夫毯概率无向图模型模型定义概率无向图模型的因子分解条件随机场条件随机场的定义条件随机场的预测算法第12章 运动分析运动相机建模光流运动表达方法运动估计准则…

二维数组广度优先遍历-腐烂的苹果

一、问题描述 二、解题思路 此问题通过广度优先遍历来解决,模拟苹果发霉变坏的过程 1.初始时遍历网格,借助队列来储存所有发霉的苹果,统计好苹果个数 2.每一分钟队列内发霉苹果都会对周围的苹果起作用(向外部扩散)&am…

Python 高级编程:文件操作与错误处理

在前几篇文章中,我们介绍了Python的基本语法、函数和模块以及面向对象编程。这些知识对于大部分日常编程问题已经足够,但对于需要分析大数据的人来说,这些还不够。本章将介绍Python的文件操作以及错误处理与调试。 目录 文件操作读文件写文…

鸿蒙开发系统基础能力:【@ohos.systemTime (设置系统时间)】

设置系统时间 本模块用来设置、获取当前系统时间,设置、获取当前系统日期和设置、获取当前系统时区。 说明: 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 导入模块 import systemTime …

线性代数基础概念:行列式

目录 线性代数基础概念:行列式 1. 行列式的定义 1.1 递归定义 1.2 代数余子式定义 1.3 几何定义 2. 行列式的性质 2.1 行列式等于其转置的行列式 2.2 交换两行或两列,行列式变号 2.3 将一行或一列乘以一个数 k,行列式乘以 k 2.4 将…

初创企业合规管理中的企业合规义务边界问题

在初创企业的迅猛发展过程中,合规管理是确保公司可持续成长和避免潜在风险的关键因素。而在合规管理中,界定企业边界尤为重要,它关系到企业如何合理规划业务范围、管理内部外部关系以及维护企业形象和法律责任的清晰。 一、初创企业面临的合…

转让北京资产评估公司变更需要什么条件和要求

北京资产评估公司是有限责任公司。因为有限责任公司具有人合属性,股东的个人信用及相互关系直接影响到公司的风格甚至信誉,所以各国公司法对有限责任公司股东向公司外第三人的转让股权,多有限制性规定。大致可分为法定限制和约定限制两类。公…

没什么用的java技巧

1.将需要注入bean的方法,包装为静态方法,让其看起来不需要依赖注入等操作,但实际依然需要

关于mysq数据库备份的几个问题

1 mysql怎么双机热备? 或者怎么两个mysql服务器互相同步? MySQL的双机热备或两个MySQL服务器之间的互相同步,通常通过几种不同的同步机制来实现,这些机制确保了数据的实时更新和备份。以下是几种常见的同步方式及其实现步骤&…

程序员在企业中是如何做需求的

在企业中,一个需求从产生到完成生命周期是什么样的。 它可以分为这样的步骤: 需求分析 -> 设计(原型、功能、接口设计) -> 技术选型 -> 搭建项目框架 -> 编码(实现业务逻辑) -> 测试&#…

Python数据分析之-Oracle数据库连接

文章目录 cx_Oracle 介绍cx_Oracle运行原理cx_Oracle 安装linux环境安装windows环境安装 cx_Oracle 使用单独使用结合Pandas使用 参考资料 cx_Oracle 介绍 cx_Oracle 8是一个Python扩展模块,它提供了对Oracle数据库的访问能力。以下是cx_Oracle 8的一些关键特性和功…

springboot vue 开源 会员收银系统 (8) 收银台、开卡结算及订单的优化升级

前言 完整版演示 开发版演示 在之前的开发进程中,我们基本搭建了收银台的基础。这次着重梳理一下收银台相关功能的开发及优化情况。 1.会员查询与开卡 收银台新增加了会员筛选功能 并且会员和会员卡是一对多的关系 理论可以开无数张卡 默认选择一张卡 会员卡选择…

国家自然科学基金标书大全(2002-2024)

数据来源:在20世纪80年代初,为了促进中国的科技体制革新并改革科研资金分配机制,中国科学院的89位院士联名向党和国家领导人提出建议,设立了国家自然科学基金的设立。国自然基金自创立以来,根据国家发展科学技术方针、…