• 关于抽象方法和接口向上转型


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

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

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

    抽象类为例来说明:

     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),那这是为什么呢?明明内存中存放的是子类的对象啊?  这是因为将子类的对象赋给了父类的变量,在父类的类体中,没有找到这个方法,

    所以无法调用。

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

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

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

  • 相关阅读:
    notepad++ 安装
    Git 安装
    C 字符串常量 数据类型
    vue路由传参query和params的区别
    mysql 在 centos 上安装,做成服务,且开机启动 步骤
    全网最详细Apache Kylin1.5安装(单节点)和测试案例 ---> 现在看来 kylin 需要 安装到Hadoop Master 节点上
    Kylin build cube step 2 报错(Kylin 安装在slave 节点上)
    Kylin build cube step 2 报错
    Kylin 环境 搭建 成功
    Kylin 环境 搭建 报错
  • 原文地址:https://www.cnblogs.com/ywzbky/p/10665535.html
Copyright © 2020-2023  润新知