深入理解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 > 本文的目录视图如下: ...
随机推荐
- Docker的简单介绍及使用
Docker介绍 Docker是Docker.Inc公司开源的一个基于LXC技术之上构建的Container容器引擎,源代码托管在GitHub上,基于Go语言并遵从Apache2.0协议开源. Doc ...
- List Available DBCC Commands
DBCC Commands or Database Consistency Checker commands have been with SQL Server from its early ages ...
- Android 平台架构
Android 平台主要组件如下 Linux 内核 Android 平台的基础是 Linux 内核.例如,Android Runtime (ART) 依靠 Linux 内核来执行底层功能,例如线程和低 ...
- python之路-python字符编码
编码的发展 py2的字符编码 py3的字符编码 编码的发展: 编码表:编码是信息从一种形式或格式转换为另一种形式的过程也称为计算机编程语言的代码简称编码.编码表记录着我们常见的明文所对应的计算机二进制 ...
- OO作业总结(三)
类规格设计 由于没能找到关于类规格设计的发展历史,所以结合程序设计思想的发展来谈谈规格化设计. 最早的程序设计都是采用机器语言来编写的,直接使用二进制码来表示机器能够识别和执行的指令和数 据.简单来说 ...
- Python Django 之 简单入门
一.下载Django并安装 1.下载Django 2.安装 二.新建Django project 1.使用django-admin新建mysite 项目 django-admin startproje ...
- 锤子科技 Smartisan M1L 咖啡金 真皮背面 高配版 5.7
http://www.smartisan.com/m1/#/os 快人一步的OS http://www.smartisan.com/shop/#/buyphone?c=coffee&v= ...
- S2 深入.NET和C#编程 笔试测试错题积累
---恢复内容开始--- <深入.NET平台和C#编程>内部测试题-笔试试卷错题积累 1: 1) 以下关于序列化和反序列化的描述错误的是( C). a) 序列化是将对象的状态存储到特定存储 ...
- C# 表达式树学习笔记
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- Pamulinawen--IPA--菲律宾伊洛卡诺语
这是一首菲律宾的民谣(不是他加禄语/Tagalog, 而是伊洛卡诺语/Ilokano), 我们国家的著名歌手朱明瑛也翻唱过, 歌曲中文名为<<田野之歌>>.