Java三大特性之多态

17 篇文章 0 订阅
    Java三大特性:封装,继承,多态。

请记住这三个词语,重要的事情说三遍。封装和继承查看我之前的文章。

其实不是很想写多态的,自认为能力不够,无法解释清楚多态优越性,或者说为什么Java会有这种特性能做什么的,对于初学者来说,Java三大特性好像体现不出什么优势的。但我还是厚着脸皮写了,三大特性需要写完的,不能半途而废。

什么是多态?
相同的行为在运行时表现出不同的形态,或者执行不相同的行为。

很多初学者,包括当初的我都会有这样的疑问,为什么相同行为会在运行期表现出不同的行为。下面上一组代码。
首先定义一个接口interface,Person里面有三个方法grow(),eat(),showMine(),定义两个类Woman和Man两个类实现Person接口。

Person接口

public interface Person {
  void grow();
  void eat();
  void showMine();
}

Man类

public class Man implements Person {

  private static final String sex = "男";
  private String name;
  private int age;

  public Man(String name, int age) {
    this.name = name;
    this.age = age;
  }
  public void grow() {
    System.out.println("男人成长");
  }
  public void eat() {
    System.out.println("男人吃东西");
  }
  public void showMine() {
    System.out.println("当前男人姓名是:" + name + ",年龄是:" + age);
  }
  public static String getSex() {
    return sex;
  }
  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;
  }
}

Woman类

public class Woman implements Person {
  private static final String sex = "女";
  private String name;
  private int age;

  public Woman(String name, int age) {
    this.name = name;
    this.age = age;
  }
  public void grow() {
    System.out.println("女人成长");
  }
  public void eat() {
    System.out.println("女人吃东西");
  }
  public void showMine() {
    System.out.println("当前女人姓名是:" + name + ",年龄是:" + age);
  }
  public static String getSex() {
    return sex;
  }
  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 static void main(String[] args) {
    Person person1 = new Man("小明", 12);
    person1.grow();
    person1.eat();
    person1.showMine();

    Person person2 = new Woman("小红", 14);
    person2.grow();
    person2.eat();
    person2.showMine();
  }

运行结果
这里写图片描述

不知道你们看完这组代码过后,对上面的相同的行为运行时具有不相同的操作这个说法了解没有。或许你们看过很多教程,那些教程都是用继承(extends)来讲解的。但我觉得基于继承(extends)来讲多态,完全就是一种对多态的浪费,发挥不出多态的优越性。直到我学了面向接口编程,我才发现多态应该是这样用的。

实现(implements)接口(interface),从某种意义上面来说也是算一种继承(extends)的。看一组代码.

    Man man = new Man("张三", 22);
    if (man instanceof Person){
      System.out.println("Man 是Person的子类");
    }

运行结果
这里写图片描述

随着Java8的发布,接口里面的方法可以拥有默认实现,好像看起来,抽象类和接口在代码层面的差距越来越小了,但是了解的深入,你会发现从某些设计思想来说还是具有不可逾越的鸿沟。

多态我就准备写到这里了,至于什么向上转型,向下转型之类的,我觉得完全没有必要写那么多,直白点说就是强制转化的,还说什么向上转型是安全,向下转型是不安全等等。不管向上转型还是向下转型都是有风险的,但是这点风险和多态的优势相比,可以忽略不计的。

总结:Java三大特性都不是给初学者准备的,但对有一定编程基础的人来说,这些特性就非常有用!

如有疑问,欢迎指教!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值