javaSE多态

文章目录

      • 斜体样式1.1 面向对象三大特征 ?
      • 1.2 什么是多态 ?*斜体样式*
      • 1.3 多态的前提
      • 1.4 多态的成员访问特点
      • 1.5 多态的优缺点
      • 1.6 多态的转型
      • 1.7 多态的转型注意
      • 1.8 解决转型安全隐患
    • 2 内部类
      • 2.1 内部类的分类
          • 什么是内部类 ?
          • 什么时候使用内部类 ?
          • 内部类分类 ?
      • 2.2 成员内部类
          • 成员内部类访问外部类的成员
      • 2.3 匿名内部类


在这里插入图片描述

斜体样式1.1 面向对象三大特征 ?

  • 封装 , 继承 , 多态

1.2 什么是多态 ?斜体样式

  • 一个对象在不同时刻体现出来的不同形态

  • 举例 : 一只猫对象

    • 我们可以说猫就是猫 : Cat cat = new Cat();
    • 我们也可以说猫是动物 : Animal cat = new Cat();
    • 这里对象在不同时刻,体现出来的不同形态 , 我们就可以理解为多态

1.3 多态的前提

  • 有继承/实现关系
  • 有方法重写
  • 父类的引用指向子类的对象
/*多态的三个前提条件1 需要有继承/实现关系2 需要有方法重写3 父类的引用指向子类的对象*/
public class AnimalTest {public static void main(String[] args) {// 3 父类的引用指向子类的对象// 多态形式对象Animal a = new Cat();}
}class Animal{public void eat(){System.out.println("吃东西");}
}class Cat extends Animal{@Overridepublic void eat() {System.out.println("猫吃鱼....");}
}

1.4 多态的成员访问特点

  • 构造方法 : 和继承一样 , 子类通过super()访问父类的构造方法
  • 成员变量 : 编译看左边(父类) , 执行看左边(父类)
  • 成员方法 : 编译看左边(父类) , 执行看右边(子类)
/*多态的成员访问特点 :1 构造方法 : 和继承一样 , 都是通过super()访问父类的构造方法2 成员变量 : 编译看左边(父类) , 执行看左边(父类)3 成员方法 : 编译看左边(父类) , 执行看右边(子类) , 注意 , 如果执行时1) 子类没有回动态去找父类中的方法2) 子类的特有方法无法进行调用(多态的缺点)*/
public class MemberTest {public static void main(String[] args) {// 父类的引用指向子类的对象Fu f = new Zi();// 多态对象调用成员变量System.out.println(f.num);// 多态对新乡调用调用成员方法f.show();// 多态对象不能调用子类特有的方法// f.show2();}
}class Fu {int num = 100;public void show() {System.out.println("父类的show方法");}
}class Zi extends Fu {int num = 10;public void show() {System.out.println("子类的show方法");}public void show2(){System.out.println("子类特有的方法");}
}

1.5 多态的优缺点

  • 优点 : 提高代码的扩展性
  • 缺点 : 不能调用子类特有的功能
public abstract class Animal {private String breed;private String color;public Animal() {}public Animal(String breed, String color) {this.breed = breed;this.color = color;}public String getBreed() {return breed;}public void setBreed(String breed) {this.breed = breed;}public String getColor() {return color;}public void setColor(String color) {this.color = color;}public abstract void eat();
}
public class Cat extends Animal {public Cat() {}public Cat(String breed, String color) {super(breed, color);}@Overridepublic void eat() {System.out.println("猫吃鱼...");}public void catchMouse() {System.out.println("抓老鼠...");}
}
public class Dog extends Animal {public Dog() {}public Dog(String breed, String color) {super(breed, color);}@Overridepublic void eat() {System.out.println("狗吃骨头!");}public void lookDoor(){System.out.println("狗看门...");}
}
public class Pig extends Animal {public Pig() {}public Pig(String breed, String color) {super(breed, color);}@Overridepublic void eat() {System.out.println("猪拱白菜...");}public void sleep() {System.out.println("一直再睡...");}
}
/*如果方法的参数是一个类的话 , 那么调用此方法需要传入此类的对象 , 或者子类对象多态的好处 :提高代码的扩展性 , 灵活性多态的缺点:不能调用子类的特有功能*/
public class AnimalTest {public static void main(String[] args) {useAnimal(new Cat());System.out.println("---------");useAnimal(new Dog());System.out.println("---------");useAnimal(new Pig());}public static void useAnimal(Animal a){// Animal a = new Dog()a.eat();// 多态不能访问子类特有的功能// 如果解决 ?// 向下转型if(a instanceof Cat) {Cat cat = (Cat) a;cat.catchMouse();}if(a instanceof Dog) {Dog dog = (Dog) a;dog.lookDoor();}if(a instanceof Pig) {((Pig) a).sleep();}}//    // 定义一个使用猫类的方法
//    public static void useAnimal(Cat c) {// Cat c = new Cat();
//        c.eat();
//        c.catchMouse();
//    }
//
//    // 定义一个使用狗类的方法
//    public static void useAnimal(Dog d) {// Dog d = new Dog();
//        d.eat();
//        d.lookDoor();
//    }
//
//    // 定义一个使用猪类的方法
//    public static void useAnimal(Pig pig) {
//        pig.eat();
//        pig.sleep();
//    }
}

1.6 多态的转型

  • 向上转型 : 把子类类型数据转成父类类型数据 Animal a = new Cat();
  • 向下转型 : 把父类类型数据转成子类类型数据 Cat cat = (Cat)a;

1.7 多态的转型注意

  • 如果被转的对象 , 对应的实际类型和目标类型不是同一种数据类型 , 那么转换时会出现ClassCastException异常

  • 异常代码如下
    public static void main(String[] args) {Animal a = new Cat();useAnimal(a);
    }
    public static void useAnimal(Animal a) {Dog d = (Dog) a;d.eat();
    }

1.8 解决转型安全隐患

  • 使用关键字 instanceof
  • 作用 : 判断一个对象是否属于一种引用数据类型
  • 格式 : 对象名 instanceof 引用数据类型
    • 通俗的理解:判断关键字左边的变量,是否是右边的类型,返回boolean类型结果

2 内部类

2.1 内部类的分类

  • 什么是内部类 ?
    • 一个A类 中 定义一个B类 , 那么B类就属于A类的内部类 , A类就属于B类的外部类
  • 什么时候使用内部类 ?
    • 多个事物之间有包含关系, 可以使用内部类
  • 内部类分类 ?
    • 成员内部类
    • 局部内部类
    • 匿名内部类

2.2 成员内部类

  • 定义的位置 : 类中方法外

  • 创建成员内部类对象格式 : 外部类名.内部类名 对象名 = new 外部类名().new 内部类名(参数);

    // 外部类
    public class Person {// 成员内部类public class Heart {// 频率变量private int rate;// 跳动方法public void beats() {System.out.println("咚咚咚!");}}
    }class Test {public static void main(String[] args) {// 创建内部类对象Person.Heart heart = new Person().new Heart();// 调用内部类中的方法heart.beats();}
    }
    
  • 成员内部类访问外部类的成员
    • 在内部类中有代表外部类对象的格式 : 外部类名的.this , 私有的也可以访问
    • 外部类要想访问内部类成员 , 需要创建内部类对象
    public class Person {private String name = "张三";private int num = 10;// 成员内部类public class Heart {int num = 100;// 频率private int rate;// 跳动public void beats() {System.out.println("咚咚咚!");}// 调用外部类的成员public void show(){int num = 1000;System.out.println(Person.this.name);System.out.println(num);// 1000 就近原则System.out.println(this.num);// 100System.out.println(Person.this.num);// 10}}
    }class Test {public static void main(String[] args) {Person.Heart heart = new Person().new Heart();heart.beats();heart.show();}
    }
    

2.3 匿名内部类

  • 匿名内部类 : 没有名字的类 , 一次性产品
  • 使用场景 : 直接调用方法 , 作为方法的传参 , 返回值类型
  • 好处 : 简化代码 , 快速实现接口或者抽象的抽象方法
  • 格式 :
    • new 类名/接口名(){ 重写抽象方法 } 注意 : 此处创建的是子类对象!!!
  • 使用方式 :
    • 直接调用方法
    • 作为方法的参数传递
    • 作为方法的返回值类型
//接口
interface Flyable {void fly();
}
// 直接调用方法
Flyable f1 = new Flyable() {@Overridepublic void fly() {System.out.println("不知道什么在飞.....");}
};
f1.fly();
// 作为方法的参数传递
showFlyable(new Flyable() {@Overridepublic void fly() {System.out.println("不知道什么在飞3333");}}
);public static void showFlyable(Flyable flyable) {flyable.fly();
}
// 作为方法的返回值类型
public static Flyable getFlyable() {return new Flyable() {@Overridepublic void fly() {System.out.println("3333333333333");}};
}
/*1 如果方法的参数是一个类的话 , 调用此方法需要传入此类的对象或者此类的子类对象2 如果方法的返回值类型是一个类的话 , 需要返回此类的对象 , 或者此类的子类对象3 如果方法的参数是一个接口的话 , 调用此方法需要传入此接口的实现类对象4 如果方法的返回值类型是一个接口的话 , 需要返回此接口的实现类对象匿名内部类 : 代表的就是子类对象!!!new 类名/接口名(){重写抽象类或者接口中的抽象方法};使用方向 :1 调用方法2 作为方法参数传递3 作为方法的返回值*/
public interface Swim {public abstract void swimming();
}class Test {public static void main(String[] args) {
//        // 子类对象!!!//  1 调用方法
//       new Swim() {
//            @Override
//            public void swimming() {
//                System.out.println("匿名内部类 , 重写了接口中的抽象方法...");
//            }
//        }.swimming();//        //   2 作为方法参数传递
//        useSwim(new Swim() {
//            @Override
//            public void swimming() {
//                System.out.println("匿名内部类 , 重写了接口中的抽象方法...");
//            }
//        });//        // 3 作为方法的返回值
//        Swim s = getSwim();
//        s.swimming();}public static Swim getSwim() {return new Swim() {@Overridepublic void swimming() {System.out.println("匿名内部类 , 重写了接口中的抽象方法...");}};}/*Swim swim = new Swim() {@Overridepublic void swimming() {System.out.println("匿名内部类 , 重写了接口中的抽象方法...");}};*/public static void useSwim(Swim swim) {swim.swimming();}
}


在这里插入图片描述



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

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

相关文章

【医学大模型】大模型 + 长期慢病的预测和管理

大模型 长期慢病的预测和管理 提出背景长期慢病框架慢性疾病检测框架如何实现多提示工程为什么使用多提示 慢性疾病管理框架个性化提示工程医学知识注入 提出背景 论文:https://arxiv.org/abs/2401.12988 慢性疾病是指那些需要长期管理和治疗的疾病,包…

PyTorch深度学习实战(37)——CycleGAN详解与实现

PyTorch深度学习实战(37)——CycleGAN详解与实现 0. 前言1. CycleGAN 基本原理2. CycleGAN 模型分析3. 实现 CycleGAN小结系列链接 0. 前言 CycleGAN 是一种用于图像转换的生成对抗网络(Generative Adversarial Network, GAN),可以在不需要配…

车灯裂了用什么胶修复?

当车灯出现裂缝、破口、缺损、裂痕、破裂、破损、崩角、掉角等问题时,可以使用车灯无痕修复专用UV胶进行修复。车灯无痕修复专用UV胶是一种经过处理的UV树脂胶,主要成份是改性丙烯酸UV树脂。应用在车灯的专业无痕修复领域。 具有如下特点: 1…

详细描述一下CrossOver2024版本的用途和作用?

当然可以。CrossOver 是一款由 CODE WEAVERS 公司开发的软件,其主要目标是在 macOS 和 Linux 系统上实现与 Windows 应用程序的兼容性。它不同于传统的虚拟机,如 Parallels 或 VMware,因为它并不在 macOS 上创建一个完整的 Windows 环境。相反…

基于机器学习的青藏高原高寒沼泽湿地蒸散发插补研究_王秀英_2022

基于机器学习的青藏高原高寒沼泽湿地蒸散发插补研究_王秀英_2022 摘要关键词 1 材料和方法1.1 研究区概况与数据来源1.2 研究方法 2 结果和分析2.1 蒸散发通量观测数据缺省状况2.2 蒸散发与气象因子的相关性分析2.3 不同气象因子输入组合下各模型算法精度对比2.4 随机森林回归模…

安卓系统签名方法

首先在源码中创建key目录用来存放我们需要的文件,一般需要build/target/product/security/platform.pk8,build/target/product/security/platform.x509.pem,然后执行命令openssl pkcs8 -inform DER -nocrypt -in platform.pk8 -out platform.…

9.vue学习笔记(组件传递Props校验+组件事件-组件传递数据+组件事件-配合“v-model”使用)

文章目录 1.组件传递Props校验1.1.默认值1.2.必选项1.3.注意事项:props 是只读的 2.组件事件-组件传递数据2.1.温馨提示:组件之间传递数据的方案 3.组件事件-配合“v-model”使用 1.组件传递Props校验 Vue组件可以更细致地声明对传入的 props 的校验要求…

重铸安卓荣光——复选框ButtonCheckBox

痛点: 公司打算做安卓软件,最近在研究安卓,打算先绘制样式 研究发现安卓并不像前端有那么多组件库,甚至有些基础的组件都需要自己实现,记录一下自己实现的组件 成品展示 一个复选框样式 选中时背景橙色,带…

升级到PHP8.X的原因和方法

上周有一个使用Hostease美国主机服务器多年的客户,反馈需要升级到PHP8.x,原因是站点程序已升级,并希望站点运行在更高也稳定的PHP8.x上。在升级PHP8.x的过程中,联系我们并反馈在升级过程中遇到了问题,需求解决方案。 升…

利用LaTex批量将eps转pdf、png转eps、eps转png、eps转svg

1、eps转pdf 直接使用epstopdf命令(texlive、mitex自带)。 在cmd中进入到eps矢量图片的目录,使用下面的命令: for %f in (*.eps) do epstopdf "%f" 下面是plt保存eps代码: import matplotlib.pyplot as…

新手学习Cesium的几点建议

Cesium是当前非常火热的三维数字地球开发框架,很多公司基于Cesium做项目以及形成了自己的产品,关于Cesium的学习,有诸多网站、书籍、学习资料甚至培训教材,这里不再详细推荐,从学习Cesium的角度,资料和教程…

Android14 InputManager-InputReader的处理

IMS启动时会调用InputReader.start()方法 InputReader.cpp status_t InputReader::start() {if (mThread) {return ALREADY_EXISTS;}mThread std::make_unique<InputThread>("InputReader", [this]() { loopOnce(); }, [this]() { mEventHub->wake(); });…

2.2 request的使用

目录 2.2.1、request简介 2.2.2、GET请求 1 GET请求返回对象的一些属性 2 params 参数 3 response.text的真面目 2.2.1、request简介 提供爬虫需要的函数 2.2.2、GET请求 1 GET请求返回对象的一些属性 import requestsurl https://www.baidu.com/ response requests.…

145. Binary Tree Postorder Traversal(二叉树的后序遍历)

问题描述 给你一棵二叉树的根节点 root &#xff0c;返回其节点值的 后序遍历 。 问题分析 此问题与二叉树的前序遍历分析类似&#xff0c;只是在数组合并的时候顺序发生一下变化就行了。 代码 int* postorderTraversal(struct TreeNode* root, int* returnSize) {if(root…

前端基础自学整理|DOM树

DOM&#xff0c;文档对象模型&#xff08;Document Object Model&#xff09;&#xff0c;简单的说&#xff0c;DOM是一种理念&#xff0c;一种思想&#xff0c;一个与系统平台和编程语言无关的接口&#xff0c;一种方法, 使 Web开发人员可以访问HTML元素&#xff01;不是具体方…

2-21算法习题总结

由于蓝桥杯的题,我不知道从怎么复制,就只能粘贴图片了 翻硬币 代码 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);String start sc.next();char[] starts start.toCharArray();String end sc…

黑马头条-day10

文章目录 app端文章搜索1、文章搜索1.1 ElasticSearch环境搭建1.2 索引库创建①需求分析②ES导入数据场景分析③创建索引和映射 1.3 索引数据同步①app文章历史数据导入ES②文章实时数据导入ES 1.4 文章搜索多条件复合查询①关键词搜索②搜索接口定义 2、搜索历史记录2.1 需求说…

SpringBoot原理篇

文章目录 SpingBoot原理1. 配置优先级2. Bean管理2.1 获取Bean2.2 Bean作用域2.3 第三方Bean 3. SpringBoot原理3.1 起步依赖3.2 自动配置3.2.1 概述3.2.2 常见方案3.2.2.1 概述3.2.2.2 方案一3.2.2.3 方案二 3.2.3 原理分析3.2.3.1 源码跟踪3.2.3.2 Conditional 3.2.4 案例3.2…

ChatGPT 4.0 升级指南

1.ChatGPT 是什么&#xff1f; ChatGPT 是由 OpenAI 开发的一种基于人工智能的聊天机器人&#xff0c;它基于强大的语言处理模型 GPT&#xff08;Generative Pre-trained Transformer&#xff09;构建。它能够理解人类语言&#xff0c;可以为我们解决实际的问题。 1.模型规模…

Vue中 Runtime-Only和Runtime + Compiler的区别

在 Vue 项目中&#xff0c;Runtime-Only 和 Runtime Compiler 是两种不同的构建方式。 Runtime-Only&#xff08;仅运行时&#xff09;&#xff1a;在 Runtime-Only 构建中&#xff0c;Vue 库只包含运行时的代码&#xff0c;不包含模板编译器。。Runtime Compiler&#xff08…