• 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());
    
        }
    }
  • 相关阅读:
    慎用SELECT INTO复制表
    Log4net 配置使用总结(一)
    清除Chrome浏览器的历史记录、缓存
    System.Runtime.InteropServices.COMException (0x80040154)错误
    MS SQL开发命名规则
    查看数据库、表、索引的物理存储情况
    (转)ASP.NET调用javascript脚本的方法总结
    SQL Server ——动态SQL
    SQL性能调优实践——SELECT COUNT
    养成随时注释的好习惯
  • 原文地址:https://www.cnblogs.com/XYQ-208910/p/4915480.html
Copyright © 2020-2023  润新知