77-接口的使用
Java只支持单重继承,不支持多继承,即一个类只能有一个父类。为了实现类似多继承的效果,Java提供接口来实现。
- Java中一个类不能继承多个具体class。
- 一个类只可继承自一个具体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)