Java中的对象转型(多态)

多态是指父类的同一行为在不同状态表现出不同的响应。

向上转型(upcasting):父类的引用指向子类的对象(隐性转换)
父类的引用只表现出父类的属性和方法,且子类重写(权限更高)的方法覆盖。
例:
定义一个Person类,再定义一个GoodMan类和BadMan类,这两个类都继承Person类,每个人都可以makeFriends,所以Person类里面有一个方法makeFriends(),在GoodMan和BadMan中都重写了makeFriends()方法,GoodMan和BadMan的实现方法不同,当向上转型的时候将父类的引用指向子类的对象,相当于表面上看是个Person,不知道具体是GoodMan还是BadMan,所以只能看到Person具有的属性和行为,但是行为的结果不一样,这就形成了多态。

public class Person
{
      int eyes = 2;
      void makeFriends()
      {
      }
}
class GoodMan extends Person
{
      void makeFriends()//GoodMan中重写的makeFriends方法
      {
            System.out.println("交益友");
      }
}
class BadMan extends Person
{
      void makeFriends()//BadMan中重写的makeFriends方法
      {
            System.out.println("交损友");
      }
}
public class Demo
{
      public static void main(String[] args)
      {
            Person p1 = new GoodMan();//向上转型
            p1.makeFriends();//输出“交益友”
            Person p2 = new BadMan();//向上转型
            p2.makeFriends();//输出“交损友”
      }
}

多态缺点:不能表现出子类的属性和特有的方法。用向下转型可以解决问题。

向下转型(downcasting):子类的引用指向父类的对象(显性转换)
向下转型的前提是先有向上转型(向下转型是和向上转型配合使用)
例:同上,下面只写Demo主类

public class Demo
{
      public static void main(String[] args)
      {
            Person p1 = new GoodMan();//向上转型
            p1.makeFriends();//输出“交益友”
            Person p2 = new BadMan();//向上转型
            p2.makeFriends();//输出“交损友”

            BadMan bm = (BadMan)p2;//向下转型
            bm.makeFriends();//输出“交损友”
      }
}

可能有人对向下转型的意义有疑问,认为向下转型换成 BadMan bm = new BadMan()结果一样,在此解释一下,本例中假设有一个GoodMan和一个BadMan,在代码中实现没有任何问题,用向下转型还是原来的那个BadMan,但是如果new BadMan(),分配新的内存空间,结果一样,也就是有两个内容相同的内存空间,相当于原来的BadMan变成了两个BadMan,浪费内存也不符合逻辑。所以向下转型优于重新创建对象。

如有错误之处,请指出。

你可能感兴趣的:(Java中的对象转型(多态))