【Java_基础】java中的多态性
方法的重载、重写和动态链接构成了java的多态性。
1.方法的重载
同一个类中多个同名但形参有所差异的方法,在调用时会根据参数的不同做出选择。
2.方法的重写
子类中重新定义了父类的方法,有关方法重写的规则请参考文章:Java中方法重写的注意事项。
3.动态链接
动态链接出现在父类引用指向子类对象的场景。
因为子类中有一个隐藏的引用super指向父类实例,当出现父类引用指向子类对象时,子类对象就会将其隐藏的父类实例返回给该父类引用。因此,父类引用还是指向了父类实例,而不是像表面看到的那样指向了子类对象。
下面通过代码来看父类、子类的内存分配情况:
假设现在有一个父类Father,它里面的变量需要占用1M内存。有一个它的子类Son,它里面的变量需占用0.5M内存。当创建子类对象时会率先创建父类对象,并将其隐藏的引用super指向父类对象。
Father f = new Father();//系统将分配1M内存。
Son s = new Son();//系统将分配1.5M内存。
Father f1 =s;//父类引用指向子类对象,这时f1会指向子类对象中的1M内存

由于f1仅指向了子类对象中的父类实例,所以f1只能调用父类的方法,而不能调用子类的方法。但是,若子类重写了父类的方法,那么该父类引用将会调用子类的方法,而不在是父类的方法,这就是java中的动态链接。
3.1.动态链接带来的价值
JAVA里没有多继承,一个类只能有一个父类。而继承的表现就是多态,一个父类可以有多个子类,而在子类里可以重写父类的方法,每个子类里重写的代码不一样,自然表现形式也就不一样。当同一父类引用指向不同的子类实例,调用同一方法却具有不同的表现形式,这就是多态。相同的消息(也就是调用相同的方法)会有不同的结果。
举例说明:
//父类
public class Father{
//父类有一个打孩子方法
public void hitChild(){
}
}
//子类1
public class Son1 extends Father{
//重写父类打孩子方法
public void hitChild(){
System.out.println("为什么打我?我做错什么了!");
}
}
//子类2
public class Son2 extends Father{
//重写父类打孩子方法
public void hitChild(){
System.out.println("我知道错了,别打了!");
}
}
//子类3
public class Son3 extends Father{
//重写父类打孩子方法
public void hitChild(){
System.out.println("我跑,你打不着!");
}
}
//测试类
public class Test{
public static void main(String args[]){
Father father;
father = new Son1();
father.hitChild();
father = new Son2();
father.hitChild();
father = new Son3();
father.hitChild();
}
}
3.2.动态链接的总结
1、使用父类引用指向子类对象是动态链接的应用场景
2、该引用只能调用父类中定义的方法和变量 ,如果子类中重写了父类中的方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)。
3、变量不能被重写(覆盖),"重写"的概念只针对方法,如果在子类中重写父类中的变量,那么在编译时会报错。
4、父类引用指向子类实例时,方法调用采用“编译看左边,运行看右边”规则来判断。
本博文参考了:java多态性,父类引用指向子类对象
【Java_基础】java中的多态性的更多相关文章
- java基础---->java中正则表达式二
跟正则表达式相关的类有:Pattern.Matcher和String.今天我们就开始Java中正则表达式的学习. Pattern和Matcher的理解 一.正则表达式的使用方法 一般推荐使用的方式如下 ...
- 计算机基础--Java中int char byte的关系
计算机基础--Java中int char byte的关系 重要:一个汉字占用2byte,Java中用char(0-65535 Unicode16)型字符来存字(直接打印输出的话是字而非数字),当然要用 ...
- Java基础-Java中的堆内存和离堆内存机制
Java基础-Java中的堆内存和离堆内存机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- Java基础-Java中的内存分配与回收机制
Java基础-Java中的内存分配与回收机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一. 二.
- Java基础-Java中的并法库之重入读写锁(ReentrantReadWriteLock)
Java基础-Java中的并法库之重入读写锁(ReentrantReadWriteLock) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在学习Java的之前,你可能已经听说过读 ...
- Java基础-Java中的并法库之线程池技术
Java基础-Java中的并法库之线程池技术 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是线程池技术 二.
- Java基础-Java中23种设计模式之常用的设计模式
Java基础-Java中23种设计模式之常用的设计模式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.设计模式分类 设计模式是针对特定场景给出的专家级的解决方案.总的来说设 ...
- Java基础-JAVA中常见的数据结构介绍
Java基础-JAVA中常见的数据结构介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是数据结构 答:数据结构是指数据存储的组织方式.大致上分为线性表.栈(Stack) ...
- [Java基础] Java中List.remove报错UnsupportedOperationException
Java中List.remove(removeRange,clear类似) 报出 UnsupportedOperationException 的错误.原来该List是一个AbstractList,不支 ...
随机推荐
- Linux安装Loadrunner generator
安装环境:redhat 6.5 64位版 从网上下载 loadrunner-11-load-generator.iso 文件 先创建一个iso 目录,用来挂载 iso 文件 mkdir iso 挂载i ...
- export default 和 export 的使用方式(六)
一:ES6 的导入模块方式和暴露对象方式: ES6 中导入模块使用:import 模块名称 from '模块标识符':import '表示路径': 在 ES6 中使用 export default 和 ...
- C - Catch That Cow POJ - 3278
//标准bfs #include <iostream> #include <cstdio> #include <algorithm> #include <cm ...
- PAT甲级——1130 Infix Expression (25 分)
1130 Infix Expression (25 分)(找规律.中序遍历) 我是先在CSDN上面发表的这篇文章https://blog.csdn.net/weixin_44385565/articl ...
- Codeforces Round #546 (Div. 2) B. Nastya Is Playing Computer Games
链接:https://codeforces.com/contest/1136/problem/B 题意: 有n个井盖,每个井盖上有一个小石头. 给出n和k,k表示刚开始在第k个井盖上方. 有三种操作, ...
- Technocup 2017 - Elimination Round 1 (Unofficially Open for Everyone, Rated for Div. 2) D
The organizers of a programming contest have decided to present t-shirts to participants. There are ...
- python __new__ __init__ 区别
参数 __new__的第一个占位参数是class对象 __init__的第一个占位参数是class的实例对象 其他的参数应一致 作用 __new__ 用来创建实例,在返回的实例上执行__init__, ...
- linux资源性能指标
1.cpu Running:正在运行的进程 Waiting:已准备就绪,等待运行的进程 Blocked:因为等待某些事件完成而阻塞的进程,通常在等待I/O 命令获取数据: vmstat 1其中: u ...
- 096 Unique Binary Search Trees 不同的二叉查找树
给出 n,问由 1...n 为节点组成的不同的二叉查找树有多少种?例如,给出 n = 3,则有 5 种不同形态的二叉查找树: 1 3 3 2 1 ...
- WPF中获取指定坐标依赖对象数据项
上图中红色框区域是一个自定义的ListBox控件,需要实现的功能是,点击红框区域中某项时,获取当前选中项的数据项 控件的MouseDown事件部分代码为: var x = TreeHelper.Fin ...