继承、接口
1.继承—示例描述
孩子拥有和父亲一样的长相、气质、脾气等,是父亲遗传下来的,同样父亲的脾气、长相像爷爷,也是遗传下来。
在 Java 中我们将孩子、父亲、爷爷的这种遗传关系用从下往上的建立关系,称之为继承关系。如图下图所示
用 Java 实现以上代码,结构关系如下:
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.接口—人类、人类接口和爷爷、爸爸、孩子类关系图
如图所示
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 米!