首页 > 技术文章 > 多态

gxh299988 2021-02-05 15:59 原文

多态

向上转型(自动提升) =》小转大

父类引用指向子类实例

        //向上转型(隐式转型、自动转型),小转大,转完后不能再使用子类独有的方法
        Animal two=new Cat();
        Animal three=new Dog();

转成父类后子类特有方法不能被访问,除非子类重写的父类的方法

public class A{
	public static void main(String[] args){
		F x = new zl();
		x.test();//当子类重写了父类的方法后,提升后访问该方法,默认是找的重写后的
       	x.show();//当父类没有子类的方法,调用子类的方法会报错
	}
}

class F{
	public void test(){
		System.out.println("fl");
	}
}

class zl extends F{
	public void test(){//重写了父类方法
		System.out.println("zl");
	}

	public void show(){}
}

向下转型(强制转换)=》大转小

为什么说时强制转换?

手机是电子产品的一种,手机可以作为电子产品,但是电子产品不能直接作为手机,所以需要强转

说明

  • 子类引用指向父类对象
  • 强转条件:父类有子类特征,
    • 可用instanceof判断(一个对象是否由另一个对象实例化产生,一个对象是否有另一个对象的特征)
 		Animal a1=new Cat();
        Cat c1=(Cat) a1;
        c1.playBall();
        //报错,父类引用和cat无关联
        Animal a1=new Animal();
        Cat c1=(Cat) a1;
        c1.playBall();

抽象类

为什么用?

  • 从子类中抽象出来的方法不知道写什么具体的内容可以把方法定义成抽象方法,这时候可以用抽象类,只定义方法,内部逻辑不写
  • 规定子类必须重写这个方法
public abstract  void raiseSalary();

注意

  • 方法名用abstract修饰,类也要被abstract修饰
  • 类体中可以有抽象类和普通类
  • 不能被实例化,但可以用子类向上转型,能指向(引用)一个非抽象子类的地址
  • 抽象类可以没有抽象方法,抽象方法必须有抽象类
  • static、final、private不能和abstract并存

应用场景

某个父类只是知道子类应该包含哪些方法,但无法知道子类如何实现这些方法

推荐阅读