`
caoyubest
  • 浏览: 710 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

关于父类引用指向子类对象

阅读更多
很多人在初次接触设计模式的时候,最大的疑惑莫过于碰到这样的句子:(父类Animal和子类Dog)
Animal a2 = new Dog();

这是什么玩意儿?究竟有什么用途,我直接用子类对象不就完了?

我们就来解释一下:
--这是什么玩意儿?
re:这种用法叫做“父类引用指向子类对象”(跟绕口令似的),或者叫“父类指针指向子类对象”,指的是定义一个父类的引用,而它实际指向的是子类创建的对象。功能上相当于子类的“向上转型”,或者“上溯对象”,
上面的语句也可以写成:
Animal a2 = new Animal();
Dog    dog = new Dog();
a2 = dog;

将子类对象赋给父类的引用就是向上转型,Animal a2 = new Dog();中的new Dog()就是实例化一个没有名字的对象,然后转型给父类的引用a2,仅此而已。
--究竟有什么用途?
re:一般来说,一个对象实例创建完就定死了,比如dog,如果程序里的变量写dog的话,万一以后发生变化就要改代码了。那么事先就不写死dog,而是写父类Animal,那么以后用到Animal的地方,用dog实例,cat实例都可以取代,不用改实例名了。说玄乎一点,也就体现了面向对象“多态”的特性。
下面看一个很简单的例子,就更加明白了:
    class Animal
    {
        private String type = "Animal";
        public virtual void showLegs()
        {
            Console.WriteLine("This is an {0} , Animal always has legs",type);
        }
    }
    class Dog : Animal
    {
        private String type = "Dog";
        public override void showLegs()
        {
            Console.WriteLine("This is a {0} , Dog has four legs", type);
        }
    }
    class Glede : Animal
    {
        private String type = "Glede";
        public override void showLegs()
        {
            Console.WriteLine("This is a {0} , Glede has two legs",type);
        }
    }

    class test
    {
        static void Main(string[] args)
        {
            Animal a1 = new Animal();
            Animal a2 = new Dog();
            Animal a3 = new Glede();
            a1.showLegs();
            a2.showLegs();
            a3.showLegs();
            Console.ReadLine();
        }
    }

结果:
This is an Animal , Animal always has legs
This is a Dog , Dog has four legs
This is a Glede , Glede has two legs

真正明白了这些,也就该接触设计模式领域了。
最后唠叨两句:
·因为a2,a3都是子类的对象,所以调用起来,也都是调用的子类的方法(当然前提是它们都override了父类方法,诸位可以试着把两个子类中的override替换成new,结果就完全不一样),有人把这叫做“关注对象原则”。
·向上转型是一定没有错的,就好比你说“狗是动物”是成立的,反之,向下转型就要注意了,你不能说“动物是狗”。
也不知道说明白没有,先下了。。。
分享到:
评论

相关推荐

    父类引用指向子类对象

    父类引用指向子类对象

    父类引用指向子类对象[归纳].pdf

    父类引用指向子类对象[归纳].pdf

    【Java基础】怎么理解父类引用能指向子类对象?

    因为子类中有一个隐藏的引用super会指向父类实例,所以在实例化子类之前会先实例化一个父类,也就是说会先执行父类的构造方法,由于s中包含了父类的实例,所以s可以调用父类的方法。 下面我们来看一下代码:

    ChildClass.java

    父类引用指向子类对象时,没法调用子类特有的方法; 父类引用指向子类对象: java中子类强转父类,实际上依然是子类; 该引用只能调用父类中定义的方法和变量; 如果子类中重写了父类中的一个方法,那么在...

    Java零基础-多态.md

    在阅读过程中,尝试编写简单的Java程序,体验多态的效果,并观察父类引用指向子类对象时的行为变化。 建议通过阅读相关的Java教材或搜索资料,进一步了解与多态相关的高级主题,如抽象类和接口等内容。 如有疑问,...

    Java 多态的中转!!//有趣的编程故事!!

    向上转型:父类引用指向子类对象,提高了程序的扩展性。 向下转型:父类引用转为子类对象,可以访问子类的特有功能(新增方法)。 代码: class 张三爹{ int age = 45; public void teach(){ System.out.println...

    第二周总结1

    第二周第一章一、对象的上转型对象(以及下转型对象) 1、上转型对象,父类引用指向子类对象,这样父类的引用可以在调用自己的被重写的方法时会调用引用向下转型的子类的

    [Java] 对象类型转换和运算符 instanceof 学习笔记 [#子类转父类 #父类转子类 #对象和引用的区别]

    引用:全称是引用变量,可以理解成指向对象的指针。可以通过对引用变量来操作引用变量所管理的那个对象。正因为这个性质,导致引用变量的生命周期和其管理的对象相同。 内存区别:对象被实例化后要开辟内存空间,而...

    PHP面向对象多态性实现方法简单示例

    多态:父类引用指向子类对象(面向对象中能够根据使用类的上下文(使用输入不同的类调用不同类的方法)来重新定义或改变类的性质和行为。);接口引用指向实现接口的类对象。 面向对象:把数据(属性),操作数据的...

    duotai.java

    最终多态体现为父类引用指向子类对象。 多态的前提是必须有子父类关系或者类实现接口关系,否则无法完成多态。 在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法。 二、多态的定义与使用格式 ...

    【Java】基础18:面向对象三大特性之多态

    1.格式说明:父类引用指向子类对象。 具体什么意思呢? 变量有基本数据类型和引用数据类型。 其中引用数据类型又分为:数组,类和接口。 父类类型指的是子类继承至的父类,或者子类实现的接口。 按照现实里面的理解...

    Java复习大纲面试题.doc

    父类引用指向子类对象 9.什么是方法重载?什么是方法重写?方法重载与方法重写的区别? 方法重载(Overload):是指方法名字相同,参数的个数、类型、次序不同。 方法重写(Override/Overwrite):是指子类重写了从父类...

    从Java多态到策略模式

    先来复习下java多态:java多态指的是父类引用指向子类对象,不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。  接下来我们再说下什么叫策略模式:将每一个算法封装到...

    模拟物流快递系统程序设计(面向对象的程序设计)

    模拟物流快递系统程序设计(面向对象的程序设计)1. 掌握抽象类、抽象方法的特点 2. 接口的特点 3. Super关键字 4. 抽象类及接口的实现 5. 父类的引用指向子类的对象,多态的意义

    JAVA细节知识

    注意:当父类的引用指向子类对象时,若访问被重写的方法,则将访问被重新定义的子类中的方法。 接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的, 另外,...

    COMPANY 员工

    员工的类与其子类,类的一些基本操作 实现了父类的引用指向子类的实例对象 同时对多态的实现有很不错的功能

    java面试真题整理

    运行时多态:重写,对象的多态性(父类的引用指向子类的实例) 5.CSDN 1.泛型的好处 保护类型安全 避免强制类性转化 2.final 1.修饰的属性是常量 2.修饰的方法不能被重写 3.修饰的类不能被继承 String

    JAVA面向对象详细资料

    25.3 父类的引用指向子类实例时,父类引用可以调用哪些方法? 35 26 引用类型的自动类型与强制类型转换 36 27 多态的应用 37 27.1 在使用多态时的一般格式: 37 27.2 练习:创建一个薪资专员(Persionnel),能计算...

    华为C++笔试题全部汇总

    3. 父类的析构函数是非虚的,但是子类的析构函数是虚的,delete子类指针(指向该子类对象)[特殊情况,参见题5],会调用父类的析构函数(正确)//任何情况下删除子类都会调用到父类的析构函数 4.对于下面的类CA,...

Global site tag (gtag.js) - Google Analytics