【Java】多态、final关键字、抽象类、抽象方法

多态(Polymorphism)

【1】多态跟属性无关,多态指的是方法的多态,而不是属性的多态。

2】案例代入:

  1. public class Animal {//父类:动物:
  2.     public void shout(){
  3.         System.out.println("我是小动物,我可以叫。。。");
  4.     }
  5. }

  1. public class Cat extends Animal{
  2.     //喊叫方法:
  3.     public void shout(){
  4.         System.out.println("我是小猫,可以喵喵叫");
  5.     }
  6.     public void scratch(){
  7.         System.out.println("我是小猫,我可以挠人");
  8.     }
  9. }

  1. public class Dog extends Animal{
  2.     //喊叫:
  3.     public void shout(){
  4.         System.out.println("我是小狗,我可以汪汪叫");
  5.     }
  6.     public void guard(){
  7.         System.out.println("我是小狗,我可以看家护院,保护我的小主人。。。");
  8.     }
  9. }

  1. public class Pig extends Animal{
  2.     public void shout(){
  3.         System.out.println("我是小猪,我嗯嗯嗯的叫");
  4.     }
  5.     public void eat(){
  6.         System.out.println("我是小猪,我爱吃东西。。");
  7.     }
  8. }

  1. public class Girl {
  2.     //跟猫玩耍:
  3.     /*public void play(Cat cat){
  4.         cat.shout();
  5.     }*/
  6.     //跟狗玩耍:
  7.     /*public void play(Dog dog){
  8.         dog.shout();
  9.     }*/
  10.     //跟小动物玩耍:
  11.     public void play(Animal an){
  12.         an.shout();
  13.     }
  14. }

  1. public class Test {
  2.     //这是一个main方法,是程序的入口:
  3.     public static void main(String[] args) {
  4.         //具体的猫:--》猫的对象
  5.         //Cat c = new Cat();
  6.         //具体的小女孩:--》女孩的对象
  7.         Girl g = new Girl();
  8.         //小女孩跟猫玩:
  9.         //g.play(c);
  10.         //具体的狗---》狗的对象:
  11.         //Dog d = new Dog();
  12.         //小女孩跟狗玩:
  13.         //g.play(d);
  14.         //具体的动物:--》动物的对象:
  15.         //Cat c = new Cat();
  16.         //Dog d = new Dog();
  17.         Pig p = new Pig();
  18.         Animal an = p;
  19.         g.play(an);
  20.     }
  21. }

【3】总结:

(1)先有父类,再有子类:--》继承   先有子类,再抽取父类 ----》泛化 

(2)什么是多态:

多态就是多种状态:同一个行为,不同的子类表现出来不同的形态。

多态指的就是同一个方法调用,然后由于对象不同会产生不同的行为。

(3)多态的好处:

为了提高代码的扩展性,符合面向对象的设计原则:开闭原则。

开闭原则:指的就是扩展是 开放的,修改是关闭的。

注意:多态可以提高扩展性,但是扩展性没有达到最好,以后我们会学习 反射

(4)多态的要素:

一,继承:   Cat extends Animal  ,Pig extends Animal,   Dog extends Animal

二,重写:子类对父类的方法shout()重写

三, 父类引用指向子类对象:

  1. Pig p = new Pig();
  2. Animal an = p;

将上面的代码合为一句话:

Animal an = new Pig();

=左侧:编译期的类型

=右侧:运行期的类型

Animal an = new Pig();

g.play(an); //

  1. public void play(Animal an){//Animal an = an = new Pig();
  2.         an.shout();
  3.     }

上面的代码,也是多态的一种非常常见的应用场合:父类当方法的形参,然后传入的是具体的子类的对象,

然后调用同一个方法,根据传入的子类的不同展现出来的效果也不同,构成了多态。

内存分析

向下转型,向上转型

现在我就想访问到eat()方法和weight属性:

  1. public class Demo {
  2.     //这是一个main方法,是程序的入口:
  3.     public static void main(String[] args) {
  4.         Pig p = new Pig();
  5.         Animal an = p;//转型:向上转型
  6.         an.shout();
  7.         //加入转型的代码:
  8.         //将Animal转为Pig类型:
  9.         Pig pig = (Pig)an ;//转型:向下转型
  10.         pig.eat();
  11.         pig.age = 10;
  12.         pig.weight = 60.8;
  13.     }
  14. }

对应内存:

思考之前的equals方法:

简单工厂设计模式

不仅可以使用父类做方法的形参,还可以使用父类做方法的返回值类型,真实返回的对象可以是该类的任意一个子类对象。

简单工厂模式的实现,它是解决大量对象创建问题的一个解决方案。将创建和使用分开,工厂负责创建,使用者直接调用即可。简单工厂模式的基本要求是

² 定义一个static方法,通过类名直接调用

² 返回值类型是父类类型,返回的可以是其任意子类类型

² 传入一个字符串类型的参数,工厂根据参数创建对应的子类产品

  1. public class Test {
  2.     public static void main(String[] args) {
  3.         Girl g = new Girl();
  4.         //Cat c = new Cat();
  5.         //Dog d = new Dog();
  6.         //Pig p = new Pig();
  7.         Animal an = PetStore.getAnimal("狗");
  8.         g.play(an);
  9.     }
  10. }

  1. public class PetStore {//宠物店 ---》工厂类
  2.     //方法:提供动物
  3.     public static Animal getAnimal(String petName){//多态的应用场合(二)
  4.         Animal an = null;
  5.         if("猫".equals(petName)){//petName.equals("猫") --》这样写容易发生空指针异常
  6.             an = new Cat();
  7.         }
  8.         if("狗".equals(petName)){
  9.             an = new Dog();
  10.         }
  11.         if("猪".equals(petName)){
  12.             an = new Pig();
  13.         }
  14.         return an;
  15.     }
  16. }
final

【1】修饰变量;

  1. public class Test {
  2.     //这是一个main方法,是程序的入口:
  3.     public static void main(String[] args) {
  4.         //第1种情况:
  5.         //final修饰一个变量,变量的值不可以改变,这个变量也变成了一个字符常量,约定俗称的规定:名字大写
  6.         final int A = 10;//final修饰基本数据类型
  7.         //A = 20; 报错:不可以修改值
  8.         //第2种情况:
  9.         final Dog d = new Dog();//final修饰引用数据类型,那么地址值就不可以改变
  10.         //d = new Dog(); -->地址值不可以更改
  11.         //d对象的属性依然可以改变:
  12.         d.age = 10;
  13.         d.weight = 13.7;
  14.         //第3种情况:
  15.         final Dog d2 = new Dog();
  16.         a(d2);
  17.         //第4种情况:
  18.         b(d2);
  19.     }
  20.     public static void a(Dog d){
  21.         d = new Dog();
  22.     }
  23.     public static void b(final Dog d){//d被final修饰 ,指向不可以改变
  24.         //d = new Dog();
  25.     }
  26. }

【2】修饰方法;

final修饰方法,那么这个方法不可以被该类的子类重写:

【3】修饰类;

final修饰类,代表没有子类,该类不可以被继承:

一旦一个类被final修饰,那么里面的方法也没有必要用final修饰了(final可以省略不写)

【4】案例:JDK提供的Math类:看源码发现:

(1)使用Math类的时候无需导包,直接使用即可:

(2)Math类没有子类,不能被其他类继承了

(3)里面的属性全部被final修饰,方法也是被final修饰的,只是省略不写了

原因:子类没有必要进行重写。

(4)外界不可以创建对象:

Math m = new Math();

(5)发现Math类中的所有的属性,方法都被static修饰

那么不用创建对象去调用,只能通过类名.属性名  类名.方法名 去调用

抽象类,抽象方法

【1】抽象类和抽象方法的关系:

抽象类中可以定义0-n个抽象方法。

【2】抽象类作用:

在抽象类中定义抽象方法,目的是为了为子类提供一个通用的模板,子类可以在模板的基础上进行开发,先重写父类的抽象方法,然后可以扩展子类自己的内容。抽象类设计避免了子类设计的随意性,通过抽象类,子类的设计变得更加严格,进行某些程度上的限制。

使子类更加的通用。

【3】代码:

  1. package com.star.test03;
  2. //4.一个类中如果有方法是抽象方法,那么这个类也要变成一个抽象类。
  3. //5.一个抽象类中可以有0-n个抽象方法
  4. public abstract class Person {
  5.     //1.在一个类中,会有一类方法,子类对这个方法非常满意,无需重写,直接使用
  6.     public void eat(){
  7.         System.out.println("一顿不吃饿得慌");
  8.     }
  9.     //2.在一个类中,会有一类方法,子类对这个方法永远不满意,会对这个方法进行重写。
  10.     //3.一个方法的方法体去掉,然后被abstract修饰,那么这个方法就变成了一个抽象方法
  11.     public abstract void say();
  12.     public abstract void sleep();
  13. }
  14. //6.抽象类可以被其他类继承:
  15. //7.一个类继承一个抽象类,那么这个类可以变成抽象类
  16. //8.一般子类不会加abstract修饰,一般会让子类重写父类中的抽象方法
  17. //9.子类继承抽象类,就必须重写全部的抽象方法
  18. //10.子类如果没有重写父类全部的抽象方法,那么子类也可以变成一个抽象类。
  19. class Student extends Person{
  20.     @Override
  21.     public void say() {
  22.         System.out.println("我是东北人,我喜欢说东北话。。");
  23.     }
  24.     @Override
  25.     public void sleep() {
  26.         System.out.println("东北人喜欢睡炕。。");
  27.     }
  28. }
  29. class Demo{
  30.     //这是一个main方法,是程序的入口:
  31.     public static void main(String[] args) {
  32.         //11.创建抽象类的对象:-->抽象类不可以创建对象
  33.         //Person p = new Person();
  34.         //12.创建子类对象:
  35.         Student s = new Student();
  36.         s.sleep();
  37.         s.say();
  38.        
  39.         //13.多态的写法:父类引用只想子类对象:
  40.         Person p  = new Student();
  41.         p.say();
  42.         p.sleep();
  43.     }
  44. }

【4】面试题:

(1)抽象类不能创建对象,那么抽象类中是否有构造器?

抽象类中一定有构造器。构造器的作用  给子类初始化对象的时候要先super调用父类的构造器。

(2)抽象类是否可以被final修饰?

不能被final修饰,因为抽象类设计的初衷就是给子类继承用的。要是被final修饰了这个抽象类了,就不存在继承了,就没有子类。

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

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

相关文章

JAVA-CopyOnWrite并发集合

文章目录 JAVA并发集合1_实现原理2_什么是CopyOnWrite?3_CopyOnWriteArrayList的原理4_CopyOnWriteArraySet5_使用场景6_总结 JAVA并发集合 从Java5开始,Java在java.util.concurrent包下提供了大量支持高效并发访问的集合类,它们既能包装良好的访问性能…

无人机的发展

朋友们,你们知道吗?无人机的发展之路可谓是科技界的一股清流,风头正劲啊!从最初简单的遥控飞机到现在各种智能功能的加持,无人机真是越来越神奇了! 首先,无人机在航拍领域大放异彩!无…

ETL可视化工具 DataX -- 简介( 一)

引言 DataX 系列文章: ETL可视化工具 DataX – 安装部署 ( 二) 1.1 DataX 1.1.1 Data X概览 DataX 是阿里云DataWorks数据集成的开源版本,在阿里巴巴集团内被广泛使用的离线数据同步工具/平台。DataX 实现了包括 MySQL、Oracle、OceanBase、SqlServ…

ChatGPT 提示词技巧一本速通

一、基本术语 概念 定义 案例 提示词 prompt 向AI模型提出的问题或者指示,告诉它我们希望得到什么样的回答或结果,是与模型互动的主要形式。 任务:生成一封电子邮件邀请。 提示词:请帮我写一封邀请同事参加下周五团队建设活…

Vue引入element-plus-04

我们这次开发是使用vue的脚手架来进行开发,前面我们已经使用过最原生的方式去编写我们的vue的语法,从今天开始就使用vue的脚手架,但是前提是你需要用于node的环境 在我们开始之前,我们至少需要有node npm是什么? npm是一个强大的包管理工具,它…

Stable Diffusion【应用篇】【艺术写真】:粘土风之后陶瓷风登场,来看看如何整合AI艺术写真吧

在国外的APP Remini引爆了粘土滤镜后,接着Remini又推出了瓷娃娃滤镜。相当粘土滤镜,个人更喜欢瓷娃娃滤镜,因为陶瓷工艺更符合东方艺术审美。 下面我们就来看看陶瓷特效在AI写真方面的应用。话不多说,我们直接开整。 关于粘土整…

基于BERT微调+模板填充快速实现文本转DSL查询语句

前言 Text2SQL是指将自然语言转化为类SQL查询语句,使得用户的查询文本可以直接实现和数据库交互,本文介绍一种以BERT为基础模型,通过模板填充来实现的Text2SQL算法和产品化。 内容摘要 Text2SQL任务说明模板填充的思路条件列选择子模型搭建…

TCGAbiolinks包学习

TCGAbiolinks 写在前面学习目的GDCquery GDCdownload GDC prepare中间遇到的报错下载蛋白质数据 写在前面 由于别人提醒我TCGA的数据可以利用TCGAbiolinks下载并处理,所以我决定阅读该包手册,主要是该包应该是有更新的,我看手册进行更新了&…

Kotlin编程实践-【Java如何调用Kotlin中带默认值参数的函数】

问题 如果你有一个带有默认参数值的 Kotlin 函数,如何从 Java 调用它而无须为每个参数显式指定值? 方案 为函数添加注解JvmOverloads。 也就是为Java添加重载方法,这样Java调用Kotlin的方法时就不用传递全部的参数了。 示例 在 Kotlin …

干部管理软件有哪些

随着信息技术的飞速发展,干部管理软件在各级党政机关、国企事业单位中扮演着越来越重要的角色。这些软件通过整合干部管理的各项业务流程,实现了干部信息的系统化、规范化和高效化管理。以下是几款主流的干部管理软件及其特点: 一、干部信息…

基于python深度学习的CNN图像识别鲜花-含数据集+pyqt界面

代码下载: https://download.csdn.net/download/qq_34904125/89383615 本代码是基于python pytorch环境安装的。 下载本代码后,有个requirement.txt文本,里面介绍了如何安装环境,环境需要自行配置。 或可直接参考下面博文进行…

AI 一键换脸,背景替换,ioDraw让图片更有趣

还在为繁琐的图片处理而烦恼吗?快来试试ioDraw的AI图片工具! 它集图像识别、图像生成、智能换脸、背景替换、图像融合、肖像风格化、空间风格化、智能扩图、智能抠图、画质提升、美颜、拉伸修复、透视校正等功能于一身,为你提供前所未有的图…

(Javascript)AI数字人mp4转canvas播放并去除背景绿幕

1、需求介绍 H5页面嵌入AI数字人播报&#xff0c;但生成的数字人是mp4格式且有绿幕背景&#xff0c;需要转成canvas并去除背景&#xff1b; 2、效果&#xff1a; 去除前&#xff1a; 去除后&#xff1a; 3、代码 <!DOCTYPE html> <html lang"en"><…

【第9章】Vue之Element Plus快速入门

文章目录 前言一、安装1. 兼容性2. 安装 二、按需导入1.自动导入2.Vite 三、全局配置四、官方案例五、效果总结 前言 基于 Vue 3&#xff0c;面向设计师和开发者的组件库。 一、安装 1. 兼容性 Element Plus 目前还处于快速开发迭代中。 由于 Vue 3 不再支持 IE11&#xff0c…

Opus从入门到精通(五)OggOpus封装器全解析

Opus从入门到精通(五)OggOpus封装器全解析 为什么要封装 前面Opus从入门到精通(四)Opus解码程序实现提到如果不封装会有两个问题: 无法从文件本身获取音频的元数据(采样率,声道数,码率等)缺少帧分隔标识,无法从连续的文件流中分隔帧(尤其是vbr情况) 针对上面的问题我们可以…

北京活动会议通常会邀约哪些媒体参会报道?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 北京作为我国的首都和文化中心&#xff0c;各类活动会议资源丰富&#xff0c;吸引了众多媒体的关注。以下是一些通常会被邀约参会报道的重要媒体类型&#xff1a; 国家级新闻机构&#x…

flink standalone部署模式

standalone模式可以在单台机器以不同进程方式启动&#xff0c;也可以以多机器分布式方式启动。 任务的提交模式有三种&#xff1a;application mode、session model、per-job mode&#xff08;1.4x版本后过时&#xff09;。 注意区分任务的提交模式与集群的部署模式区别。 以…

注册中心理论学习

注册中心介绍 注册中心&#xff08;也称为服务注册中心或服务发现服务&#xff09;是微服务架构中的一个关键组件&#xff0c;它负责服务的注册与发现。在微服务体系中&#xff0c;服务实例的数量和位置是动态变化的&#xff0c;注册中心提供了一个集中的地方来存储这些信息&a…

linux中DNS域名解析服务(后续补充)

分离解析简介&#xff1a; 分离解析的域名服务器实际也是主域名服务器&#xff0c;这里主要是指根据不同的客户端提供不同的域名解析记录。比如来自内网和外网的不同网段地址的客户机请求解析同一域名时&#xff0c;为其提供不同的解析结果。 实验要求&#xff1a;防火墙要么关…

AMSR-MODIS 边界层水汽 L3 每日 1 度 x 1 度 V1、V2 版本数据集

AMSR-MODIS Boundary Layer Water Vapor L3 Daily 1 degree x 1 degree V1 (AMDBLWV) at GES DISC AMSR-MODIS Boundary Layer Water Vapor L3 Daily 1 degree x 1 degree V2 (AMDBLWV) at GES DISC 简介 该数据集可估算均匀云层下的海洋边界层水汽。AMSR-E 和 AMSR-2 的微波…