• 2019/10/23 动手动脑--- 多态测试



    多态测试:

    代码:

    package com.javaclass4;
    
    public class ParentChildTest {
        public static void main(String[] args) {
            Parent parent=new Parent();
            parent.printValue();
            Child child=new Child();
            child.printValue();
            
            parent=child;
            parent.printValue();
            
            parent.myValue++;
            parent.printValue();
            
            ((Child)parent).myValue++;
            parent.printValue();
            
        }
    }
    
    class Parent{
        public int myValue=100;
        public void printValue() {
            System.out.println("Parent.printValue(),myValue="+myValue);
        }
    }
    class Child extends Parent{
        public int myValue=200;
        public void printValue() {
            //super.printValue();
            System.out.println("Child.printValue(),myValue="+myValue);
            //System.out.println();
        }
    }

    运行结果:

    为什么会出现这种结果呢:这个实际就是多态的具体表现,当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。因为父类被子类赋予类型,所以父类.printValue()调用的是子类的方法,如果我想看父类的value值,则可以用super关键字来访问它,将注释取掉就很容易看清子类的value和父类value。

    多态编程有两种主要形式: (1)继承多态(2)接口多态:

    (1)代码:

    public class Zoo 
    {
    
        
        public static void main(String args[])
        {
    
                Feeder f = new Feeder("小李");
    
                //饲养员小李喂养一只狮子
    
                f.feedAnimal(new Lion());
                //饲养员小李喂养十只猴子
    
                for (int i = 0; i < 10; i++) 
            {
    
                    f.feedAnimal(new Monkey());
        
            }
    
                //饲养员小李喂养5只鸽子
    
                for (int i = 0; i < 5; i++) 
            {
    
                    f.feedAnimal(new Pigeon());
    
                }
    
        }
    
    }
    
    
    class Feeder 
    {
    
    
        public String name;
    
    
        Feeder(String name) 
        {
    
            this.name = name;
    
        }
    
        
        public void feedAnimal(Animal an) 
       {
    
            an.eat();
    
        }
    
    }
    
    
    abstract class Animal 
    {
    
    
        public abstract void eat();
    
    }
    
    
    class Lion extends Animal 
    {
    
    
        public void eat() 
       {
    
            System.out.println("我不吃肉谁敢吃肉!");
    
        }
    
    }
    
    
    class Monkey extends Animal 
    {
    
    
        public void eat() 
        {
    
            System.out.println("我什么都吃,尤其喜欢香蕉。");
    
        }
    
    }
    
    
    class Pigeon extends Animal 
    {
    
        
        public void eat() 
        {
    
            System.out.println("我要减肥,所以每天只吃一点大米。");
    
        }
    
    }

      狮子、猴子和鸽子都继承了Animals,所以当我们调用eat函数时,传入什么类型参数,则调用什么类型函数,这就是多态的表现:不同的对象可以执行相同的行为,但是他们都需要通过自己的实现方式来执行!

    (2)代码:借鉴 https://blog.csdn.net/weixin_43133824/article/details/83787446 该博主的代码

    由于java是单继承,所以在面对多个特性的时候,可以使用“接口(interface)”来抽象对象的行为特性。

    Java中“接口”的语法特性:

      1、定义一个接口,采用关键字interface,实现一个接口,采用关键字implements

      2、接口的成员函数自动成为public的,数据成员自动成为 static和final的。

      3、如果接口不声明为public的,则自动变为package。

      4、一个类可以同时实现多个接口。

    接口的使用:接口类型  接口类型的变量=new 实现了接口的具体类型()。

    package data;
    //创建一个food接口
    interface food
    {
        public void getname();
        public void eat();
    }
    //创建一个fruit接口,继承于food接口
    interface fruit extends food
    {
        //此接口继承了父接口的方法
    }
    //创建一个meat接口,继承于food接口
    interface meat extends food
    {
        //此接口继承了父接口的方法
    }
    //ora描述的是橘子,继承于fruit接口
    class ora implements fruit
    {
        public void eat()
        {
            System.out.println("此方法是吃橘子的方法");
        }
        public void getname()
        {
            System.out.println("吃的水果名称为橘子");
        }
    }
    //hotpot类描述的是羊肉,继承于meat接口
    class hotpot implements meat
    {
        public void eat()
        {
            System.out.println("此方法是吃羊肉的方法");
        }
        public void getname()
        {
            System.out.println("吃的肉名称为羊肉");
        }
    }
    //test类描述的是实现多态接口
    public class test 
    {
        public static void main(String[] args)
        {
            food f1=new ora();
            f1.eat();
            f1.getname();
            food f2=new hotpot();
            f2.eat();
            f2.getname();
        }
    }

    运行结果:

    多态的好处:当你要修改程序并扩充系统时,你需要修改的地方较少,对其它部分代码的影响较小。

     

  • 相关阅读:
    嵌入式Linux的启动过程
    【转载】vim 中文帮助手册的安装
    面向对象之编写驱动程序--中断(linux系统、s3c6410开发板)
    【转】DBCC IND / DBCC PAGE
    【转】索引查询 sys.dm_db_index_physical_stats
    【tag】Enum.HasFlag 方法
    【tag】Tuple 类 使用介绍
    【fixed point】柯里化(currying) C#实现
    SqlDataAdapter 批量更新 DataTable
    sqlCacheDependency 使用
  • 原文地址:https://www.cnblogs.com/yangxiao-/p/11729004.html
Copyright © 2020-2023  润新知