接口
接口的概念
特殊的抽象类,接口中的非静态方法必须是抽象方法,不允许有实现内容(方法体)
没有构造方法,不能创建接口的对象,因为接口完全抽象
接口中的变量都是常量(默认被public static final修饰),只能被赋值一次
public interface Test {
public static final String name = "";//public static fina可以被省略
stati void test(){};//可以被static修饰,可以有方法体
void test1();//没有被static修饰的方法不能有方法体
String sex;//报错
}
接口与抽象类的区别
相同点:
- 可编译成字节码文件。
- 不能创建对象。
- 可以作为引用类型。
- 具备Object类中所定义的方法。
不同点:
- 所有属性都是公开静态常量,隐式使用public static final修饰。
- 所有方法都是公开抽象方法,隐式使用public abstract修饰。
- 没有构造方法、动态代码块、静态代码块。
接口的作用
因为类只能单继承,不能满足不同子类的需求
例如:
- 动物——父类(因为定义时无法被确定是什么动物,所以动物类为抽象类)
- 老鹰
- 麻雀
- 鱼
- 河马
- 老虎
在这些父类中,不同动物有不同的行为,飞行、游、两栖、奔跑
如果把这些行为都放在抽象类父类中,就会导致不会飞的老虎也要实现这个方法,所以就有了接口的存在,你需要实现什么方法就实现什么接口
接口实现多态
public interface Runnable{
//跑
void run();
}
public interface Swimable {
//游泳
void swim();
}
//动物类,抽象
public abstract class Animal {
public void eat() {
System.out.println("吃");
}
public void sleep() {
System.out.println("睡");
}
}
//狗类,实现接口中的方法,并重写父类的方法
public class Dog extends Animal implements Runnable,Swimable{
public void shout() {
System.out.println("狗狗开始叫...");
}
@Override
public void swim() {
System.out.println("狗狗游泳...");
}
@Override
public void run() {
System.out.println("狗狗跑步...");
}
@Override
public void sleep() {
System.out.println("狗狗睡觉...");
}
}
public class TestDog {
public static void main(String[] args) {
Dog wangcai=new Dog();
Animal a=wangcai;
Runnable runnable=wangcai;
Swimable swimable=wangcai;
//---------调用方法-----------
wangcai.shout();
a.eat();
a.sleep();
runnable.run();
swimable.swim();
}
}
接口回调
不了解,欢迎补充
接口好处
- 程序的耦合度降低。
- 更自然的使用多态。
- 设计与实现完全分离。
- 更容易搭建程序框架。
- 更容易更换具体实现。
练习题
交通工具
实现交通工具抽象类(定义2-3个方法,有抽象方法和实现方法)
实现2-3个接口(交通工具能力如:飞行,渡河等)
实现3-4个交通工具类(如:火车,飞机,自行车等等)
入口方法创建交通工具,实现几个业务场景(接收参数和返回值为多态)
定义交通工具抽象类
//定义交通工具抽象类
package com.fish.www.vehiclesnew;
//定义交通工具抽象类,抽象方法为行动方法,方法为正在使用
public abstract class VehicleNew {
String start;
String end;
int speed;
public VehicleNew(String start, String end,int speed) {
this.start = start;
this.end = end;
this.speed = speed;
}
public void route() {
System.out.println("路线:" + start + "--->" + end);
}
//每种交通工具被使用时都要被提示:XX正在被使用
public void use() {
System.out.println("正在使用交通工具!");
}
//todo 随机事件
// public abstract void randomEvents();
}
定义三个接口
//三个接口
package com.fish.www.vehiclesnew;
public interface CrossingTheRiver {
void crossing();//渡河
}
package com.fish.www.vehiclesnew;
public interface Flight {
void fly();//飞行
}
package com.fish.www.vehiclesnew;
public interface Travel {
void travel();//马路上行驶
}
使用者类
//使用者类
package com.fish.www.vehiclesnew;
import java.util.Random;
import java.util.Scanner;
public class People {
/**
* 人类
*/
String userName;
int age;
public People(String userName, int age) {
this.userName = userName;
this.age = age;
}
//形参为多态
public void ride(VehicleNew vehicle) {
System.out.println(userName + "出行的工具:");
vehicle.use();
}
//返回值为多态
public VehicleNew choseVehicles(int chose, String state, String end) {
Random random = new Random();
Scanner scanner = new Scanner(System.in);
VehicleNew vehicle;
if (chose == 1) {
System.out.println("请输入你的航班号:");
vehicle = new Aircraft(state, end, (random.nextInt(100) + 250), scanner.next());
} else if (chose == 2) {
System.out.println("请输入你乘坐轮船的层数:");
vehicle = new Ship(state, end, scanner.nextInt(), (random.nextInt(100) + 150));
} else {
System.out.println("请输入你车的颜色:");
vehicle = new Car(state, end, (random.nextInt(100) + 50), scanner.next(), "SUV");
}
return vehicle;
}
}
交通工具类——飞机
//飞机类
package com.fish.www.vehiclesnew;
public class Aircraft extends VehicleNew implements Flight {
String flight;//航班
public Aircraft(String start, String end, int speed,String flight) {
super(start, end, speed);
this.flight = flight;
}
@Override
public void fly() {
System.out.println("乘坐航班号为"+flight+"的飞机正在以" + speed + "km/h的速度飞。");
route();
}
@Override
public void use() {
System.out.println("使用飞机。");
fly();
}
}
交通工具类——汽车
//车类
package com.fish.www.vehiclesnew;
public class Car extends VehicleNew implements Travel{
String color;
String type;
public Car(String start, String end, int speed, String color,String type) {
super(start, end, speed);
this.color = color;
this.type = type;
}
@Override
public void travel() {
System.out.println("在高速上以"+speed+"km/h速度行驶的"+color+type);
route();
}
@Override
public void use() {
System.out.println("使用自驾车");
travel();
}
}
交通工具类——轮船
//船
package com.fish.www.vehiclesnew;
public class Ship extends VehicleNew implements CrossingTheRiver {
/**
*
*/
int numberOfLayers;
public Ship(String start, String end, int numberOfLayers, int speed) {
super(start, end, speed);
this.numberOfLayers = numberOfLayers;
}
@Override
public void crossing() {
System.out.println("乘坐" + numberOfLayers + "层的轮船,正以:"+speed+"km/h的速度行驶。");
route();
}
@Override
public void use() {
System.out.println("使用轮船。");
crossing();
}
}