深入理解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 > 本文的目录视图如下: ...
随机推荐
- loj 10004 智力大冲浪
智力大冲浪 题目描述: 小伟报名参加中央电视台的智力大冲浪节目.本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者m元.先不要太高兴!因为这些钱还不一定都是你的.接下来主持人宣布了 ...
- hdu多校1004 Distinct Values
Distinct Values Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s): ...
- Android AES加密报错处理:javax.crypto.IllegalBlockSizeException: error:1e00007b:Cipher functions:OPENSSL_internal:WRONG_FINAL_BLOCK_LENGTH
一.问题说明 今天写AES加/解密功能的apk,设想是四个控件(测试用的,界面丑这种东西请忽略) 一个编缉框----用于输入要加密的字符串 一个文本框----用于输出加密后的字符串,和加密后点击解密按 ...
- Linux服务列表(CentOS)
1.service用法 service SCRIPT COMMAND [OPTIONS] #执行脚本中方法,最常用法 service --status-all #查看所有服务的运行状态 service ...
- valgrind 工具介绍和简单的使用
最近老是遇上各种奇奇怪怪的core dump,不太会分析的情况下看到了这款工具.在这记录分享下. Valgrind 是个开源的工具,功能很多.例如检查内存泄漏工具---memcheck. Valgri ...
- js 复制对象的深复制与浅复制
1.潜复制(修改新对象会改变原对象) var baz = {a:'hello', b: {c:'my', d:'friend'}} var foo = baz foo.a="better&q ...
- 1-1Controller之Request
laravel5.5版本 //路由: Route::any('request1',['uses'=>'StudentController@request1']); //控制器中的方法: publ ...
- netty]--最通用TCP黏包解决方案
netty]--最通用TCP黏包解决方案:LengthFieldBasedFrameDecoder和LengthFieldPrepender 2017年02月19日 15:02:11 惜暮 阅读数:1 ...
- POST提交表单时EnType设置问题
POST提交表单时EnType设置问题 首先知道enctype这个属性管理的是表单的MIME编码.共有三个值可选: 1.application/x-www-form-urlencoded 2.mult ...
- javascript进阶笔记(2)
js是一门函数式语言,因为js的强大威力依赖于是否将其作为函数式语言进行使用.在js中,我们通常要大量使用函数式编程风格.函数式编程专注于:少而精.通常无副作用.将函数作为程序代码的基础构件块. 在函 ...