Java:多态性

Java的多态性:发送消息给某个对象,让该对象自行决定响应何种行为。 通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用。

java的多态性要满足三个条件:

1、继承关系

2、在子类重写父类的方法

3、父类引用指向子类的对象,即animal p = new dog()

在多态中非静态成员函数的特点:

在编译时期:参阅引用形变量所属的类中是否有要调用的方法。如果有,编译通过;否则,编译不通过

在运行时期:参阅对象所属的类中是否有要调用的方法。如果有,运行成功;否则,运行失败。

总结:编译时期看做左边,运行时期看右边。

在多太中成员变量和静态成员函数的特点:

无论编译和运行都参考左边(引用类型变量所属的类)

例子1:创建父类动物类Animal、子类猫类Cat、子类狗类Dog

//创建父类animal动物类
abstract class Animal
{
     public abstract void eat();
}
//创建动物类子类:猫类
class Cat extends Animal
{
    public void eat()
    {
      System.out.println("吃鱼");
    }
}
//创建动物类子类:狗类
class Dog extends Animal
{
    public void eat()
    {
      System.out.println("吃骨头");
    }
}

//多态的表现形式
class DuoTaiDemo 
{
    public static void main(String[] args) 
    {
      Animal a = new Cat(); //父类的引用指向子类对象
      a.eat();  //父类中有eat()方法,编译通过,子类中也有eat()方法,所以最终编译成功

      function(new Cat());
      function(new Dog());
    }
         
    //将动物类的引用当做参数传递给方法
    public static void function(Animal a)
    {
        //判断如果是Dog
        if(a instanceof Dog )
        {
            a.eat(); //调用父类的eat()方法
            Dog b = (Dog) a; //调用Dog的eat()方法
            b.eat();
        }
        //如果是Cat
        else if(a instanceof Cat)
        {
            a.eat();//调用父类的eat()方法
            Cat b = (Cat) a;//调用Cat的eat()方法
            b.eat();
        }
    }
}

例子2:多态的功能扩展

  基于电脑的实例(电脑主板)

  扩展(网卡、声卡、、、)

interface PCI             //扩展功能的接口(规则)
{
    public abstract void open();
    public abstract void close();
}

class MainBoard          //主板类
{
    public void run()
    {
        System.out.println("Mi anBoard run");
    }
    public void usePCI(PCI p)    //PCI p = new NetCard() //接口型的引用指向自己的子类对象
    {
        p.open();
        p.close();
    }    
    
}

class NetCard implements PCI        // 实现网卡的连接
{
    public void open()
    {    
      System.out.println("NetCard open");
    }
    public void close()
    {
       System.out.println("NetCard close");
    }
}

class SoundCard  implements PCI    // 实现声卡的连接
{
    public void open()
    {    
      System.out.println("soundcard open");
    }
    public void close()
    {
       System.out.println("soundcard close");
    }
}

//主函数测试
class DuoTaiDemo1
{
    public static void main(String[] args)
    {
        MainBoard mb = new MainBoard();
        mb.run();
        mb.usePCI(new NetCard());    
        mb.usePCI(new SoundCard());
    }
}

例子3:多态的扩展实例:连接数据库(用户可以create、add、update、delete)

interface UserInfoDao        //D:data  a:access  o:object
{
   public abstract void add();
   public abstract void deletde();
}

class UserInfoByJDBC  implements UserInfoDao        //手写连接数据库
{
    public void add()
    {
      1、JDBC连接数据库
      2、使用sql添加语句添加数据
      3、关闭数据库连接
    }
    public void delete()
    {
      1、JDBC连接数据库
      2、使用sql删除语句删除数据
      3、关闭数据库连接
    }
}

class UserInfoByHibernate implements UserInfoDao     //框架连接数据库
{
    public void add()
    {
      1、Hibernate连接数据库
      2、使用sql添加语句添加数据
      3、关闭数据库连接
    }
    public void delete()
    {
      1、Hibernate连接数据库
      2、使用sql删除语句删除数据
      3、关闭数据库连接
    }
}


class DBoperate            
{
    public static void main(String[] args) 
    {
    /*  UserInfoDao ui = new UserInfoByJDBC();         //多态引用类型指向子类对象
        ui.add();
        ui.delete();
        UserInfoDao ui = new UserInfoByHibernate();    //多态引用类型指向子类对象
        ui.add();
        ui.delete();
    */

        ui.add(new UserInfoByJDBC());
        ui.delete(new UserInfoByJDBC());
        ui.add(new UserInfoByHibernate());
        ui.delete(new UserInfoByHibernate());

    }
}
原文地址:https://www.cnblogs.com/XYQ-208910/p/4915480.html