Day12——JavaOOP——多态、抽象类;封装、继承、多态;abstract关键字

news/2024/7/8 16:29:36 标签: 多态, 抽象类, java, 封装

Java面向对象—多态
同一个对象的不同形态称之为多态
向同一父类的不同子类对象发送同一条消息,行为不同

声明父类对象用于保存创建的子类对象
可以用父类对象保存任意子类对象
在这里插入图片描述
• 现实生活中存在很多多态的例子。
• 例如:水在100摄氏度的高温下是气体,在常温下是液体,在0摄氏度以下是固体。这里的多态是指一个对象具有多种形态
• OOP中的多态与之类似。
• 同一个引用类型,使用不同的实例可以执行不同的操作,即父类引用子类对象——向上转型。

多态的特点
1、子类重写父类的方法
2、编写方法时,参数使用父类对象,并调用父类定义的方法
3、运行时,根据实际创建的对象类型动态决定使用哪个方法

多态发生的前提
1、 必须存在继承关系
2、 子类必须重写父类方法
3、 必须发生向上转型

“向上转型”也就是把子类转换成父类,这符合继承中的is-a关系(狗是宠物),这是自动类型转换
使用“向上转型”时我们无法调用子类独有的方法。
父类对象的引用赋值给一个子类对象,称之为“向下转型”,也就是把父类转换成子类,此时必须进行强制类型转换。
“向下转型”之前必须确定要转型的父类对象就是要转型的子类对象,否则会出现编译错误,或者类型转换异常。
向下转型成功的前提对象是先经过向上转型后得出的父类对象向下转化为原子类对象

使用多态的优点与缺点
优点:
  提高了代码的维护性(继承保证)
  提高了代码的扩展性(多态保证)
缺点:
  不能使用子类的特有功能( 变量、方法 )
向上转型与向下转型的简单原理
不是向上转型与向下转型的真实原理(理解模型)

java">Cat cat = new Cat("大菊", 100);
		System.out.println("向上转型之前:" + cat.hashCode());
		Pet p = cat;
		// 向上转型 声明父类对象 保存创建 的子类对象实例
		System.out.println("向上转型之后:" + p.hashCode());
		Cat c = (Cat) p;
		// 向下转型 将之前向上转型的对象转换为子类对象
		System.out.println("向下转型之后:" + c.hashCode());
		*结论:不论对象经过多少次向上向下转型实际上都是对原对象进行操作*
        向上转型之前:366712642
        向上转型之后:366712642
        向下转型之后:366712642

结论:不论对象经过多少次向上向下转型实际上都是对原对象进行操作
向上转型之前:366712642
向上转型之后:366712642
向下转型之后:366712642

Java面向对象三大特性
封装
使用访问权限修饰符修饰属性与方法,使其只对可见类生效
使用private修饰属性与方法,提供公开的调用与赋值的方法
继承
子类继承父类,继承使用父类所有非私有的属性与方法
使用extends关键字 使子类与父类产生联系,在创建子类对象时同时创建父类对象,对于父类属性与方法的调用都源自于父类对象
多态
同一个类不同形态的展示
使用多态的前提:发生继承/子类重写父类方法/向上转型(创建子类对象使用父类声明的对象接受)
使用:创建父类变量 保存子类对象
正常的变量创建需要声明与创建对象或数据类型相同的数据类型
对于多态 提出子类就是父类的不同形态,可以使用父类变量保存

abstract关键字
哀不死踹克t

属性修饰符的一种,用来修饰类与方法,被abstract修饰的类称之为抽象类,被abstract修饰的方法称之为抽象方法

抽象类特点
有抽象方法的类一定是抽象类
抽象类不一定有抽象方法。
抽象类和方法用abstract来修饰
子类必须重写父类的抽象方法
抽象方法没有方法体。
抽象类不能创建对象
抽象类可以声明对象

abstract的作用
1、 用于一些抽象类的创建
2、 用于抽象方法的创建
3、 用于提示(抽象方法被继承后必须实现否则会报错)

抽象类不能创建对象,因为抽象类中可能有抽象方法,如果想使用抽象类中完成的方法,需要通过继承的方式,重写完成未完成的方法后,创建子类对象调用相应方法

思考:
Java中的继承是单继承,我一次只能继承一个抽象类.
完成工作我一次只能完成一个,但是可以通过依次继承进行实现一次完成多个抽象类中未实现方法这一功能
Java单继承的局限性


http://www.niftyadmin.cn/n/1679834.html

相关文章

asp.NET自定义服务器控件内部细节系列教程六(复杂属性)

如大家要转载,请保留本人的版权:/* *Description:asp.NET自定义服务器控件内部细节系列教程*Auther:崇崇-天真的好蓝 *MSN:chongchong2008msn.com *Dates:2007-05-20*Copyright:ChongChong2008 YiChang HuBei China */六 复杂属性的声明持久性和类型转换器 复杂属性…

drupal drush 在windows下的安装和配置

一、windows下drupal的安装 参考官网:https://www.drupal.org/node/594744 drush下载:https://github.com/drush-ops/drush/releases/download/6.0.0/Drush-6.0-2013-08-28-Installer-v1.0.21.msi drush各版本下载地址:https://github.com/dr…

保存——CSDN-markdown编辑器——使用说明

这是为了以后方便使用这边文章还是很有参考价值的新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一…

第二节 数值、字符与字符串

数值:在电脑中以二进制的方式存储的字符:也是二进制方式在电脑上存储的,但是与数值不通,字符是以编码形式来显示的,例如:ASC|| 码 GB2312、UTF8等字符串:是有一个或多个字符组合起来的&#xff…

Day13——JavaOOP——定义接口语法、内部类的优点、匿名内部类定义格式

接口 Interface(因特费死) 接口在Java中是最重要的概念之一,它可以被理解为一种特殊的类,是由全局常量和公共的抽象方法所组成。 需要注意的是,在接口中的抽象方法必须定义为public访问权限,这是不可更改的…

rotate list java_Leet Code 61 Rotate List - 旋转列表 - Java

给定一个列表,把列表向右旋转 k 个位置,k 非负。例如:给定列表 1->2->3->4->5->NULL 和 k 2,返回 4->5->1->2->3->NULL。/*** Definition for singly-linked list.* public class ListNode {* int…

《Objective-c》Foundation框架 -(练习:计算整个文件夹的代码行数)

练习&#xff1a;计算整个文件夹的代码行数 // // main.m // 02-计算整个文件夹的代码行数 // // Created by unique on 15-1-26. // Copyright (c) 2015年 unique. All rights reserved. //#import <Foundation/Foundation.h>NSUInteger codeLines(NSString *path) …

感悟管理(一)

亲爱的FX&#xff1a;有一件事情我不得不连夜写信向你表示感谢&#xff0c;你在请我吃肯德基的同时帮我想明白了一件困扰我很多年的事情。就是作为一个老师如何给他的学生指导。我的结论现在是这样的&#xff0c;我举例说明&#xff1a;1 老师要告诉学生怎么样使电脑启动。你不…