当前位置:首页 » 《休闲阅读》 » 正文

辉仔日记之学代码第七期——葫芦娃原来是多态!_DemoWaterGhost的博客

1 人参与  2022年02月16日 08:02  分类 : 《休闲阅读》  评论

点击全文阅读


目录

一、多态小故事

二、走进多态

   1、多态继承的三个必要条件

三、具体多态

四、抽象类多态

    1、认识抽象类:

    2、抽象类的特点:

五、接口类多态 

     1、认识接口

     2、接口类的特点


前言:多态,顾名思义是对象有多种形态。继承是多态的基础,没有继承就没有多态。多态分为具体多态、抽象多态和接口多态。下面我们将从这三个方面具体的为大家介绍多态。

一、多态小故事

          多态其实有点像葫芦娃的感觉,七个兄弟,七中不同的能力,他们的思想都传承于爷爷,都要降妖除魔!只是各自的方法不同!

 爷爷说:孙儿们啊,一定要长大出掉蝎子精和蛇精啊!

大娃说:爷爷看我的,我用巨石砸死他们!

 二娃说:“爷爷别怕我有顺风耳和千里眼!”

三娃说:“爷爷看我用千里眼、顺风耳去帮大娃!” 

四娃说:“爷爷我会喷火!,让我烧了他们!” 

五娃说:“我会喷水,让我淹了这些妖怪!!!” 

 

 六娃说:“我会隐身,我去救哥哥他们!”

七娃说:“爷爷看我,用我的宝葫芦,收了这些妖怪!” 

         因为爷爷教育葫芦娃要降妖除魔,保卫一方平安!所以每个葫芦娃都有自己的绝招来斩妖除魔!爷爷并没有说怎么除魔!所以每个葫芦娃都有自己的方法!在面对对象的多态里面,“爷爷”就像一个抽象类,“葫芦娃”继承了爷爷的思想,并用自己的方法除魔!每个“葫芦娃”就是子类拥有自己独特的属性和行为。比如火娃能喷火,水娃能喷水,都有自己独特的属性,便有不同的行为!

蛇精的如意,蝎子精也可以用!如意可以理解为一个接口!我可以继承到我的实现类蛇精和蝎子精身上!

       讲到这里大概应该有个大概的了解了!那么辉仔带大家更加理论的学习多态!

二、走进多态

        多态就是对象面对不同事物,在不同时刻,具有不同的形态。就像你用steam玩游戏,你可能会玩自由城类的GTA5、也有可能玩大逃杀模式PUBG、还有可能玩FPS竞技的CSGO。他们的共性都是通过steam这个游戏平台进行游戏,但是在不同的时刻,具有不同的内容与表现形式。你可以随意在steam添加游戏或者删除游戏,说明了其有很强的扩展性与替换性。并且每个游戏互不冲突,你玩CSGO的时候,不会影响其他游戏的运行。说明了减少了耦合行。

        通过steam这个列子我们能发现,多态具有以下优点

        优点1:扩展性和替换性强。     优点2:减少了类与类之间的耦合性

        优点3:灵活性和简化性。

   1、多态继承的三个必要条件

        继承、子类重写父类方法、父类引用指向子类对象。

三、具体多态

        我个人理解具体类多态,就是父类能够被实例化,可以实现自己的具体行为的。子类可以调用父类的方法和子类自己特有的方法。在实际使用中其实几乎不用。没有多大的意义。所以这里只进行简单的描述。

四、抽象类多态

    1、认识抽象类:

         什么是抽象类呢?我理解的抽象类是多个具有共性的子类归纳出来的一个父类。是一个由下到上的一个过程。就像中国人用筷子吃饭、印度人用手抓饭、欧洲人习惯用刀叉吃饭。他们的共性就是吃饭的方式,具体的实现都是不同的。是一般到特殊的过程。而他们的共性归纳出了这个抽象类,因为一个父类无法具体实现三种不同的行为,它只需要一种模糊的概念——吃饭的方式,具体怎么吃,那就用子类自己去实现。

    2、抽象类的特点:

        ①抽象类必须用abstract来修饰。

public abstract class 类名 {}

        ②抽象类中的抽象方法,可以有,也可以没有。但是!没有的话就没啥意义。 

public abstract void 方法名();

        ③抽象如何实例化,采用多态的方式,这就是抽象类的多态。 

向上转型:父类 对象名 = new 子类()

编译看父类,执行看子类。缺点:不能实例化子类特有的方法。

向下转型:子类 对象名 = (子类)父类引用

        ④ 抽象类的成员特点。

❶成员变量               ❷构造方法        ❸成员方法
   既可以是变量        空参构造           抽象方法
   也可以是常量        空参构造           普通方法

 

代码测试: 

//抽象类
public abstract class Animal {

    private int age = 20;
    private final String city = "北京";

    public Animal() {}

    public Animal(int age) {
        this.age = age;
    }


    public void show() {
        age = 40;
        System.out.println(age);
//        city = "上海";
        System.out.println(city);
    }

    public abstract void eat();

}


//猫类
public class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }
}



//测试类
public class AnimalDemo {
public static void main(String[] args) {
        Animal a = new Cat();
        a.eat();
        a.show();
    }
}

五、接口类多态 

     1、认识接口

        如果要给接口下定义,那么是这样的,接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用。接口注重的是对行为的抽象,而抽象是对属性和行为的抽象。一般情况下类只能继承一个抽象类。所以抽象类主要表达对象根源性问题,就是对象是什么。而接口侧重于对象能做什么。就像学生会跑,狗会跑,他们的共性是跑这样理解就不太对了。学生是人,狗是动物。他们的行为,可以用接口实现。这样抽象类回到了自己的本质工作上,接口就单纯的变成一个体系外的额外功能。说明接口是由上到下,是因为有这个行为,才实例到有需求的类上。

     2、接口类的特点

        ①接口类必须用interface来修饰。

public interface 接口名 {} 

        ②类实现接口用implements表示

public class 类名 implements 接口名 {}

        ③接口如何实例化,采用多态的方式,这就是接口类的多态。 

        ④ 接口的实例,要不重写接口的抽象方法,要不实例进行抽象。

        ⑤接口成员特点

      ❶成员变量
           只能是常量,默认修饰符为:public static final
      ❷构造方法
           接口中没有构造方法
      ❸成员方法
           接口中可以有抽象方法,默认修饰符为:public abstract

        ⑥接口中还可以存在默认方法、静态方法和私有方法

      ❶默认方法

格式:

public default void show3() { }

解释:

默认方法不是抽象方法,所以不强制被重写。但是可以被重写,重写的时候去掉default关键字 (public可以省略,default不能省略)。

      ❷静态方法

  格式:

  public static 返回值类型 方法名(参数列表) {   }
  public static void show() {}

  解释:

  静态方法只能通过接口名调用,不能通过实现类名或者对象名调用

( public可以省略,static不能省略)

      ❸私有方法

格式:

private static void method() {  }


解释:

默认方法可以调用私有的静态方法和非静态方法
静态方法只能调用私有的静态方法

代码测试: 

//动物类
public abstract class Animal {
    private String name;
    private int age;

    public Animal() {
    }

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public abstract void eat();
}

//跳高接口
public interface Jumpping {
    public abstract void jump();
}


//猫类
public class Cat extends Animal implements Jumpping {

    public Cat() {
    }

    public Cat(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }

    @Override
    public void jump() {
        System.out.println("猫可以跳高了");
    }
}


//测试类
public class Cat extends Animal implements Jumpping {

    public Cat() {
    }

    public Cat(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }

    @Override
    public void jump() {
        System.out.println("猫可以跳高了");
    }
}

辉仔故事也讲了,理论也讲了,希望大家多多点赞呀!评论!每一次点赞都是对辉仔的激励!!!


点击全文阅读


本文链接:http://zhangshiyu.com/post/34826.html

方法  接口  多态  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1