Java父类对象调用子类实体:方法重写与动态调用

众所周知Java的handle和C++的ponter而不是object对应,我们很熟悉C++的父类pointer调用子类实体的例子,那么对于Java的handle是不是也可以这样呢?

这里我先给一个例子

class Father{
    public void announce(){
        System.out.println("Father");
    }
}
class Child extends Father{
    @Override
    public void announce(){
        System.out.println("Child");
    }
}
public class Hello {
    public static void main(String[] args){
        System.out.println("Hello");
        Father father=new Child();
        father.announce();
    }
}

这段代码中,我们把一个子类的对象赋值给了父类的句柄,之后调用已经被子类重载的方法,我们会得到的结果如下:

Hello
Child

我们可以看到,使用这个父类handle,我们调用的实际上是子类的announce方法。知道了这个特性简直可以搞事。

这里我们就要介绍一个概念:动态调用

动态链接是指,当一个方法仅在父类中实现而没有在子类中实现是,我们调用父类中方法。而当一个方法在父类和子类中都进行了实现时,无论handle的类型,我们都会调用子类的方法。但这个方法必须是在父类中定义过的,否则则无法通过父类handle去调用。

另外需要注意的是Java中能够自动向上转型,即可以把子类对象赋值给父类handle<但是不能自动向下转型,向下转型的方法需要人工去定义。

时间: 2024-12-20 05:30:19

Java父类对象调用子类实体:方法重写与动态调用的相关文章

c#父类对象引用指向子类与方法重写

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace csharp_test { class Parentclass { public Parentclass() { Console.WriteLine("this is parentclass's cunstructor"); } public void print() { Console.Writ

java 父类对象 和 子类对象 的类型转换

/** * 父类对象 和 子类对象 的类型转换 */ public class TypeCast{ public static void main(String[] args){ Employee[] staff = new Employee[3]; staff[0] = new Employee(); System.out.println(staff[0]); System.out.println(staff[1]); //Manager boss0 = staff[0]; //java.la

父类对象对子类对象方法的调用

1 import copy 2 class Dog: 3 def Eat(self): 4 print("Dog Eating...") 5 class Son: 6 def __init__(self): 7 self.height=100 8 def Eat(self): 9 print("Son Eating...") 10 class Father: 11 def LetSonEat(self,m): 12 if(isinstance(m,Son)): 13

C#父类对象和子类对象之间的转化

1. 子类到父类 Chinese c = new Chinese(); Person p1 = c;  //从变量c看是一个中国人,所以可以把人的标签贴上去 2. 父类到子类 Chinese c2 = p1; //从变量p1看是一个人,不能随便把中国人的标签贴上去  不成功,必须显式转化如下,两种方式: (1)Chinese c2 = (Chinese)p1; (2)Chinese c2 =  p1 as Chinese; 上面两种方式的区别,看如下代码 p1 = new Japanese();

C# 中静态调用C++dll 和C# 中动态调用C++dll

C# 中静态调用C++dll 和C# 中动态调用C++dll 在最近的项目中,牵涉到项目源代码保密问题,由于代码是C#写的,容易被反编译,因此决定抽取核心算法部分使用C++编写,C++到目前为止好像还不能被很好的反编译,当然如果你是反汇编高手的话,也许还是有可能反编译.这样一来,就涉及C#托管代码与C++非托管代码互相调用,于是调查了一些资料,顺便与大家分享一下: 一. C# 中静态调用C++动态链接 1. 建立VC工程CppDemo,建立的时候选择Win32 Console(dll),选择Dl

# 中静态调用C++dll 和C# 中动态调用C++dll

C# 中静态调用C++dll 和C# 中动态调用C++dll 在最近的项目中,牵涉到项目源代码保密问题,由于代码是C#写的,容易被反编译,因此决定抽取核心算法部分使用C++编写,C++到目前为止好像还不能被很好的反编译,当然如果你是反汇编高手的话,也许还是有可能反编译.这样一来,就涉及C#托管代码与C++非托管代码互相调用,于是调查了一些资料,顺便与大家分享一下: 一. C# 中静态调用C++动态链接 1. 建立VC工程CppDemo,建立的时候选择Win32 Console(dll),选择Dl

java父类引用指向子类对象

父类引用指向子类对象指的是: 例如父类Animal,子类Cat,Dog.其中Animal可以是类也可以是接口,Cat和Dog是继承或实现Animal的子类. Animal animal = new Cat(); 即声明的是父类,实际指向的是子类的一个对象. 那这么使用的优点是什么,为什么要这么用?可以用这几个关键词来概括:多态.动态链接,向上转型 也有人说这是面向接口编程,可以降低程序的耦合性,即调用者不必关心调用的是哪个对象,只需要针对接口编程就可以了,被调用者对于调用者是完全透明的.让你更关

java克隆对象clone()的使用方法和作用

转自:997.html">http://www.okrs.cn/blog/news/?997.html 内容摘要 若需改动一个对象,同一时候不想改变调用者的对象.就要制作该对象的一个本地副本.这也是本地副本最常见的一种用途.若决定制作一个本地副本.仅仅需简单地使用clone()方法就可以.Clone是"克隆"的意思,即制作全然一模一样的副本.这种方法在基础类Object中定义成"protected"(受保护)模式. 但在希望克隆的不论什么衍生类中,必

用父类对象给子类对象赋值数据

在写毕业设计的时候遇到了一些小问题,当创建一个VO类的时候,继承原先的PO类再添加新的属性比较快捷方便,但是将PO类转换成VO类就会需要先get再set所有属性.虽然说是面向ctrl+c.ctrl+v编程,但是还是想偷懒,所以有了以下代码: /** * 将父类对象的属性值转储到子类对象中,仅限于get(is)方法set方法规范且并存,更适用于数据库实体类,不适用于功能性类 * @param <T> * @param son 子类对象 * @param father 父类对象 * @throws