接口

77-接口的使用

Java只支持单重继承,不支持多继承,即一个类只能有一个父类。为了实现类似多继承的效果,Java提供接口来实现。

  1. Java中一个类不能继承多个具体class。
  2. 一个类只可继承自一个具体class,但可实现多个接口。

接口的定义

使用interface关键字,和类定义类似。继承父类接口使用extends关键字。

public interface ICalculate {
	final float PI = 3.1415926f;
	float getArea(float r);
	float getCircum(float r);
	float getCube(float r);
}Code language: PHP (php)

78-接口的实现和@Override

定义了接口后,就可以在类中实现这个接口。因为接口的方法是没有方法体的,具体怎么实现这些方法体的操作由实现类来完成。

类实现接口用implements关键字,类继承类用extends。

package cn.bamn;

public class BamnCalculate implements ICalculate {

	public float getArea(float r) {
		// TODO Auto-generated method stub
		return 100;
	}

	@Override
	public float getCircum(float r) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public float getCube(float r) {
		// TODO Auto-generated method stub
		return 0;
	}
}Code language: PHP (php)

接口在多态中的使用

BamnCalculate bc = new BamnCalculate();
System.out.println(bc.getArea(10.1f));

Baidu bd = new Baidu();
System.out.println(bd.getArea(10.1f));

//接口作为方法参数,实现多态
ShowArea(new BamnCalculate());
ShowArea(new Baidu());

public static void ShowArea(ICalculate ic) {
	System.out.println(ic.getArea(10.1f));
}Code language: JavaScript (javascript)

79-练习-发动机接口

汽车的发动机是汽车的心脏,提供动力。开发一个发动机接口,允许不同的厂家生产不同的发动机:

  • 比亚迪电动发动机
  • 本田汽油发动机
  • 三菱柴油发动机

模拟实现一个接口,三个类去实现:

// 发动机接口
interface IEngine {
	void start();      //启动
	void run();        //运行
	void stop();       //停止
}

// 比亚迪电动发动机
class BYDEngine implements IEngine {
	public void start() {
		System.out.println("比亚迪电动机启动:电池供电");
	}
	public void run() {
		System.out.println("比亚迪电动机运行:安静高效");
	}
	public void stop() {
		System.out.println("比亚迪电动机停止:断电");
	}
}

// 本田汽油发动机
class HondaEngine implements IEngine {
	public void start() {
		System.out.println("本田汽油机启动:点火启动");
	}
	public void run() {
		System.out.println("本田汽油机运行:燃油燃烧");
	}
	public void stop() {
		System.out.println("本田汽油机停止:熄火");
	}
}

// 三菱柴油发动机
class MitsubishiEngine implements IEngine {
	public void start() {
		System.out.println("三菱柴油机启动:压燃启动");
	}
	public void run() {
		System.out.println("三菱柴油机运行:柴油压燃");
	}
	public void stop() {
		System.out.println("三菱柴油机停止:断油");
	}
}Code language: PHP (php)

80-类的继承

继承顾名思义是从某一个东西那里获得了它拥有的东西。在Java中继承使用extends关键字,Java只能单继承。

示例

一个动物类有run方法,一个鸟类继承了动物类,鸟类有自己的方法。

继承中的重写

重写是子类从父类继承过来的方法,子类希望不使用父类的方法,想重新改写加入自己的逻辑,这个时候就可以使用重写,也称为覆盖。

比如父类中有一个Talk方法,添加一个Cat类和一个Dog类继承Animal类,分别重写它们的Talk方法。

class Animal {
	public void run() {
		System.out.println("动物在跑");
	}

	public void talk() {
		System.out.println("动物在叫");
	}
}

class Bird extends Animal {
	@Override
	public void run() {
		System.out.println("鸟儿在飞");
	}
}

class Cat extends Animal {
	@Override
	public void talk() {
		System.out.println("猫在喵喵叫");
	}
}

class Dog extends Animal {
	@Override
	public void talk() {
		System.out.println("狗在汪汪叫");
	}
}Code language: JavaScript (javascript)

注意:子类重写的方法修饰符访问权限不能比父类小;不能重写父类的private方法;能够重写的前提是子类可以访问父类的方法。


81-super的使用

子类可以继承父类的非private成员(包括变量和方法)。但是:

  • 如果子类声明的成员变量和父类的成员变量同名,子类不能继承父类的同名成员变量。访问子类对象的该变量时,访问的是子类的。
  • 如果子类声明的成员方法和父类的方法在返回值、方法名、参数个数、参数类型、参数顺序上一模一样(除了方法体),子类方法会覆盖父类方法。

想要访问父类的成员,可以在子类中使用super关键字:

  • 在子类构造函数中调用父类构造函数:super();
  • 调用父类的成员方法和成员变量
class Bird extends Animal {
	Bird() {
		super();      //调用父类的构造函数
	}

	public void test() {
		talk();        //调用自己重写的talk
		super.talk();  //调用父类被覆盖的talk
		super.run();   //调用父类继承过来的run
	}
}Code language: JavaScript (javascript)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注