Java面向对象通俗易懂详解[继承、接口]

280 阅读4分钟

继承、接口

1.继承—示例描述

孩子拥有和父亲一样的长相、气质、脾气等,是父亲遗传下来的,同样父亲的脾气、长相像爷爷,也是遗传下来。

在 Java 中我们将孩子、父亲、爷爷的这种遗传关系用从下往上的建立关系,称之为继承关系。如图下图所示

image.png

用 Java 实现以上代码,结构关系如下:

image.png

2.继承(源码)—爷爷类

爷爷类(源代码:com.chapter01.testclass.GrandFather)

package com.chapter01.testclass;

/**
 * 爷爷
 */

public class GrandFather {

private String eye = "深邃 的眼 睛 ";
private String face = "国字脸";
private String nose = "大鼻 子";

private double money = 888888888D;

//无参数构造器
public GrandFather() {}

//全参数构造器

public GrandFather(String eye, String face,String nose, double money) {
    this.eye = eye;
    this.face = face;
    this.nose = nose;
    this.money = money;
}
    /**
     * 跑步
     */
    public void run() {
        System.out.println ("跑步速 度:11.8 秒/100 米!");
    }

    /**
     * 脾气
     */
    public void batTamper() {
        System.out.println ("脾气很好。");
    }

    //GET 、SET、toString
}

3.继承(源码)—爸爸类

爸爸类(源代码:com.chapter01.testclass.Father)

package com.chapter01.testclass;

/**
 * 爸爸
 */

public class Father extends GrandFather {

}

4.继承(源码)—孩子类

孩子类(源代码:com.chapter01.testclass.Child)

package com.chapter01.testclass;

/**
 * 孩子
 */
public class Child extends Father {
    //姓名
    private String name;
    //年龄
    private int age;
    
    //构造方法
    public Child(String name, int age) {
        this.name = name;
        this.age = age;
    }
//GET 、SET、toString
}

5.继承(源码)—调用孩子类

调用测试(源代码:com.chapter01.testclass.CallMain ):

package com.chapter01.testclass;

/**
 * 调用方法
 */
public class CallMain{
    /**
    * 调用
    * @param agrs
    */
    public static void main(String[] args) {
        //创建孩子类对象
        Child child = new Child ("晓东",12);
        //由于爸爸取了外国人,孩子眼睛是蓝色的(爷爷眼睛是深邃的)
        child.setEye ("蓝眼睛 ");
        //看看孩子名字、长相,其他方面都没变,基因强悍,继承父辈。
        System.out.println (child.toString ());
        //孩子完全继承了爷爷跑得快的行为。
        child.run ();
    }
}

运行结果:

Child{name='晓东', age=12 eye='蓝眼睛', face='国字脸', nose='大鼻子',money=8.88888888E8}
跑步速度:11.8 秒/100 米!
Process finished with exit code 0

总结:在爷爷类中具有的属性和方法,爸爸继承了爷爷的,孩子继承爸爸的,因此,重复的属性就不用再定义。

6.接口—改造爷爷、爸爸、孩子类描述

什么是接口?通过以上事例,我们知道爷爷、爸爸、孩子三个类中都具有共同的行为:吃饭、睡觉、跑步。其实,并不是爷爷、爸爸和他的小孩才有这样的行为,只要是人类,都具有这样的特性。因此,基于这样的抽象概念,我们可以再提高一层,将某一系列或者某一种类型的行为抽象到同一个地方。这个地方只关心行为的抽象,不关心属性抽象,称之为接口。

7.接口—人类、人类接口和爷爷、爸爸、孩子类关系图

如图所示

image.png

8.接口(源码)—“人类”接口定义

接口定义(源代码:com.chapter02.testinterface.PersonInterface ):

package com.chapter02.testinterface;

/**
* 人的接口,只关注行为
*/
public interface PersonInterface {
    //运动天赋行为——跑步
    void run();
    //个性气质行为——脾气
    void batTamper();
    //其他。。。
}

9.接口(源码)—“人类”类定义

人类,也单独定义成一个类(源代码com.chapter02.testinterface.PersonEntity ):

package com.chapter02.testinterface;

/**
 * 人
 */

public class PersonEntity{
    //身份号码
    private String idCard = "";
    //姓名
    private String name = "";
    //眼睛
    private String eye = "";
    //脸蛋
    private String face = "";
    //鼻子
    private String nose = "";
    
    /**
     * 无参构造
     */
    public PersonEntity() {

    }

    /**
    * 全参构造
    * @param idCard
    * @param name
    * @param eye
    * @param face
    * @param nose
    */

public PersonEntity(String idCard, String name, String eye, String face, String nose) {
        this.idCard = idCard;
        this.name = name;
        this.eye = eye;
        this.face = face;
        this.nose = nose;
    }
    //GET 、SET、toString
}

10. 接口(源码)—“爷爷”类继承“人类”实现“人类接口”

爷爷类继承“人”类,也拥有“人”类的属性、行为,具体的行为需要实现。

源代码:com.chapter02.testinterface.GrandFather :

package com.chapter02.testinterface;
/**
 * 爷爷
 */
public class GrandFather extends PersonEntity implements PersonInterface {
    /**
    * 跑步
    */
    @Override
    public void run() {
        System.out.println ("跑步速 度:11.8 秒/100 米!");
    }

    /**
     * 脾气
     */
    @Override
    public void batTamper() {
        System.out.println ("脾气很好。");
    }
}

实现接口的关键字是 implements ,可以实现多个接口。

11. 接口(源码)—“爸爸”类继承“爷爷”实现“人类接口”

爸爸类(源代码:com.chapter02.testinterface.GrandFather):

package com.chapter02.testinterface;

/**
 * 爸爸,继承爷爷类,同时有自己的具体实现行为
 */
public class Father extends GrandFather implements PersonInterface {
    @Override
    public void run() {
        System.out.println ("我跑步没我爷爷快:13.9 秒 /100 米!");
    }

    @Override
    public void batTamper() {
        System.out.println ("我的 脾气不太 好!");
    }
}

注意:虽然爸爸继承了爷爷,但是爸爸的行为方法被重写了(@Override),所以这里才是爸爸的具体行为,爷爷“传承”下来的行为没有了。

12. 接口(源码)—“孩子”类继承“爸爸”实现“人类接口”

孩子类(源代码:com.chapter02.testinterface.Child):

package com.testinterface;
/**
 * 孩子
 */
public class Child extends Father implements PersonInterface {
    //年龄
    private int age;
    
    //构造方法
    public Child(int age) {
        this.age = age;
    }

    @Override
    public void run() {
        System.out.println ("ChildAction==》run:我隔 代一 次:11.5 秒/100 米!");
        //调用父类方法
        System.out.println ("下面 是我爸爸跑的速 度 ==》");
        super.run ();
    }

    @Override
    public void batTamper() {
        System.out.println ("我跟我爸不易 ,我脾气随我妈 !");
    }
    //GET 、SET、toString
}

13. 接口(源码)—调用孩子类

调用类(源代码:com.chapter02.testinterface.CallMain):

package com.chapter02.testinterface;

/**
 * 调用方法
 */
public class CallMain {
    /**
     * 调用
     * @param agrs
     */
    public static void main(String[] args) {
        //创建孩子类对象
        Child child = new Child (23);
        child.setIdCard ("500234519981205112988");
        child.setName ("刘小翔 ");
        child.setEye ("眼睛 度数 5.2");
        child.setFace ("国字脸");
        child.setNose ("高鼻 子");
        //基本信息
        System.out.println ("刘小翔 基本 信息 ==>>"+child.toString ());
        //孩子跑的行为
        child.run ();
    }
}

运行结果:

刘小翔基本信息==>>人:{idCard='500234519981205112988', name='刘小翔', eye='眼睛度数 5.2', face='国字脸', nose='高鼻子'},孩子={age=23}
Child==》run:我隔代一次:11.5 秒/100 米!
下面是我爸爸跑的速度==》
我跑步没我爷爷快:13.9 秒/100 米!