`
Copperfield
  • 浏览: 260357 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
C407adc3-512e-3a03-a056-ce4607c3a3c0
java并发编程陷阱
浏览量:25137
社区版块
存档分类

多 态

 
阅读更多


    package com.maozj.javatnk.duotai; 
     
    import java.util.ArrayList; 
    import java.util.Map; 
     
    public class ParentObj { 
        public void doWork(ArrayList list) { 
            System.out.println("ParentObj doWork..."); 
        } 
     
        public void doSport(Map map) { 
            System.out.println("ParentObj doSport..."); 
        } 
    } 


package com.maozj.javatnk.duotai; 
 
import java.util.HashMap; 
import java.util.List; 
 
public class ChildObj extends ParentObj { 
 
    public void doWork(List list) { 
        System.out.println("ChildObj doWork..."); 
    } 
 
    public void doSport(HashMap map) { 
        System.out.println("ChildObj doSport..."); 
    } 
 
}

    package com.maozj.javatnk.duotai; 
     
    import java.util.ArrayList; 
    import java.util.HashMap; 
     
    public class Client { 
     
        /**
         * @param args
         */ 
        public static void main(String[] args) { 
            test1(); 
            System.out.println("=================================="); 
            test2(); 
        } 
         
        public static void test1(){ 
            ParentObj po = new ParentObj(); 
            ArrayList list = new ArrayList(); 
            po.doWork(list); 
             
            po = new ChildObj(); 
            po.doWork(list); 
             
            ChildObj co = new ChildObj(); 
            co.doWork(list); 
             
        } 
         
        public static void test2(){ 
            ParentObj po = new ParentObj(); 
            HashMap map  = new HashMap(); 
            po.doSport(map); 
             
            po = new ChildObj(); 
            po.doSport(map); 
             
            ChildObj co = new ChildObj(); 
            co.doSport(map); 
        }    
    } 




首先,要明确,Child对Parent发生了方法的Overload而不是override,原因是参数类型不同。

接下来,再观察执行时的参数类型,分别是ArrayList和HashMap.

最后,再看调用对象的声明类型和实例类型,由于是Overload,所以Child的实例类型中实际上有4个方法,而不是2个,这个时候掉哪个完全看参数的匹配情况。




1.关于java的多态,它讲java的多态分成静态的多态,和动态的多态,而所谓静态的多态就是只函数的重载,动态的多态就是方法的覆写。

2.静态的多态性。系统会在你编译的时候根据你调用的方法的参数列表来动态的决定调用那一个函数。

3.还有一种多态性:动态多态性。Java实现运行时多态性的基础是动态方法调度,它是一种在运行时而不是在编译期调用重载方法的机制。动态性多态的例子,比如说"一个接口,多个方法"。

1. Java的多态性总结:

(1) 首先, 要明确Child对Parent发生了方法的overload还是overwrite,根据参数类型及个数。

(2) 如果是overload,则Child继承了Parent的方法,相当于Child多加了父类的方法。

(3) 如果是overwrite, 则Child类不会有父类的该方法,而是把该方法重写了,所以该方法存在于父类中,子类只是重写了。要想调用父类的该方法,只能通过super关键字调用。
    java 的这种机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。
(4) 接下来,观察方法执行时的参数类型;

(5) 然后看调用对象的声明类型和实例类型;

(6) 方法的调度采用最精确参数匹配。


2. 多态分两种:
(1) 编译时多态:编译时动态重载;
(2) 运行时多态:指一个对象可以具有多个类型,方法的覆盖
    这样对于对象而言分为:
    理解运行时多态:
    Car c = new Bus();
    Car编译时类型 编译时检查变量类型是否存在,是否有调用的方法。
    Bus运行时类型  实际运行是访问heap中的对象,调用实际的方法。
    运行时多态是由运行时类型决定的
    编译时多态是由编译时类型决定的

分享到:
评论

相关推荐

    C++实验报告多态性.doc

    【实验报告——C++中的多态性】 在C++中,多态性是面向对象编程的一个核心特性,它允许我们使用一个基类的指针或引用来调用派生类中重写的方法,从而实现不同类对象的统一处理。本实验报告主要探讨了如何在C++中...

    实验4 多态性的应用.doc

    面向对象程序设计中的多态性应用 在面向对象程序设计中,多态性是指一个实体可以以多种形式出现的能力。这种能力可以帮助我们更好地描述和模拟现实世界中的复杂系统。在本实验中,我们将通过一个实践项目来了解多态...

    多态性实验报告-实验七

    ### 多态性实验报告-实验七 #### 实验背景 本实验是《面向对象程序设计》课程中的一个环节,旨在通过实践加深学生对多态性的理解和应用能力。多态性是面向对象编程的一个核心特性,它允许子类对象可以被当作父类...

    C++中多态性的演示

    C++中的多态性示例 在面向对象编程(Object-Oriented Programming)中,多态性是指同一个函数或操作符可以根据对象的类型或类别而具有不同的行为。C++语言通过函数重载、运算符重载和虚函数来实现多态性。本文将...

    实验四 多态性及综合应用

    1. **理解编译时的多态性和运行时的多态性**:通过本实验,学生将深入理解多态性的概念及其在C++中的两种表现形式——编译时多态性和运行时多态性。编译时多态性主要通过重载函数和运算符实现,而运行时多态性则依赖...

    多态性的理解

    ### 多态性的理解 #### 一、多态性概述 多态性是面向对象编程中的一个重要特性,它使得一个接口或方法能够适用于多种类型的数据。在Java中,多态性主要通过方法重载(overloading)、方法重写(overriding)以及...

    c++多态性与虚函数练习题

    ### C++多态性与虚函数知识点解析 #### 一、多态性的概念 多态性是面向对象编程的一个核心特性,它允许我们通过基类的接口来操作派生类的对象。这种特性使得代码更加灵活且易于扩展。在C++中,多态性主要通过虚函数...

    C++实验六 多态性和虚函数的应用 课程 实验报告

    在C++编程语言中,多态性和虚函数是面向对象编程的重要特性,它们允许程序员创建灵活且可扩展的代码结构。本次实验旨在深入理解和熟练运用这两个概念。实验报告的标题和描述表明,这是一个关于C++实验,特别是针对多...

    多态性实验

    在C++编程语言中,多态性是面向对象编程的核心概念之一,它允许不同类型的对象对同一消息作出不同的响应。本实验旨在让学生深入理解和熟练应用多态性,从而更好地进行类的设计、继承与派生。 首先,实验要求学生...

    编程中的多态性

    多态性是面向对象程序设计中的一个核心概念,它指的是同一操作作用于不同的对象,可以有不同的解释和不同的执行结果。也就是说,即使多个对象来自不同的类,如果它们对同一消息做出响应,那么它们被认为是多态的。在...

    java类和对象继承多态性

    java类和对象继承多态性 java类和对象继承多态性是java语言中的一种基本机制,它允许开发者创建一个新的类,并继承已有的类的属性和行为。这种机制可以提高代码的复用性和维护性。 继承是java语言中的一种机制,...

    实验7 多态性和运算符重载.doc

    "实验7 多态性和运算符重载" 多态性是指类族中具有相似功能的不同函数使用同一名称来实现,从而可以使用相同的调用方式来调用这些具有不同功能的同名函数。C++中的多态的实现形式包括函数重载、运算符重载、虚函数...

    PHP 5.0中多态性的实现方案

    以下是一个简单的多态性示例,展示了如何使用抽象类和接口实现多态性: ```php interface Person { public function acceptFeedback(string $comment, string $source); } abstract class BasePerson { abstract...

    动态多态性和静态多态性

    C++中的多态性实例,包括静态多态性和动态多态性(运算符的重载和虚函数)

    虚函数与多态性.ppt

    虚函数与多态性是面向对象编程中的核心概念,它们主要应用于C++语言。多态性(Polymorphism)指的是同一个标识符(如函数名)可以有不同的解释或实现,这在编程中通常表现为一个接口可以有多种不同的行为。重载函数...

    多态性实现机制

    ### C++多态性实现机制 #### 一、引言 多态性是面向对象编程的一个核心特性,它允许子类对象可以被当作其父类对象来使用,从而提高了代码的复用性和灵活性。在C++中,多态性的实现主要依赖于虚函数机制。本文将...

    关于多态性的经典例子

    在C#编程语言中,多态性(Polymorphism)是一项核心特性,它允许我们使用一个接口或基类引用不同的派生类型。多态性在面向对象编程中扮演着至关重要的角色,因为它提供了代码的灵活性、可重用性和扩展性。下面我们将...

    C++中的多态性的分析与作用

    《C++中的多态性分析及其作用》 多态性是C++编程中一个核心的概念,它赋予了程序更高的灵活性和可扩展性。在本文中,我们将深入探讨多态性的定义、类型、实现方式以及运算符重载等相关知识点。 1. 多态性的定义 多...

    C++多态性实验报告

    在C++编程语言中,多态性是面向对象编程的核心特性之一,允许不同的对象对同一消息作出不同的响应。本实验报告主要围绕C++中的多态性展开,涉及到构造函数、析构函数、虚函数以及抽象类和纯虚函数的应用。 首先,...

Global site tag (gtag.js) - Google Analytics