举个例子来说:
public abstract class Animal {
public abstract void eat(){}
public void sleep()
{
System.out.println("动物睡觉!");
}
}
class Dog extends Animal
{
public void eat()
{
System.out.println("狗吃骨头");
}
public void Guard()
{
System.out.println("狗看家!");
}
}
public class Main {
public static void upCasting(Animal animal)
{
animal.sleep();
animal.eat();
}
public static void main(String[] args) {
Animal dog = new Dog();
upcasting(dog);
}
}
由于upCasting(Animal animal)方法的参数是 Animal类型的,因此如果传入的参数是 Animal的子类,传入的参数就会被转换成父类Animal类型,这样你创建的Dog对象能使用的方法只是Animal中的签名方法;也就是说,在上溯的过程中,Dog的接口变窄了,它本身的一些方法(例如:guard方法)就不可见了。如果你想使用Dog中存在而Animal中不存在的方法(比如guard方法),编译时不能通过的。 |