JAVA_SE基础——48.多态
面向对象程序设计的三个特点是封装、继承和多态。前面已经学习了前两个特点。本章节将介绍多态性。
多态:一个对象具备多种形态。(父类的引用类型变量指向了子类的对象)或者是接口 的引用类型变量指向了接口实现类的对象)
多态的前提:必须存在继承或者实现 关系。
动物 a = new 狗();
在多态中成员函数的特点:(针对非静态成员函数)
在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有,编译失败
在运行时期,参阅对象所属的类中是否有调用的方法
简单总结就是:成员函数在多态中调用,编译看左边,运行看右边
在多态中,成员变量的特点:
无论编译还是运行,都参考左边(引用型变量所属的类)
在多态中,静态成员函数的特点:
无论编译还是运行,都参考左边
多态的好处: 提高了代码的拓展性。把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。
多态的应用:一个对象具备了多种形态。 子类实现了父类后的对象,既是父类对象又是子类对象。
具体应用:转型理解
向上转型与向下转型的理解
向上转型:父类 F =new 子类()
向下转型:子类 Z=new (子类)F
理解:
1.子类实现了父类后的对象,既是父类对象又是子类对象。所以可以向下转换。这也就是多态的体现点,多种形态。就是会说这个既是父类对象又是子类对象的对象。
2.向下转换后,就完全变成子类,可以调用子类的所有方法。
package day09; class Fu{
int num = 1; //父类中的成员变量 void method1(){
System.out.println("fu类中的method1()方法");
} void method2(){
System.out.println("fu类中的method2()方法");
} static void method4(){
System.out.println("fu类中的method4()方法");
}
} class Zi extends Fu{ int num = 2; void method1(){
System.out.println("Zi类中的method1()方法");
} void method3(){
System.out.println("Zi类中的method3()方法");
} static void method4(){
System.out.println("Zi类中的method4()方法");
}
} class Demo9
{
public static void main(String []args)
{ Fu f = new Zi();
f.method1();
f.method2();
f.method4();
System.out.println(f.num);//1
Zi z = new Zi();
System.out.println(z.num);//2
z.method1();
z.method2();
z.method3();
z.method4();
}
}
运行结果:
我自己对多态的理解(不喜勿喷):子类有的,就用子类的,子类没有的,就用父类的,子父类都没有的,报错。
根据上面代码修改:在f.method4(); 后面加句f.method3();
package day09; class Fu{
int num = 1; //父类中的成员变量 void method1(){
System.out.println("fu类中的method1()方法");
} void method2(){
System.out.println("fu类中的method2()方法");
} static void method4(){
System.out.println("fu类中的method4()方法");
}
} class Zi extends Fu{ int num = 2; void method1(){
System.out.println("Zi类中的method1()方法");
} void method3(){
System.out.println("Zi类中的method3()方法");
} static void method4(){
System.out.println("Zi类中的method4()方法");
}
}
class Demo9
{
public static void main(String []args)
{ Fu f = new Zi();
f.method1(); //Zi类中的method1()方法
f.method2(); //fu类中的method2()方法
f.method4(); //fu类中的method4()方法
f.method3(); //这句是加上去的
System.out.println(f.num);//1
Zi z = new Zi();
System.out.println(z.num);//2
z.method1();
z.method2();
z.method3();
z.method4();
}
}
运行结果:
引用:
在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有,编译失败
在运行时期,参阅对象所属的类中是否有调用的方法
简单总结就是:成员函数在多态中调用,编译看左边,运行看右边
----------------------------------------------------------------------------------------------
代码解释:f.method3(); .f 是所属Fu类的 ,,父类没有这方法 所以编译失败。
如何理解这句话 :成员函数在多态中调用,编译看左边,运行看右边
意思就是:在编译的时候编译器不管你右边是什么类,只要左边的Fu类(或接口)能编译通过就不会报错。但是运行的时候就要按照右边的Zi()类实际情况来运行。
当父类变量引用子类对象时(Fu fu = new Zi();),在这个引用变量 fu 指向的变量/方法中,他对成员变量和静态方法的调用与父类是一致的,他调用非静态方法时,在编译时是与父类一致的(查看父类有没有该函数,没有就会发生编译错误,提示fu 中找不到要调用函数),运行时如果子类中发生了复写就与子类一致。(如果右边没有再看左边。若都没有才会报错)
那为何f.method3(); 不能调用method3()方法呢 ?
如果想要调用Zi类的特有方法,如何操作?
强制将父类的引用,转成子类类型。向下转型(怎么转看下面的code1 。)
Zi x = (Zi)fu;
x.method3();
在多态中,调用子类函数,子类方法必须覆盖父类中的方法,如果调用子类特有的方法,就必须向下转型了。这样非静态的方法可直接调用。
code1:
package day09; class Fu{
int num = 1; //父类中的成员变量 void method1(){
System.out.println("fu类中的method1()方法");
} void method2(){
System.out.println("fu类中的method2()方法");
} static void method4(){
System.out.println("fu类中的method4()方法");
}
} class Zi extends Fu{ int num = 2; void method1(){
System.out.println("Zi类中的method1()方法");
} void method3(){
System.out.println("Zi类中的method3()方法");
} static void method4(){
System.out.println("Zi类中的method4()方法");
}
}
class Demo9
{
public static void main(String []args)
{ Fu f = new Zi();
f.method1(); //Zi类中的method1()方法
f.method2(); //fu类中的method2()方法
f.method4(); //fu类中的method4()方法
FuShout(f);
System.out.println(f.num);//1
Zi z = new Zi();
System.out.println(z.num);//2
z.method1();
z.method2();
z.method3();
z.method4();
}
//定义一个向下转型的方法 。
public static void FuShout(Fu fu){
if(fu instanceof Fu){ //判断fu是否是Fu类的实例对象
Zi x = (Zi) //将fu强转为Cat类型
x.method3(); //调用Zi类特有的method3()方法
}
}
}
运行结果:
instanceof:
Java提供了一个关键字instanceof,它可以判断一个对象是否为某个类(或接口)的实例或者子类的实例。
格式:
对象(或者对象引用变量) instanceof 类(或接口)
JAVA_SE基础——48.多态的更多相关文章
- JAVA_SE基础——49.多态的应用
因为多态对以后开发的重要性,因此我在这里专门开个多态的应用来加深讲解,希望想弄懂多态的同学能耐心看完. 了解了对象多态性后,那么这多态到底有哪些用处了? 下面要求设计一个方法,要求此方法可以接受A类的 ...
- JAVA_SE基础——26.[深入解析]局部变量与成员变量的区别
黑马程序员入学blog ... 如果这章节很难懂的话应该返回去先看 JAVA_SE基础--10.变量的作用域 定义的位置上区别: 1. 成员变量是定义在方法之外,类之内的. 2. 局部变量是定义在方 ...
- JAVA_SE基础——9.基本数据类型间的转换
前面我已经教会大家基本的数据类型进行了介绍, 然后这篇文章,我来介绍下,基本数据类型的转换. Java中有两种类型转换形式,分别是自动类型转换和强制类型转换. Step1.自动类型转换. 自动类型 ...
- JAVA_SE基础——8.基本数据类型
基本数据类型有:整数类型.浮点类型.字符类型.布尔类型 整数类型 整数类型用来存储整数数值,即没有小数部分的数值.与C.C++语言相同,整数在Java语言中有3种表示形式:十进制.八进制和十六进制. ...
- JAVA_SE基础——7.常量&变量
上一篇,我讲了标识符&关键字 这篇我来解释下变量&常量~~~ 变量与常量这两个概念相信大家都不会感到陌生,在数学中就已经涉及了变量与常量.理解变量与常量,可以举这样一个例子: 例 ...
- JAVA_SE基础——6.标识符&关键字
学会写helloworld之后, 我们就开始来认识标识符&关键字 一.标识符 标识符是指可被用来为类.变量或方法等命名的字符序列,换言之,标识符就是用户自定义的名称来标识类.变量或方法等.更 ...
- JAVA_SE基础——5.第一个Java程序HelloWorld&注释的应用
配置完JDK&环境变量后,我们就可以开始写程序了,那么程序怎么写呢,用什么工具呢,我建议 为了方便学习,我们最好在一个磁盘下建立一个专门的文件来写java程序,比如就在D盘下建立一个名为&qu ...
- JAVA_SE基础——4.path的临时配置&Classpath的配置
这次,我来写下关于path的临时配置的心的 我来说个有可能的实例:如果你去到别人的电脑 又想写代码 又不想改乱别人的path配置的话 再说别人愿意你在别人的电脑上瞎配吗? 那该怎么办呢? 那没问题 ...
- JAVA_SE基础——2.环境变量的配置&测试JDK
哈喽,利用晚上的空余时间再写篇心的~~~ 谢谢大家 前一篇文章 JAVA_SE基础--JDK&JRE下载及安装http://blog.csdn.net/thescript_j/article ...
随机推荐
- 初探WebSocket
初探WebSocket node websocket socket.io 我们平常开发的大部分web页面都是主动'拉'的形式,如果需要更新页面内容,则需要"刷新"一个,但Slack ...
- 分布式架构设计(一) --- 面向服务的体系架构 SOA
1.1 基于TCP协议的RPC 1.1.1 RPC名词解释 RPC的全称是Remote Process Call,即远程过程调用,RPC的实现包括客户端和服务端,即服务调用方和服务提供方.服务调用方发 ...
- 部署用于生产的Exceptionlees(一个强大易用的日志收集服务)
Exceptionless是一个非常优秀的事件记录服务,目前我们的自部署的Exceptionless已经稳定运行了近一年的时间,收集了千万条事件信息.但Exceptionless官方自宿主部署的文档不 ...
- Java集合基本概念及元素添加
Java容器类类库的用途是"保存对象", 并将其划分为两个不同的概念: (1)Collection: 一个独立元素的序列, 这些元素都服从一条或多条规则. List必须按照插入的顺 ...
- Spring源码学习:第0步--环境准备
Spring源码现在已托管于GitHub,相比于以前直接从官网下载一个压缩包的方式来说,确实方便了不少. GitHub地址:https://github.com/spring-projects/spr ...
- 黄金K线理论简述
黄金K线理论简述 [Ⅰ]. 隐藏在K线背后的多空搏杀 黄金K线的多空搏杀理论,说到底,其核心就是研判K线时,必须从多空搏杀的角度去认知,否则仅仅从表面到表面,是无法掌握K线精髓的.具体来说,多方和空方 ...
- 二叉搜索树(Java实现)
二叉搜索树基本操作 求树中的结点个数 判断节点是否为空 向树中插入新结点key-value 树中是否存在key 返回树中key对应的value值 先序遍历 中序遍历 后续遍历 层序遍历 求树中key最 ...
- Oracle/Hive/Impala SQL比较1
5 Function 指数据库内置的function,不讨论UDF.另外,操作符都不比较了,区别不大. 5.1 数学函数 功能 Oracle Hive Impala ABS 绝对值,有 ...
- 记录一则ASM实例阻塞,rbal进程异常的案例
1.故障现象描述 2.确认故障现象 3.排查ASM层面 4.解决问题 1.故障现象描述 环境:AIX 7.1 + Standalone Oracle 11.2.0.4 现象:客户反映某11g版本的AD ...
- 记一次sqoop同步到mysql
工作中需要用到将hive的数据导一份到mysql中,需求是这样的:hive每天会产生一份用户标签(tag)发生变化的结果表user_tag,这份结果同步到mysql中,并且保持一份全量表,存储当前用户 ...