实例化一个子类对象赋给父类对象引用或一个实现了接口的类的对象赋给接口的引用的好处
2014-04-17 18:08
579 查看
这是多态的一种应用:
把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。
赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。也就是说,父亲的行为像儿子,而不是儿子的行为像父亲。
举个例子:从一个基类中派生,响应一个虚命令,产生不同的结果。比如从某个基类继承出多个对象,其基类有一个虚方法Tdoit,然后其子类也有这个方法,但行为不同,然后这些子对象中的任何一个可以赋给其基类的对象,这样其基类的对象就可以执行不同的操作了。实际上你是在通过其基类来访问其子对象的,你要做的就是一个赋值操作。使用继承性的结果就是可以创建一个类的家族,在认识这个类的家族时,就是把导出类的对象当作基类的对象,这种认识又叫作upcasting。
这样认识的重要性在于:我们可以只针对基类写出一段程序,但它可以适应于这个类的家族,因为编译器会自动就找出合适的对象来执行操作。这种现象又称为多态性。而实现多态性的手段又叫称动态绑定(dynamicbinding)。简单的说,建立一个父类的对象,它的内容可以是这个父类的,也可以是它的子类的,当子类拥有和父类同样的函数,当使用这个对象调用这个函数的时候,定义这个对象的类(也就是父类)里的同名函数将被调用,当在父类里的这个函数前加virtual关键字,那么子类的同名函数将被调用。
例子
在java中:多态,是面向对象的程序设计语言最核心的特征。多态,意味着一个对象有着多重特征,可以在特定的情况下,表现不同的状态,从而对应着不同的属性和方法。
从程序设计的角度而言,多态可以这样来实现(以java语言为例):
Public interface Parent
{
publicvoidsimpleCall();
}
public class Child_A implements Parent
{
public void simpleCall(){//具体的实现细节;}
}
public class Child_B implements Parent
{
public void simpleCall(){//具体的实现细节;}
}//当然还可以有其他的实现然后,我们就可以看到多态所展示的特性了:Parentpa=newChild_A();pa.simpleCall()则显然是调用Child_A的方法;Parentpa=newChild_B();pa.simpleCall()则是在调用Child_B的方法。所以,我们对于抽象的父类或者接口给出了我们的具体实现后,pa可以完全不用管实现的细节,只访问我们定义的方法,就可以了。事实上,这就是多态所起的作用,可以实现控制反转这在大量的J2EE轻量级框架中被用到,比如Spring的依赖注射机制。
把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。
赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。也就是说,父亲的行为像儿子,而不是儿子的行为像父亲。
举个例子:从一个基类中派生,响应一个虚命令,产生不同的结果。比如从某个基类继承出多个对象,其基类有一个虚方法Tdoit,然后其子类也有这个方法,但行为不同,然后这些子对象中的任何一个可以赋给其基类的对象,这样其基类的对象就可以执行不同的操作了。实际上你是在通过其基类来访问其子对象的,你要做的就是一个赋值操作。使用继承性的结果就是可以创建一个类的家族,在认识这个类的家族时,就是把导出类的对象当作基类的对象,这种认识又叫作upcasting。
这样认识的重要性在于:我们可以只针对基类写出一段程序,但它可以适应于这个类的家族,因为编译器会自动就找出合适的对象来执行操作。这种现象又称为多态性。而实现多态性的手段又叫称动态绑定(dynamicbinding)。简单的说,建立一个父类的对象,它的内容可以是这个父类的,也可以是它的子类的,当子类拥有和父类同样的函数,当使用这个对象调用这个函数的时候,定义这个对象的类(也就是父类)里的同名函数将被调用,当在父类里的这个函数前加virtual关键字,那么子类的同名函数将被调用。
例子
在java中:多态,是面向对象的程序设计语言最核心的特征。多态,意味着一个对象有着多重特征,可以在特定的情况下,表现不同的状态,从而对应着不同的属性和方法。
从程序设计的角度而言,多态可以这样来实现(以java语言为例):
Public interface Parent
{
publicvoidsimpleCall();
}
public class Child_A implements Parent
{
public void simpleCall(){//具体的实现细节;}
}
public class Child_B implements Parent
{
public void simpleCall(){//具体的实现细节;}
}//当然还可以有其他的实现然后,我们就可以看到多态所展示的特性了:Parentpa=newChild_A();pa.simpleCall()则显然是调用Child_A的方法;Parentpa=newChild_B();pa.simpleCall()则是在调用Child_B的方法。所以,我们对于抽象的父类或者接口给出了我们的具体实现后,pa可以完全不用管实现的细节,只访问我们定义的方法,就可以了。事实上,这就是多态所起的作用,可以实现控制反转这在大量的J2EE轻量级框架中被用到,比如Spring的依赖注射机制。
相关文章推荐
- (JAVA子类引用指象父类引用)JAVA克隆对象,包括父类属性,无需实现序列化接口
- 父类的引用指向子类的对象或者接口指向实现类均是可以的
- 父类对象引用子类实例-父母代表孩子做事
- 父类引用指向子类对象,面向接口编程,面向抽象编程
- 如果一个父类有多个子类或者一个接口有多个实现的时候,Spring是如何判断该调用哪个的呢?源码分析如下
- 关于java基础中,接口里面父类的对象指向子类的引用
- 关于java基础中,接口里面父类的对象指向子类的引用
- 2018/01/07JAVA 基础 / 接口与继承:重写【子类继承并覆盖父类的对象方法】、隐藏【子类继承并覆盖父类的类方法】与实现类实现接口方法の区别
- 子类继承父类的同时又去实现一个成员变量、方法与父类相同的接口,最后调的是谁的成员变量和方法?
- 子类实例初始化父类(接口)对象
- 在java中怎么理解“用instanceof操作符判断父类对象是否为子类的一个实例”?
- C++接口定义,实现,继承接口类的子类,实例对象访问方法问题
- 子类和父类实现同一个接口的意义
- C#里的父类对象引用子类实例的理解
- 简单工厂(Factory)-提供一个创建对象实例的功能,而无须关心其具体实现。被创建实例的类型可以是接口、抽象类,也可以是具体的类。
- 父类对象引用子类实例-父母代表孩子做事
- c# 父类的引用指向子类的实例
- 将Object转换成动态指定的对象,将一个实例引用指向一个Object引用
- java继承实质、父类引用指向子类对象(多态)、声明时类型、运行时类型
- 从对象的内存角度来理解“父类的引用指向子类的对象”