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
相关推荐
多态--简单工厂
- 在多态的上下文中,简单工厂模式可以帮助我们根据条件选择合适的子类实例。 #### 多态的应用示例 1. **回顾继承与多态的关系:** - 在继承结构中,子类可以继承父类的属性和方法,并且可以根据需要重写这些...
多态分为编译时多态和运行时多态。编译时多态主要通过方法的重载(Overloading)实现,即在同一个类中定义多个同名但参数列表不同的方法。而运行时多态则是通过方法的重写(Overriding)和接口实现实现,它依赖于...
“常见单词.txt”可能是一个包含常用英文单词的文本文件,或许是为了在编程练习中创建一个简单的词典应用,展示如何利用多态处理不同类型的对象,比如单词的查找、排序等。 “oop-0509”可能是某个代码文件或者笔记...
本文将深入探讨“多态简单工厂”这一主题,结合北大青鸟的C#.NET讲堂内容,详细解析多态的概念、简单工厂模式的原理以及如何在C#中实现它们。 首先,多态(Polymorphism)是指同一种行为或操作可以有不同的表现形式...
现在,让我们回到“关于继承和多态的简单练习”这个主题。在这个练习中,你可能创建了一些类,定义了它们之间的继承关系,并实现了多态的效果。例如,你可能创建了一个`Vehicle`类,然后有`Car`和`Bike`继承自`...
- **程序简介**:实验中创建的程序可能涉及到一个简单的类层次结构,展示继承和多态的概念。例如,一个`Animal`父类和`Dog`、`Cat`两个子类,每个类都有自己的`sound()`方法,通过多态实现不同的叫声。 4. **源...
简单来说,多态意味着一个接口可以被不同的实现所使用,这极大地提高了代码的复用性和灵活性。 ##### 定义 多态是指程序中定义的对象、变量或函数可以具有多种形态。在Java中,多态主要体现在以下三个方面: 1. **...
### 数据加密与多态加密技术综述 #### 一、数据加密的重要性及背景 随着信息技术的飞速发展,网络已经成为现代社会的重要组成部分。大量的敏感信息和重要数据在网络上流动,因此确保这些数据的安全至关重要。数据...
### 对于Java中多态的理解 #### 多态的基本概念 多态是面向对象编程语言中的一个重要特性,它使得程序可以在运行时确定具体的操作对象及其行为。简而言之,多态意味着一个接口可以有多种不同的实现,或者一个实体...
在C++编程语言中,继承和多态是面向对象编程(OOP)的两个核心概念。继承允许我们创建一个新类(子类),它继承了另一个类(父类)的属性和方法,从而实现了代码的重用和扩展。多态则是指同一种行为在不同对象上表现...
多态分为编译时多态(方法的重载,Overload)和运行时多态(方法的重写,Override)。 - **重载(Overload)**:是指在同一个类中可以有多个同名方法,但参数列表必须不同(参数个数、类型或顺序),这使得我们可以...
例如,我们有这样一个简单的例子: ```cpp class Base { public: virtual void print() { cout ; } // 声明虚函数 }; class Derived : public Base { public: void print() override { cout ; } // 子类覆盖虚...
为了更好地理解Java多态的应用,下面通过一个简单的示例来说明。 **示例**:假设有一个`Animal`类作为基类,它有一个`makeSound()`方法。我们可以创建两个子类`Dog`和`Cat`,分别重写`makeSound()`方法。 ```java ...
在这个“用多态做简单银行系统”的项目中,我们将深入理解如何运用多态性这一核心OOP概念来构建一个银行系统。多态性是面向对象编程中的一个重要特性,它允许我们使用一个通用接口来处理不同类型的对象,从而提高...
这是关于C#封装继承多态的一个简单的例子,对于深入学习C#中封装继承多态将很有帮助!
这个压缩包"java继承、多态的简单程序.zip"显然包含了一些示例代码,旨在帮助初学者理解这两个概念。接下来,我们将深入探讨Java中的继承和多态性。 ### 继承(Inheritance) 在Java中,继承允许一个类(子类)...
以下是一个简单的Java示例,展示了如何通过接口实现多态: ```java // 定义一个接口 public interface Parent { public void simpleCall(); } // 实现接口的子类之一 public class Child_A implements Parent { ...
下面是一个简单的C语言实现多态性的步骤: 1. **定义基类结构体**:创建一个结构体,它包含所有子类共享的数据成员以及一个函数指针数组。这个数组将存储指向子类方法的指针。 ```c typedef void (*FuncPointer)...
为了更直观地理解虚方法的工作原理,我们来看一个简单的示例: ```csharp public abstract class Weapon { public virtual void Fire() { Console.WriteLine("Weapon is firing..."); } } public class Pistol...