Animal animal=new Dog();//向上转型,把子类对象赋值给父类
好处是:
import javax.naming.ldap.Control;
public class demo {
public static void control(Animal animal)//这里可以直接写他们的父类,传过来的是实参,相当于,Animal animal=new Dog/cat();
{//如果不写父类,则要写两个方法,一个接收dag类型,一个接收cat类型
animal.eat();
}
public static void main(String[] args) {
control(new Dog());
control(new Cat());
}
}
class Animal {
public void eat(){
System.out.println("animal吃东西");
}
}
class Dog extends Animal{
@Override
public void eat()
{
System.out.println("dog吃骨头");
}
public void kanjia()
{
System.out.println("dog在看家");
}
}
class Cat extends Animal {
@Override
public void eat(){
System.out.println("小猫吃鱼");
}
}
但是坏处是没办法调用子类自己的方法了
public class demo {
public static void main(String[] args) {
Animal animal1=new Dog();
animal1.kanjia();//这句会报错,不能调用子类自己的方法
}
}
class Animal {
public void eat(){
System.out.println("animal吃东西");
}
}
class Dog extends Animal{
@Override
public void eat()
{
System.out.println("dog吃骨头");
}
public void kanjia()
{
System.out.println("dog在看家");
}
}
}
所以就需要将向上转型的对象,向下转型,转回子类。就可以调用子类自己的方法。
向下转型在实际开发中用的少
在向下转型之前,必须使用instatceof判断一下是否有继承关系,有才可以转
A a1 =new D();
if(a1 instanceof A)
{
System.out.println("a1确实是A的子类,可以进行向下转型");
D d1=(D) a1;
d1.printd();
}