你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

闲谈向上转型

2021/12/3 1:04:24

什么是向上转型

  • 假设,A类是B类的父类,当用子类创建一个对象,并把这个对象的引用放到父类的对象中时,比如:

在这里插入图片描述

  • 这时,称对象a是对象b的上转型对象

【例】Animal a = new Tiger( ); 老虎是动物

【例】家禽 X = new 鸡;鸡是家禽

一个代码示例

  • Poultry家禽父类
package com.UpwardTransformation;

public class Poultry {
    protected String name="家禽";
    public void move(){
        System.out.println("我是父类家禽,我会动");
    }
}
  • Rooster公鸡子类
package com.UpwardTransformation;

public class Rooster extends Poultry {

    public void crow(){
        System.out.println("我是公鸡,我在打鸣");
    }
}
  • 测试主类
package com.UpwardTransformation;

/**
 * @author:xzk_k_k@163.com
 * @date:2021/12/3,0:19
 * @version:1.0
 */
public class Test {
    public static void main(String args[]){
        Poultry poultry=new Rooster();
        poultry.move();
        //poultry.crow();//引用子类方法会报错
    }
}

  • 输出
我是父类家禽,我会动
  • 从上述代码中可以看出:父类引用指向子类对象,只能调用来自父类的属性或者行为

List list = new ArrayList();

  • 可能你们经常见到我也经常用的一个上转型实例:

    List list = new ArrayList();
    
  • List是一个接口,ArrayList实现了这个接口,list只能使用ArrayList中已经实现了的List接口中的方法,ArrayList中那些自己的、没有在List接口定义的方法是不可以被访问到的

  • 如果你把类型定义成ArrayList,那么你就只能接收这一种类型的数据了,如果你要是定义为List那么你不仅可以接收ArrayList的对象还可以接收LinkedList的对象,这样你的程序就灵活了

  • 在面向对象设计中,有一个依赖倒置原则,提倡我们面相接口编程

  • 一个接口会有很多实现,下次你若希望用LinkedList的实现来替代ArrayList的话,只需改动一行即可,其他的所有的都不需要改动

List list=new LinkedList()
  • 这样就提高了程序的灵活性,可维护性

再看个接口的例子

  • 接口Animal
public interface Animal {
    void say();
    void listen();
}
  • Dog实现Animal接口
public class Dog implements Animal{
    @Override
    public void say() {
        System.out.println("汪汪");
    }

    @Override
    public void listen() {
        System.out.println("狗狗在听");
    }
    public void run(){
        System.out.println("狗狗在跑");
    }
}
  • 主类
/**
 * @author:xzk_k_k@163.com
 * @date:2021/12/3,0:56
 * @version:1.0
 */
public class Test {
    public static void main(String args[]){
        Animal animal=new Dog();
        animal.say();
        animal.listen();
        //animal.run();
    }
}
  • 输出
汪汪
狗狗在听