zoukankan      html  css  js  c++  java
  • 关于抽象方法和接口向上转型

    抽象类的出现,只要是为了规范子类的方法的命名,抽象类不能创建对象,是因为抽象类中含有抽象方法,所以抽象类是不完整的,假若抽象类可以创建对象的话,创建出来的对象要调用抽象类的方法,而抽象方法无调调用,就会出错,所以抽象类无法创建对象。

    接口类的出现原因和抽象类差不多,但是抽象类和接口还是有很大的差别的,反映在:抽象类是类,接口类是接口,类是单根继承的,而接口是多继承的,一个类只能继承一个父类,而一个类可以实现多个接口,一个接口可以继承多个接口。

    下面来说说抽象对象和接口向上转型的问题:众所周知,抽象类和接口都是不能创建对象的,但是子类的向上转型中,抽象类和接口又可以接受来自子类向上转型创建的对象,由于接口和抽象类的原因一样,所以就以

    抽象类为例来说明:

     1 class abstract Pet{
     2 
     3 public abstract eat(0;
     4 
     5 }
     6 
     7  
     8 
     9 class Cat  extends  Pet{
    10 
    11   @Override
    12 
    13   public void eat(){
    14 
    15    syso("eating......");  
    16 
    17 } 
    18 
    19 }
    20 
    21 
    22 
    23 public class Test{
    24 
    25   Pet p =new  Cat();  //此处是一个向上转型  
    26 
    27 }

    来解释一下为什么不能创建对象的抽象父类Pet在此处可以有一个对象 p,其实  在内存空间的  存储的是Cat开辟的空间,所以p其实是Cat的对象,只是给了他一个父类的外表而已,所以抽象父类可以接受来自子类的向上转型的对象,接口也相同。

    Pet  p  =new Cat();    只有 new Cat() 才是创建对象,   Pet  p 只是一个变量,并不是创建对象。

    向上转型:本来是子类的类型,赋给了一个父类的变量,向上转了一个类型,所以叫向上转型。

    向上转型之后调用方法,依然是调用子类的方法,是因为内存中开辟的空间存放的依然是子类的对象。

    向上转型后的父类对象,无法调用子类的自有方法(只有子类有,父类没有,无论修饰符是public还是private),那这是为什么呢?明明内存中存放的是子类的对象啊?  这是因为将子类的对象赋给了父类的变量,在父类的类体中,没有找到这个方法,

    所以无法调用。

    向下转型,只有经过向上转型的父类对象,才可以向下转型。

    为什么只有经过向上转型的父类对象,才可以向下转型,  而不能直接不经过向上转型,父类对象就直接向下转型呢?   因为子类的功能往往更加丰富,子类的自有方法父类不能调用,所以不能直接向下转型。

    向上转型后,调用子类和父类的同名方法,搞不清了可以记住就近原则,是子类的实体,所以肯定先调用子类的方法,子类没有了才使用父类的方法

  • 相关阅读:
    how to uninstall devkit
    asp.net中bin目录下的 dll.refresh文件
    查找2个分支的共同父节点
    Three ways to do WCF instance management
    WCF Concurrency (Single, Multiple, and Reentrant) and Throttling
    检查string是否为double
    How to hide TabPage from TabControl
    获取当前系统中的时区
    git svn cygwin_exception
    lodoop打印控制具体解释
  • 原文地址:https://www.cnblogs.com/ywzbky/p/10665535.html
Copyright © 2011-2022 走看看