深入理解Java中的多态
一.什么是多态?
多态指同一个实体同时具有多种形式。它是面向对象程序设计(OOP)的一个重要特征。如果一个语言只支持类而不支持多态,只能说明它是基于对象的,而不是面向对象的。
二.多态是如何实现的?
在了解多态是如何实现的之前,我们先来了解一下两个概念。
前期绑定:在编译期就完成的绑定,与对象无关,与类相关,比如最常见的static方法和static的方法块。
后期绑定:也就是运行时期的绑定,而多态就是在这个阶段实现的。
在Java中所有的方法除了static方法和final方法(将private方法归于final方法他们二者在继承里都是无法被子类继承的详见我的另外一篇文章http://www.cnblogs.com/SAM-CJM/p/9359397.html)都是在后期实现绑定的。
那么也就是说static访法是无法实现多态的。
例子如下:
package com.cjm.polymorphic; /**
* 静态方法的多态测试
*
* @author 小明
*
*/
public class StaticFunText {
public static void main(String[] args) {
A a=new B();
a.f();
a.f1();
}
} class A {
public void f() {
System.out.println("A类的非静态方法,多态机制可以实现");
} public static void f1() {
System.out.println("A类的静态方法,多态机制无法实现");
}
} class B extends A {
public void f() {
System.out.println("子类的非static方法是可以被调用的!!");
} public static void f1() {
System.out.println("子类的stati方法是不可以被重写的!!");
}
}
结果:

可以发现我们的子类静态方法没有被调用。
静态方法与类相关联,而多态是面向对象的,所以从这个方向来思考,也就不难理解为什么静态方法不能实现多态了。
三.域与多态
由于任何的域都将由编译器解析,所以域不是多态的。
例子如下:
package com.cjm.polymorphic;
/**
* 域与多态的关系
* @author 小明
*
*/
public class VariableText {
public static void main(String[] args) {
C c=new D();
System.out.println(c.num);//没有实现多态的得到的是父类的域
System.out.println(c.getNum());//通过方法实现了多态
}
}
class C{
int num=0;
public int getNum() {
return num;
}
}
class D extends C{
int num=1;
public int getNum() {
return num;
}
public int getCNum() {
System.out.println(super.getNum());//显示调用出现父类的值
return super.num; }
}
结果如下:

四.构造器、清理与多态
对于继承时的构造器的调用序数:首先调用父类的构造器,直到最底层的父类,然后再是导出类,直到最实现类。
清理正好与构造相反,先要消除子类的部分再来消除父类的部分
深入理解Java中的多态的更多相关文章
- 深度分析:理解Java中的多态机制,一篇直接帮你掌握!
Java中的多态 1 多态是什么 多态(Polymorphism)按字面的意思就是"多种状态".在面向对象语言中,接口的多种不同的实现方式即为多态.用白话来说,就是多个对象调用同一 ...
- java中实现多态的机制是什么?
多态性是面向对象程序设计代码重用的一个重要机制,我们曾不只一次的提到Java多态性.在Java运行时多态性:继承和接口的实现一文中,我们曾详细介绍了Java实现运行时多态性的动态方法调度:今天我们再次 ...
- 通过实例聊聊Java中的多态
Java中的多态允许父类指针指向子类实例.如:Father obj=new Child(); 那么不禁要发问?? 使用这个父类型的指针访问类的属性或方法时,如果父类和子类都有这个名称的属性或方法,哪 ...
- 13、java中的多态
1,多态的体现 父类的引用指向了自己的子类对象. 父类的引用也可以接收自己的子类对象.2,多态的前提 必须是类与类之间有关系.要么继承,要么实现. 通常还有一个前提:存在覆盖. 3,多态的好处 多态的 ...
- 理解Java中的弱引用(Weak Reference)
本篇文章尝试从What.Why.How这三个角度来探索Java中的弱引用,理解Java中弱引用的定义.基本使用场景和使用方法.由于个人水平有限,叙述中难免存在不准确或是不清晰的地方,希望大家可以指出, ...
- 深刻理解Java中final的作用(一):从final的作用剖析String被设计成不可变类的深层原因
声明:本博客为原创博客,未经同意,不得转载!小伙伴们假设是在别的地方看到的话,建议还是来csdn上看吧(原文链接为http://blog.csdn.net/bettarwang/article/det ...
- [译]线程生命周期-理解Java中的线程状态
线程生命周期-理解Java中的线程状态 在多线程编程环境下,理解线程生命周期和线程状态非常重要. 在上一篇教程中,我们已经学习了如何创建java线程:实现Runnable接口或者成为Thread的子类 ...
- 深入理解Java中的不可变对象
深入理解Java中的不可变对象 不可变对象想必大部分朋友都不陌生,大家在平时写代码的过程中100%会使用到不可变对象,比如最常见的String对象.包装器对象等,那么到底为何Java语言要这么设计,真 ...
- 深入理解Java中的IO
深入理解Java中的IO 引言: 对程序语言的设计者来说,创建一个好的输入/输出(I/O)系统是一项艰难的任务 < Thinking in Java > 本文的目录视图如下: ...
随机推荐
- echarts-------饼形图
首先echarts是一个可以提供给用户体验效果更好的一个图形界面, Canvas 类库 ZRender. 1.下载echarts的js,可以在官方网址进行下载echarts.min.js 2.将下载下 ...
- A Bug's Life(向量偏移)
A Bug's Life Time Limit : 15000/5000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total ...
- for循环跳转语句(break、continue)
跳转语句用于实现循环执行过程中程序流程的跳转,在Java中的跳转语句有break语句和continue语句.接下来分别进行详细地讲解. 1. break语句 在switch条件语句和循环语句中都可以使 ...
- 逆袭之旅.DAY07东软实训..封装~继承~抽象~final
2018年7月3日.逆袭之旅DAY07 package day0703.exam1; /** * 狗狗类 使用权限修饰符private和public进行封装 * @author Administrat ...
- 尚学堂java答案解析 第三章
本答案为本人个人编辑,仅供参考,如果读者发现,请私信本人或在下方评论,提醒本人修改 一.选择题 1.A 2.BD 解析:switch的的判断表达式的数据类型:byte short int ch ...
- bzoj1045
题解: 随便推一下公式 然后发现是中位数 代码: #include<bits/stdc++.h> using namespace std; ],n; long long sum; int ...
- fedora网络设置
一:网络设置 1.找到要设置的网卡 命令:ip addr 列出所有的网络配置,找到你需要配置的网卡 入图,我这个是ens33 2.找到配置文件 配置文件路径: /etc/sysconfig/netwo ...
- 上传本地代码到GitHub上
由于经常忘记Git的相关代码,百度多了自然不耐烦,干脆自己写个简单的博客记录一下代码及流程了...... 1.在GitHub上新建一个仓库: 2.创建完后在仓库左上角的ssh上copy一下地址: 3. ...
- 源码学习:一个express().get方法的加载与调用
刚刚接触express,它的中间件确实把我搞得头晕.get的回调中要不要加next?不加载还会执行下一个中间件么?给get指定'/'路径是不是所有以'/'开头的访问在没有确切匹配时都能执行?use件又 ...
- Cracking The Coding Interview 2.2
#include <iostream> #include <string> using namespace std; class linklist { private: cla ...