Java学习7:继承详解及用法

Java面向对象三大特征:封装、继承、多态。

1.概述

我们知道编程是对现实世界的建模和问题的解决。
Java作为一门面向对象的语言,其面向对象三大特征:封装、继承、多态

1.1作用

  • 从OOD(面向对象设计)的角度思考:继承是相对于类而言的。类是对对象的抽象(抽出像的,共同点),继承是对某一批类的抽象,从而实现对现实世界更好地建模。
  • 从OOP(面向对象编程)的角度思考:提高代码的复用性。(组合也可以提高复用性)
    extends的意思是“扩展”。子类是父类的扩展。

1.2特点

  • 子类继承父类,可以得到父类的全部属性和方法(除了父类的构造方法法)
  • Java中类只有单继承,没有想c++那样的多继承(这也是Java被称作C++-的一个原因),只能有一个直接父类。多继承会引起混乱,使得继承链过于复杂,系统难于维护。
  • Java中的多实现(继承)可通过接口实现。
  • 如果定义一个类时,没有调用extends,则他的父类是:java.lang.Object(根类)

这里我们主要从发吗复用性的角度去理解和思考继承。

2.代码

下面我们根据下面的树状图编写一个Animal类文件。我们知道,一个class文件中可以有很多的class,但只能有一个public class,并且和文件名相同

这里写图片描述

我们假设,鸟类和哺乳动物类都属于动物类。则,应知的,动物类具有的特点和行为(属性和方法),鸟类和哺乳类也具有。下面仅针对我们关注的点,写以下类:

public class Animal {
    String name;

    void eat() {
        System.out.println("have a good dinner");
    }
}

class Birds {
    String name;

    void eat() {
        System.out.println("have a good dinner");
    }

    void fly() {
        System.out.println("Yeah,I can fly~~");
    }
}

class Mammal {
    String name;

    void eat() {
        System.out.println("have a good dinner");
    }

    void run() {
        System.out.println("Qie,I can run~~~");
    }
}

这是我们的正常写法。下面我们发现,所以的东物还具有sleep的行为,于是需要为所有的类添加sleep方法,这显然是过于繁琐了。易见的,如上的代码具有以下确定:
①重复代码过多,不够简介;
②不易于代码维护和修改;
我们只需要通过extends关键字,继承获得父类多有的属性和方法(非构造方法)即可。如下:

public class Animal {
    String name;

    void eat() {
        System.out.println("have a good dinner");
    }
}

class Birds extends Animal {

    void fly() {
        System.out.println("Yeah,I can fly~~");
    }
}

class Mammal extends Animal {
    void run() {
        this.name = "Dog";
        this.eat();
        System.out.println("Qie,I can run~~~");
    }
}

那么如何测试是否获得父类Animal的属性和方法呢?
我们在代码Mammal类的run()方法,通过this关键字测试即可。(关于this关键字用法

思考:假如子类继承父类得到的方法不是我想要的方法,该如何处理呢?可以通过重写进行实现。下一节将会详细说明。

基类java.lang.Object

我们观察Animal类,其并没有直接父类。事实上如果没写直接父类,那么该类继承自java.lang.Object。
因而等价于:

public class Animal extends Object { // 相当于没写
    String name;

    void eat() {
        System.out.println("have a good dinner");
    }
} 

此外我们也可以通过eclipse之类的IDE工具来查看其父类,方法如下:

  1. 按住Ctrl,将鼠标移动到Animal类上;会出现一个候选框:Open Declaration;Open Implementation。第一个是描述,第二个是看起父类或者实现类。我们点击Open Implementation。便可以看到该类的继承关系。如下图:
    这里写图片描述
    或者把鼠标放在类上,直接Ctrl+T
  2. 我们可以点击Object类,可以看到类信息。(注,如果看到的Add Source按钮,说明并未加载该类的信息,点击Add Spource->选择external文件->C:\Program Files\Java\jdk1.8.0_101\src.zip)

之前说过类的加载顺序,加载该类时,首先加载该类的直接父类,以此类推,那么最先被加载的就是根类:java.lang.Object。

至于父类子类的其他叫法:超类、父类、基类、子类、派生类。

小结

  • 继承是子类继承父类,通过extends关键字实现。
  • 子类继承父类,可以得到父类的全部属性和方法(除了父类的构造方法法)
  • Java中类只有单继承,没有像c++那样的多继承(C++-),只能有一个直接父类。多继承会引起混乱,使得继承链过于复杂,系统难于维护。
  • Java中的多实现(继承)可通过接口实现。
  • 从面向编程的角度来说,继承可以提高代码的复用性。
  • 如果定义一个类时,没有调用extends,则他的父类是:java.lang.Object(根类)

错别字有点多,已更改,见谅哈~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值