• Java学习——多态


    多态:可以理解为事物存在的多种体现形态。

    人:男人,女人

    动物:猫,狗

    猫 x = new 猫();

    动物 x = new 猫();

    1,多态的体现
    父类的引用指向了自己的子类对象。
    父类的引用也可以接受自己的子类对象。
    2,多态的前提
    必须是类与类之间有关系。要么继承,要么实现。
    通常还有一个前提:存在覆盖
    3,多态的好处
    多态的出现大大的提高了程序的扩展性。

    4, 多态的弊端:
    提高了扩展性,但是只能使用父类的引用访问父类中的成员。

    5,多态的应用代码中的特点(多态使用的注意事项)

    6, 多态的出现

    abstract class Animal
    {
        abstract void eat();
    }
    
    class Cat extends Animal
    {
        public void eat()
        {
            System.out.println("吃鱼");
        }
    
        public void catchMouse()
        {
            System.out.println("抓老鼠");
        }
    }
    
    class Pig extends Animal
    {
        public void eat()
        {
            System.out.println("吃饲料");
        }
        public void gongDi()
        {
            System.out.println("拱地");
        }
    
    }
    
    class Dog extends Animal
    {
        public void eat()
        {
            System.out.println("吃骨头");
        }
        
        public void kanJia()
        {
            System.out.println("看家");
        }
    
    }
    class  DuoTaiDemo
    {
        public static void main(String[] args) 
        {
            /*Cat c = new Cat();
            c.eat();
    
            Dog d = new Dog();
            d.eat();
            */
    
            //Animal a = new Cat();//类型提升,向上转型。
            //a.eat();
    
             //如果想要调用猫的特有方法时,如何操作?
            //强制将父类的引用,转成子类类型。向下转型。
            
            //Cat c = (Cat)a;
            //c.catchMouse();
            //千万不要出现这样的操作,就是讲父类对象转换成子类类型。
            //我们能转换的是父类应用指向类自己的子类对象时,该应用可以被提升,也可以被强制转换。
            //多态自始至终都是子类对象在做着变化。
    
            //function(new Cat());
            function(new Dog());
    
        }
        public static void function(Animal a)
        {
            a.eat();
            if(a instanceof Cat)
            {
                Cat c = (Cat)a;
                c.catchMouse();
            }
            else if(a instanceof Dog)
            {
                Dog c = (Dog)a;
                c.kanJia();
            }
        }
        
        
    }
    /*
    基础班学生:
            学习,睡觉。
    高级版学生
            学习,睡觉。
    
    可以将这两类事物进行抽取。
    
    */
    
    abstract class Student
    {
        public abstract void study();
        public void sleep()
        {
            System.out.println("躺着睡");
        }
    }
    
    class  BassStudent extends Student
    {
        public void study()
        {
            System.out.println("bass study");
        }
        public void sleep()
        {
            System.out.println("坐着睡");
        }
    }
    
    class AdvStudent extends Student
    {
        public void study()
        {
            System.out.println("Advance study");
        }
    }
    
    
     class DoStudent
    {
        public void doSomething(Student stu)
        {
            stu.study();
            stu.sleep();
            
        }
    }
    
    public class  DuotaiDemo2
    {
        public static void main(String[] args) 
        {
    
            DoStudent ds = new DoStudent();
            ds.doSomething(new BassStudent());
            ds.doSomething(new AdvStudent());
    
    //        BassStudent bs = new BassStudent();
    //        bs.study();
    //        bs.sleep();
    //        AdvStudent as = new BaseStudent();
    //        as.study();
    //        as.sleep();
        }
        
        /*public void doSomething(Student s)
        {
            s.study();
            s.sleep();
        }
        */
    }

    在多态中成员函数的特点:
    在编译时期:参阅引用型变量所属的类中是否有调用的方法。
    如有,编译通过,如果没有,编译失败。
    在运行时期:参阅对象所属的类中是否有调用的方法。
    简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。


    在多态中,成员变量的特点:
    无论编译和运行,都参考左边(引用型变量所属的类)


    在多态中,静态成员函数的特点:
    无论编译和运行,都参考左边

    class Fu
    {
        void methed1()
        {
            System.out.println("fi method1");
        }
    
        void methed2()
        {
            System.out.println("fi method2");
        }
    }
    class Zi extends Fu
    {
        void methed1()
        {
            System.out.println("zi method1");
        }
    
        void methed3()
        {
            System.out.println("zi method3");
        }
    }
    
    class  DuotaiDemo3
    {
        public static void main(String[] args) 
        {
            //System.out.println("Hello World!");
            Fu f = new Zi();
            f.methed1();
            f.methed2();
            //f.methed3();
        }
    }
    /*
    需求
    电脑运行实例,
    电脑运行基于主板。
    
    */
    interface PCI
    {
        public void open();
        public void close();
    }
    
    class MainBoard
    {
        public void run()
        {
            System.out.println("mainboard run");
        }
        
        public void usePCI(PCI p) //PCI p = new NetCard(); 接口型引用指向自己的子类对象
        {
            if( p!=null)
            {
                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("netcard open");
        }
    
        public void close()
        {        
            System.out.println("netcard close");
        }
    
    }
    
    public class DuoTaiDemo4
    {
        public static void main(String[] args) 
        {
            MainBoard mb = new MainBoard();
            mb.run();
            //mb.usePCI(null);
            mb.usePCI(new NetCard());
        }
    }
    /*
    Object:是所有对象的直接或者间接父类,传说中的上帝。
    该类中定义的肯定是所有对象都具备的功能。
    
    Object类中已经提供了对象是否相同的比较方法。
    */
    class Demo //extends Object
    {
        private int num;
        Demo(int num)
        {
            this.num = num;
        }
    
        public boolean equals(Object obj)
        {
            Demo d = (Demo)obj;
            return this.num == d.num;
        }
    
    }
    
    class ObjectDemo 
    {
        public static void main(String[] args) 
        {
            Demo d1 = new Demo(4);
            Demo d2 = new Demo(5);
            //Demo d3 = d1;
            //System.out.println(d1.equals(d2));
            Class c = d2.getClass();
            System.out.println(c.getName() + "@@" + Integer.toHexString(d2.hashCode()));
            System.out.println(d2.toString());
        }
    }
    /*
    
    需求:数据库的操作。
    Dao: data access object
    1,连接数据库。JDBC Hibernate
    2,操作数据库。
         c create r read u update d delete
        
    3,关闭数据库里连接
    */
    interface UserInfoDao
    {
        public void add(User user);
        public void delete(User user);
    }
    class UserInfoByJDBC implements UserInfoDao
    {
        public void add(User user)
        {
            1,连接数据库。;
            2,使用sql添加语句添加数据库。;
            3,关闭连接。;
        }
    
        public void delete(User user)
        {
            1,连接数据库。;
            2,使用sql添加语句删除数据库。;
            3,关闭连接。;
        }
    }
    class  DBOperate
    {
        public static void main(String[] args) 
        {
            UserInfoByJDBC ui = new UserInfoByJDBC();
            ui.add(User);
            ui.delete();
        }
    }
  • 相关阅读:
    zz学习技术的三部曲:WHAT、HOW、WHY
    zz一种理想的在关系数据库中存储树型结构数据的方法
    某外企SQL Server面試題
    C语言中的指针 &与*
    剖析SQL Server执行计划(zz)
    UNICODE,GBK,UTF8区别
    (Part 1Chapter 14) High Performance Linux Clusters with OSCAR, Rocks, OpenMosix, and MPI
    关于GtkTreeView和 MVC的一篇好文章 入木三分
    一个混合 MPI_Init() 和 gtk_init() 的实例序
    (Part 2Chapter 57) High Performance Linux Clusters with OSCAR, Rocks, OpenMosix, and MPI
  • 原文地址:https://www.cnblogs.com/wuyong0818/p/5140684.html
Copyright © 2020-2023  润新知