一.什么是多态?

多态指同一个实体同时具有多种形式。它是面向对象程序设计(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中的多态的更多相关文章

  1. 深度分析:理解Java中的多态机制,一篇直接帮你掌握!

    Java中的多态 1 多态是什么 多态(Polymorphism)按字面的意思就是"多种状态".在面向对象语言中,接口的多种不同的实现方式即为多态.用白话来说,就是多个对象调用同一 ...

  2. java中实现多态的机制是什么?

    多态性是面向对象程序设计代码重用的一个重要机制,我们曾不只一次的提到Java多态性.在Java运行时多态性:继承和接口的实现一文中,我们曾详细介绍了Java实现运行时多态性的动态方法调度:今天我们再次 ...

  3. 通过实例聊聊Java中的多态

    Java中的多态允许父类指针指向子类实例.如:Father obj=new Child();  那么不禁要发问?? 使用这个父类型的指针访问类的属性或方法时,如果父类和子类都有这个名称的属性或方法,哪 ...

  4. 13、java中的多态

    1,多态的体现 父类的引用指向了自己的子类对象. 父类的引用也可以接收自己的子类对象.2,多态的前提 必须是类与类之间有关系.要么继承,要么实现. 通常还有一个前提:存在覆盖. 3,多态的好处 多态的 ...

  5. 理解Java中的弱引用(Weak Reference)

    本篇文章尝试从What.Why.How这三个角度来探索Java中的弱引用,理解Java中弱引用的定义.基本使用场景和使用方法.由于个人水平有限,叙述中难免存在不准确或是不清晰的地方,希望大家可以指出, ...

  6. 深刻理解Java中final的作用(一):从final的作用剖析String被设计成不可变类的深层原因

    声明:本博客为原创博客,未经同意,不得转载!小伙伴们假设是在别的地方看到的话,建议还是来csdn上看吧(原文链接为http://blog.csdn.net/bettarwang/article/det ...

  7. [译]线程生命周期-理解Java中的线程状态

    线程生命周期-理解Java中的线程状态 在多线程编程环境下,理解线程生命周期和线程状态非常重要. 在上一篇教程中,我们已经学习了如何创建java线程:实现Runnable接口或者成为Thread的子类 ...

  8. 深入理解Java中的不可变对象

    深入理解Java中的不可变对象 不可变对象想必大部分朋友都不陌生,大家在平时写代码的过程中100%会使用到不可变对象,比如最常见的String对象.包装器对象等,那么到底为何Java语言要这么设计,真 ...

  9. 深入理解Java中的IO

    深入理解Java中的IO 引言:     对程序语言的设计者来说,创建一个好的输入/输出(I/O)系统是一项艰难的任务 < Thinking in Java >   本文的目录视图如下: ...

随机推荐

  1. NOSQL -- Mongodb的简单操作与使用(wins)

    NOSQL -- Mongodb的简单操作与使用(wins) 启动mongodb: 1.首先启动服务 dos命令下:net start Mongndb 也可以查询服务,手动开启服务: 完成后: 2.启 ...

  2. 随机数类Random

    我们来学习下,用来产生随机数的类Random,它也属于引用数据类型. 这个Random类,它可以产生多种数据类型的随机数,在这里我们主要介绍生成整数与小数的方式. l  方法简介 public int ...

  3. PHP配置方法

    由于php是一个zip文件(非install版),安装较为简单,解压就行.把解压的 php5.2.1-Win32重命名为 php5.并复制到C盘目录下.即安装路径为 c:\php5 1 找到php目录 ...

  4. Latex 循环插图、文件名包含空格

    \,...,} { \begin{figure} \centering \includegraphics[width=10cm]{pictures//rela\n} \caption{Attribut ...

  5. LY.JAVA面向对象编程思想概述

    面向对象 2018年7月5日  逆袭之旅DAY09 2018年7月5日  逆袭之旅DAY09 2018-07-07

  6. C++解析四-友员函数、内联函数、静态成员

    友元函数 类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员.尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数.友元可以是一个函 ...

  7. Linux运维工程师需要掌握什么才能胜任工作呢

    万丈高楼平地起,所有一切的高深的技术都离不开最基本的技术,那么作为运维工程师的你,什么是最基本的技术呢,毫无疑问是Linux,Linux 是你所有一切技术的根源,试想一下如果你连基础的操作命令都不知道 ...

  8. selenium(六)Headless Chrome/Firefox--PhantomJS停止支持后,使用无界面模式。

    简介: 以前都用PhantomJS来进行无界面模式的自动化测试,或者爬取某些动态页面. 但是最近selenium更新以后,'Selenium support for PhantomJS has bee ...

  9. 某些material英文翻译

    chrome  铬,铬合金, 镀铬 matte  无光泽的,不光滑的 Decal   陶瓷的 duo color  双色 livery  (这个没找到什么吊意思,我看像是一个类似打logo的材质)

  10. session和cokkie的区别与作用

    session在计算机中,尤其是在网络应用中,称为“会话机制”,Session对象存储特定用户会话所需的属性及配置信息,这样,当用户在应用程序的web页之间跳转时,存储在session对象中的变量将不 ...