什么是向上转型
- 假设,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();
}
}
- 输出
汪汪
狗狗在听