Java三大特性之继承

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

记住这个三个关键词。每次我都要强调。这篇文章讲继承。封装、多态可以查看其余两篇文章。

什么是继承?通俗一点讲,子类拥有父类的部分特性,这个特性包含数据结构和方法。 上一组代码

public class Animal {
  public String name;
  public String sex;
  public Integer age;

  public Animal() {}

  public void eat() {
    System.out.println("动物吃东西");
  }

  public void display() {
    System.out.print("name:" + name);
    System.out.print("  sex:" + sex);
    System.out.print("  age:" + age);
  }
}

这是一个Animal类,Dog类继承Animal。

public class Dog extends Animal {
}

我们写一组测试代码

 public static void main(String[] args) {
    Animal animal = new Animal();
    animal.name = "动物";
    animal.sex = "雄";
    animal.age = 1;
    animal.display();

    Dog dog = new Dog();
    dog.name = "狗";
    dog.sex = "雄";
    dog.age = 2;
    dog.display();
  }

运行结果如图
这里写图片描述
是不是觉得很神奇呢?毕竟我们Dog里面什么都没有写,只是继承了Animal的。这就是继承,子类拥有父类的部分特性。

现在问题来了,为什么子类拥有的父类的部分而不是全部特性?

各种书籍里面常用父亲和儿子举例,儿子可以像父亲,但是儿子不是父亲的。这个比喻很形象,但是我对这个答案不是很满意的。因为就像我上面写的测试代码一样,Dog看起来像完全拥有Animal的特性一样。这个问题我看到了部分源码过后终于明白了答案。
在Java里面所有的都如果没有显示继承(例如Animal),会默认继承Object。可以这样说Object是所有类的父类。我们来看看Object的源码,找到如图所示的方法
这里写图片描述
看见没有,这是一个private的方法(关于权限控制,请自行搜索),而且直接静态加载,根本就不给你机会调用。子类拥有父类的部分特性,这个观点,我们从源码上分析,是不是觉得简单明了呢?

下面我讲介绍继承里面另外一个概念,方法重写(Override)又称方法覆盖。什么意思呢?
子类对父类的方法不满意,想要自己追加一些实现,例如Animal类里面的eat()方法。

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

关键字Override表明这是重写的父类方法,免得混淆子类和父类的相同名字的方法。

    animal.eat();
    dog.eat();

运行结果如果
这里写图片描述
如果我们想执行父类的方法,然后追加自己的结果呢?
用关键词:super

  @Override
  public void eat() {
    super.eat();
    System.out.println("狗吃屎");
  }

运行结果
这里写图片描述
Animal的eat()方法被调用了两次。
如果父类不想让子类继承怎么办?用private修饰

  private void display() {
    System.out.print("name:" + name);
    System.out.print("  sex:" + sex);
    System.out.println("  age:" + age);
  }

这里写图片描述

怎么判断某个对象是否是某个类的具体实例(或者拥有继承关系)
用关键词:instanceof

    if (animal instanceof Animal) {
      System.out.println("yes");
    } else {
      System.out.println("no");
    }
    if (dog instanceof Animal) {
      System.out.println("yes");
    } else {
      System.out.println("no");
    }
    if (animal instanceof Dog) {
      System.out.println("yes");
    } else {
      System.out.println("no");
    }

运行结果如下
这里写图片描述

关于继承暂时就想到这么多。

如有疑问,欢迎指教!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值