java多态向上转型向下转型的问题

Python018

java多态向上转型向下转型的问题,第1张

引用a的类型是Animal,是Cat的父类。所以是“父类引用指向子类对象”。如果是“子类引用指向父类对象”,那应该写成 Cat a = new Animal()但这显然是不和逻辑的。

你说的没错——“向上转型后,父类也只能调用父类已经有的方法”。但是子类如果覆盖了父类的方法,那么即使向上转型,方法的行为也表现为覆盖后的行为。这也是多态的一种体现。向上转型更多的用来体现一种编程上的“约定”。所有继承某个类或者实现某个接口的类,一定包含某个方法,这样在调用的时候,使得你也不必关系具体的实现细节,只要知道“这个类型中的某个方法能帮我完成工作”就可以了。

向下转型,是“引用的类型”的变化,不是对象实例类型的变化。new什么,就是什么。不会因为向上或者向下转型而改变自己的类型。

最后一个问题,不管向上还是向下转型,调用的都是实际类型中的那个方法。比如,Animal a = new Cat() a.叫()。那这个叫就是Cat类型实例中的“叫”方法。

给你举个例子吧:一个普通汽车Car类具有run方法,该方法的作用是输出一句话“我每小时跑100公里”;另有一个子类FlyCar,即会飞的汽车,该类把run方法重写了,输出的是“我每小时跑200公里”,又多了一个fly方法,输出“我每小时飞500公里”,然后再main函数中,定义一个Car的对象car1=new FlyCar();具体代码如下:

class Car{

public void run(){System.out.println("我每小时跑100公里")}

}

class FlyCar extends Car{

public void run(){System.out.println("我每小时跑200公里")}

public void fly(){System.out.println("我每小时飞500公里")}

public static void main(String args[]){

Car car1=new Car()

Car car2=new FlyCar()

car1.run()//这里 会输出我每小时跑100公里

car2.run()//这里 会输出我每小时跑200公里

car2.fly()//这句话错,不能执行

}

}

解释:

car1就是一个普通的Car类的对象,所以肯定输出我每小时跑100公里

car2虽然也是Car类的对象,但他的身体(也就是内存中的表示)是用new FlyCa()创建的,所以身体里确实有fly方法,而且run方法也是FlyCar中定义的方法(因为子类把父类的同名方法进行了覆盖,即内存里没有了父类方法),但是由于car2的变量类型是Car类型,所以它只认为自己就是一个普通的Car,只知道自己具有run方法,根本不可能知道自己还有fly方法。所以它可以调用run方法,但是执行的是子类定义的run方法,但它不知道自己具有fly方法,当然也不能调用了。

class Human{

public void drink(){System.out.println("Human")}

}

class YongMan extends Human{

public void drink(){System.out.println("YongMan")}}

}

public class Test{

public static void main(String arge[]){

Human e2=new YongMan()

e2.drink()

}

}

以上面这个程序为例子

Human e2=new YongMan()

这句其实是指父类对象e2是子类YongMan对象的上转型对象

上转型对象不能操作子类新增的成员变量(失掉了这部分属性);不能使用子类新增的方法(失掉了一些功能)。

上转型对象可以操作子类继承或者隐藏的成员变量,也可以使用子类继承的或者重写的方法。上转型对象操作子类继承或重写的方法,其作用等价于子类对象去调用这些方法。因此,如果子类重写了父类的某个方法,则当对象的上转型对象调用这个方法时一定是调用了这个重写的方法

上面的YongMan 类中的drink()方法 重写了父类的方法

所以最后的输出结果是YongMan