`
这些年
  • 浏览: 397787 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

多态---简单

 
阅读更多

1:作用

        可以消除类型之间的耦合关系。

2:动态绑定(即多态)

        在运行期才知道对象的类型(或才知道调用的是哪个对象的方法)

        在java中除了static和final(private 也是final的)之外,都是动态绑定

 3:缺点:

         1):父类与子类有同名方法,但父类方法为private的,把子类对象赋值给父类字段,调用同名方法是父类的方法(private方法不能被重载)

         2):多态不会发生在private,域,静态方法中

4:构造方法和多态

       构造方法并不具有多态性(构造方法是static)

       构造方法的初始化顺序(有了多态之后)

             1):基类的构造器初始化(返复递归直到最底层的基本构造器)

             2):成员字段的构造器(用来确保字段都可以被正确的初始化)

             3):自己的构造器 

        继承与清理的顺序

             子类的清理方法中最后一行一定要调用父类的清理方法(否则父类的清理方法将永远不被调用)

           

对于字段:销毁的顺序与声明的顺序相反
对于基类:销毁的顺序先子类后父类

 

问题 
子类构造器初始化时,先调用父类构造器,父类构造器中调用了被覆盖的方法,此时这个方法是子类中的方法

 5:协变返回值类型

      子类中被覆盖的方法,可以返回基类方法返回值的子类型 

 

一个例子:

class A {  
    public String show(D obj) {  
        return ("A and D");  
    }  
  
    public String show(A obj) {  
        return ("A and A");  
    } 
  
}  
  
class B extends A{  
    public String show(B obj){  
        return ("B and B");  
    }  
      
    public String show(A obj){  
        return ("B and A");  
    }   
}  
  
class C extends B{  
  
}  

class D extends B{  
  
}  
  
public class Test {  
    public static void main(String[] args) {  
        A a1 = new A();  
        A a2 = new B();  
        B b = new B();  
        C c = new C();  
        D d = new D();  
          
        System.out.println("1--" + a1.show(b));  //A类中没有参数为b的方法,但有参数为b的父类的方法,所以调用它
        System.out.println("2--" + a1.show(c));  //A类中没有参数为c的方法,但有参数为c的父类的方法,所以调用它
        System.out.println("3--" + a1.show(d));  //A类中有参数为d的方法,所以调用它
        //a2对象是B类,但使用A类的“接口”调用(它访问不到B类的特有方法),B类是A的子类,所以参数为a的方法被覆盖
        System.out.println("4--" + a2.show(b));   //B类中有参数为b的方法,但a类中没有,所以访问不到;它还有参数为b的父类(a)的方法,所以调用被覆盖的方法  
        System.out.println("5--" + a2.show(c));   //B类中没有参数为c的方法,但有参数为b的父类(a)的方法,所以调用被覆盖的方法  
        System.out.println("6--" + a2.show(d));   //B类中没有参数为d的方法,但父类中有,所以调用它
        
        System.out.println("7--" + b.show(b));    //B类中有参数为b的方法,所以调用它
        System.out.println("8--" + b.show(c));    //B类中没有参数为c的方法,其父类也没有,查看它有参数为c的父类的方法,所以调用它
        System.out.println("9--" + b.show(d));    //B类中没有参数为d的方法,但其父类有,所以调用它
    }  
}  

 

补充:

所以多态机制遵循的原则概括为:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法,但是它仍然要根据继承链中方法调用的优先级来确认方法,该优先级为:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。

 

抄自:http://blog.csdn.net/chenssy/article/details/12786385

 

分享到:
评论

相关推荐

    多态--简单工厂

    多态--简单工厂

    Lesson06--OOP多态.pdf

    - 在多态的上下文中,简单工厂模式可以帮助我们根据条件选择合适的子类实例。 #### 多态的应用示例 1. **回顾继承与多态的关系:** - 在继承结构中,子类可以继承父类的属性和方法,并且可以根据需要重写这些...

    Java 多态应用,掌握多态

    多态分为编译时多态和运行时多态。编译时多态主要通过方法的重载(Overloading)实现,即在同一个类中定义多个同名但参数列表不同的方法。而运行时多态则是通过方法的重写(Overriding)和接口实现实现,它依赖于...

    0509-多态巩固.zip

    “常见单词.txt”可能是一个包含常用英文单词的文本文件,或许是为了在编程练习中创建一个简单的词典应用,展示如何利用多态处理不同类型的对象,比如单词的查找、排序等。 “oop-0509”可能是某个代码文件或者笔记...

    多态简单工厂

    本文将深入探讨“多态简单工厂”这一主题,结合北大青鸟的C#.NET讲堂内容,详细解析多态的概念、简单工厂模式的原理以及如何在C#中实现它们。 首先,多态(Polymorphism)是指同一种行为或操作可以有不同的表现形式...

    关于继承和多态的简单练习

    现在,让我们回到“关于继承和多态的简单练习”这个主题。在这个练习中,你可能创建了一些类,定义了它们之间的继承关系,并实现了多态的效果。例如,你可能创建了一个`Vehicle`类,然后有`Car`和`Bike`继承自`...

    java实验报告(2)-多态和继承

    - **程序简介**:实验中创建的程序可能涉及到一个简单的类层次结构,展示继承和多态的概念。例如,一个`Animal`父类和`Dog`、`Cat`两个子类,每个类都有自己的`sound()`方法,通过多态实现不同的叫声。 4. **源...

    Java零基础-多态.md

    简单来说,多态意味着一个接口可以被不同的实现所使用,这极大地提高了代码的复用性和灵活性。 ##### 定义 多态是指程序中定义的对象、变量或函数可以具有多种形态。在Java中,多态主要体现在以下三个方面: 1. **...

    数据加密与多态加密综述

    ### 数据加密与多态加密技术综述 #### 一、数据加密的重要性及背景 随着信息技术的飞速发展,网络已经成为现代社会的重要组成部分。大量的敏感信息和重要数据在网络上流动,因此确保这些数据的安全至关重要。数据...

    对于多态的理解

    ### 对于Java中多态的理解 #### 多态的基本概念 多态是面向对象编程语言中的一个重要特性,它使得程序可以在运行时确定具体的操作对象及其行为。简而言之,多态意味着一个接口可以有多种不同的实现,或者一个实体...

    C++继承与多态例子

    在C++编程语言中,继承和多态是面向对象编程(OOP)的两个核心概念。继承允许我们创建一个新类(子类),它继承了另一个类(父类)的属性和方法,从而实现了代码的重用和扩展。多态则是指同一种行为在不同对象上表现...

    java 接口 类 继承 多态的简单实例

    多态分为编译时多态(方法的重载,Overload)和运行时多态(方法的重写,Override)。 - **重载(Overload)**:是指在同一个类中可以有多个同名方法,但参数列表必须不同(参数个数、类型或顺序),这使得我们可以...

    多态的应用

    例如,我们有这样一个简单的例子: ```cpp class Base { public: virtual void print() { cout ; } // 声明虚函数 }; class Derived : public Base { public: void print() override { cout ; } // 子类覆盖虚...

    java多态机制

    为了更好地理解Java多态的应用,下面通过一个简单的示例来说明。 **示例**:假设有一个`Animal`类作为基类,它有一个`makeSound()`方法。我们可以创建两个子类`Dog`和`Cat`,分别重写`makeSound()`方法。 ```java ...

    用多态做简单银行系统

    在这个“用多态做简单银行系统”的项目中,我们将深入理解如何运用多态性这一核心OOP概念来构建一个银行系统。多态性是面向对象编程中的一个重要特性,它允许我们使用一个通用接口来处理不同类型的对象,从而提高...

    C#封装继承多态

    这是关于C#封装继承多态的一个简单的例子,对于深入学习C#中封装继承多态将很有帮助!

    java继承、多态的简单程序.zip

    这个压缩包"java继承、多态的简单程序.zip"显然包含了一些示例代码,旨在帮助初学者理解这两个概念。接下来,我们将深入探讨Java中的继承和多态性。 ### 继承(Inheritance) 在Java中,继承允许一个类(子类)...

    继承和多态.doc

    以下是一个简单的Java示例,展示了如何通过接口实现多态: ```java // 定义一个接口 public interface Parent { public void simpleCall(); } // 实现接口的子类之一 public class Child_A implements Parent { ...

    C语言:多态(单继承实现)

    下面是一个简单的C语言实现多态性的步骤: 1. **定义基类结构体**:创建一个结构体,它包含所有子类共享的数据成员以及一个函数指针数组。这个数组将存储指向子类方法的指针。 ```c typedef void (*FuncPointer)...

    实现多态:虚方法

    为了更直观地理解虚方法的工作原理,我们来看一个简单的示例: ```csharp public abstract class Weapon { public virtual void Fire() { Console.WriteLine("Weapon is firing..."); } } public class Pistol...

Global site tag (gtag.js) - Google Analytics