当前位置: 首页 > news >正文

17、JAVA入门——多态、抽象方法和抽象类

✅作者简介:热爱国学的后端开发者,修心和技术同步精进。

🍎个人主页:BOOL DoubleYellow的博客

🍊个人信条:不迁怒,不贰过。小知识,大智慧。

✨特色专栏:​乐趣国学 ​

🥭本文内容:JAVA入门——多态、抽象方法和抽象类 

更多内容点击👇

                       JAVA入门——继承和方法重写

                       JAVA入门——封装

目录

⛳️ 一、多态

❤️  1、 认识多态

❤️  2、 向上转型

❤️  3、 向下转型

❤️  4、 instanceof运算符

❤️  5、多态的优势主

❤️  6、多态的两种主要应用形式

⛳️ 二、抽象方法和抽象类

❤️  1、 区分普通方法和抽象方法

❤️  2、 区分普通类和抽象类

❤️  3、 定义一个抽象类

❤️  4、 使用抽象类描述抽象的事物

❤️  5、抽象类和抽象方法的优势

❤️  6、 抽象类的局限性


⛳️ 一、多态

❤️  1、 认识多态

        (1)多态一词的通常含义是指能够呈现出多种不同的形式或形态。

        (2)在程序设计的术语中,它意味着一个特定类型的变量可以引用不同类型的对象,并且自动地调用引用的对象的方法,也就是根据作用到的不同对象类型,响应不同的操作。

        (3)方法重写是实现多态的基础。

        (4)多态意味着在一次方法调用中根据包含的对象的实际类型(即实际的子类对象)来决定应该调用哪个方法,而不是由用来存储对象引用的变量的类型决定的。

        当调用一个方法时,为了实现多态的操作,这个方法既是在父类中声明过的,也必须是在子类中重写过的方法。

❤️  2、 向上转型

        (1)向上转型:子类向父类的转换称为向上转型。

        (2)向上转型的语法格式如下:

                <父类型> <引用变量> = new <子类型>();

                -->将一个父类的引用指向一个子类对象称为向上转型,系统会自动进行类型转换。

                -->此时通过父类引用变量调用的方法是子类覆盖或继承了父类的方法,不是父类的方法。

                -->此时通过父类引用变量无法调用子类特有的方法。

        //向上转型:父类的引用(对象名)指向子类的实例(对象)
		Animal animal = new Dog("奥迪", 30, 90, "泰迪");
		System.out.println("看病前的健康值:"+animal.getHealth());
		master.cure(animal);
		System.out.println("看病后的健康值:"+animal.getHealth());

❤️  3、 向下转型

        (1)向上转型中,父类引用变量无法调用子类特有的方法,如果需要调用子类特有的方法,可以通过把父类转换为子类来实现。

        (2)向下转型:将一个指向子类对象的父类引用赋给一个子类的引用,即将父类类型转换为子类类型,称为向下转型,此时必须进行强制类型转换。

        (3)向下转型的语法格式如下:

                <子类型> <引用变量名> = (<子类型>)<父类型的引用变量>;

        (4)上述这种向下转型的操作对接口和抽象(普通)父类同样适用。

        //向下转型:子类的引用(对象名)指向父类的引用(对象名)
		Dog dog =(Dog)animal;
		dog.eat();

❤️  4、 instanceof运算符

        (1)在向下转型的过程中,如果不是转换为真实子类类型,会出现类型转换异常(ClassCastException)。

        (2)在Java中提供了instanceof运算符类进行类型的判断。

        (3)使用instanceof时,对象的类型必须和instanceof后面的参数所指定的类有继承关系,否则会出现编译错误。

        (4)instanceof通常和强制类型转换结合使用。

		/*
		 * 在向下转型的时候,有可能转换错误,没有转换成其指向的子类,这时候会报ClassCastException            
         * 异常
		 * 我们可以在转型之前使用instanceof关键字进行判断父类引用指向了哪个子类对象
		 * 
		 * 
		 */
		
		if(animal instanceof Dog){
			Dog dog2 =(Dog)animal;
			dog2.eat();
		}else if(animal instanceof Penguin){
			Penguin penguin2 = (Penguin)animal;
			penguin2.swimming();
		}else if(animal instanceof Tiger){
			Tiger tiger2 =(Tiger)animal;
			tiger2.sleep();
		}

❤️  5、多态的优势主

        -->可替换性:多态对已存在的代码具有可替换性。

        -->可扩充性:多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特征的运行和操作。实际上新加子类更容易获得多态功能。

        -->接口性:多态是父类向子类提供了一个共同接口,由子类来具体实现。

        -->灵活性:多态在应用中体现了灵活多样的操作,提高了使用效率。

        -->简化性:多态简化了应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。

❤️  6、多态的两种主要应用形式

        (1) 使用父类作为方法的形参

        (2)使用父类作为方法的返回值

⛳️ 二、抽象方法和抽象类

❤️  1、 区分普通方法和抽象方法

        (1)在Java中,当一个类的方法被abstract关键字修饰时,该方法称为抽象方法。

        (2)抽象方法所在的类必须定义为抽象类。

        (3)当一个方法被定义为抽象方法后,意味着该方法不会有具体的实现(没有方法体),而是在抽象类的子类中通过方法重写进行实现。

        (4)定义抽象方法的语法格式如下:

                [访问修饰符] abstract <返回类型> <方法名>([参数列表]);

                -->抽象方法需要使用abstract修饰,普通方法不需要。

                -->抽象方法没有方法体,普通方法没有。

                -->抽象方法所在的类必须被定义为抽象类。

                -->抽象方法在子类中必须被实现(子类要重写父类中的抽象方法),如果子类不实现,则子类要定位为抽象类。

                -->private关键字不能用来修饰抽象方法。

                -->abstract修饰符不能和final修饰符一起使用。

public abstract class Pet { 

       public abstract void toHospital() ;//抽象方法

}

❤️  2、 区分普通类和抽象类

        (1)在Java中,当一个类被abstract关键字修饰时,该类称为抽象类。

        (2)定义抽象类的语法格式如下:

                abstract class <类名>{

                        //代码

                }

                -->抽象类需要用修饰符abstract修饰,普通类不需要。

                -->普通类可以实例化,抽象类不能被实例化。

                -->抽象类中可以有抽象方法也可以没有抽象方法,可以有普通方法也可以没有普通方法。

                -->抽象类中可以包含普通类包含的一切成员。

//抽象类
public abstract class Pet { 

       public abstract void toHospital() ;//抽象方法

}

❤️  3、 定义一个抽象类

        当一个类被定义为抽象类时,它可以包含各种类型的成员,包括属性、方法等。其中方法又可以分为普通方法和抽象方法。

        public abstract class 类名称{

                修饰符 abstract 返回类型 方法名();

                修饰符 返回类型 方法名(){

                        //方法体

                }

        }

❤️  4、 使用抽象类描述抽象的事物

        当一个类实例化没有意义时,可以将该类定义为抽象类

❤️  5、抽象类和抽象方法的优势

        (1)抽象类中已经实现的方法可以被子类使用,使代码可以被复用。

        (2)抽象类中的抽象方法,子类需要进行重写,保证了子类具有自身的独特性。

❤️  6、 抽象类的局限性

        (1)抽象类有时候会出现代码冗余的问题。

        (2)类的继承是单根继承,一个类只能直接继承一个类。


       码文不易,本篇文章就介绍到这里,如果想要学习更多Java系列知识,请关注博主,博主带你零基础学习Java知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目:《国学周更—心性养成之路》,学习技术的同时,我们也注重了心性的养成。

相关文章:

  • [Spring实战] 整合Spring/SpringMVC/Mybatis(SSM)实现登录与注册功能(带前端)
  • [教你做小游戏] 滑动选中!PC端+移动端适配!完美用户体验!斗地主手牌交互示范
  • kafka的auto.offset.reset详解与测试
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • 内存分析总结
  • awk编辑器
  • 基于Java毕业设计游泳馆管理平台源码+系统+mysql+lw文档+部署软件
  • 2022年全国大学生数学建模竞赛C题思路与程序
  • `算法知识` 字符串哈希
  • 打造这样的“超级云APP”有什么优势?
  • 一篇文章带你理解Thread(多线程)的基础用法
  • harbor部署实录
  • 计算机毕业设计ssmEE的仓库管理系统93c6b系统+程序+源码+lw+远程部署
  • MySQL group by后取每个分组中最新一条数据
  • JVM:(十六)垃圾回收器
  • 【个人向】《HTTP图解》阅后小结
  • golang中接口赋值与方法集
  • HTML-表单
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • java8-模拟hadoop
  • Java比较器对数组,集合排序
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • Redis中的lru算法实现
  • SpringBoot 实战 (三) | 配置文件详解
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 关于extract.autodesk.io的一些说明
  • 关于字符编码你应该知道的事情
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • - 转 Ext2.0 form使用实例
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • Prometheus VS InfluxDB
  • 容器镜像
  • 组复制官方翻译九、Group Replication Technical Details
  • ​Python 3 新特性:类型注解
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #Spring-boot高级
  • (06)金属布线——为半导体注入生命的连接
  • (2)STL算法之元素计数
  • (C)一些题4
  • (C++)八皇后问题
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (阿里云万网)-域名注册购买实名流程
  • (二)WCF的Binding模型
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (三分钟)速览传统边缘检测算子
  • .describe() python_Python-Win32com-Excel
  • .net中调用windows performance记录性能信息
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • [C++]unordered系列关联式容器
  • [CF226E]Noble Knight's Path
  • [HCTF 2018]WarmUp (代码审计)
  • [IE编程] WebBrowser控件的多页面浏览(Tabbed Browsing)开发接口
  • [IE技巧] IE 中打开Office文件的设置