文章目录
接口
1. 什么是接口 ?
- 接口并不是类,但是可以把它看做 抽象类 的延伸,是一个纯粹的抽象类。
- 接口属于一个规范,一旦定义不要轻易改动。
- 电脑各种各样的接口 。
- java不允许,类多继承, 所以如果要实现多个类的功能,则可以通过实现多个接口.
class Fu{
eat(){}
}
class Fu2{
drink(){}
}
// 想使用 eat(); 和 drink();
class ziimpl extends Fu?Fu2{ // 两个方法能同时继承2个么!? 答案是不能的!
}
2.语法定义
- 定义接口的方式和类一样,关键字
interface
;
interface 接口名 {
// 主体代码
code...
}
2.1 接口的特点
- 类的定义是
class
,接口的定义interface
。 - 类是继承
extends
,接口是实现implement
。 - 接口无法被实例化。只能由子类去实现。
- 类和接口之间是可以多实现。 接口和接口之间可以多继承。
- 接口中的方法都是抽象方法。关键字
abstract
修饰,且所有权限都是public
- 在Java8新特性之后,default 默认方法。
interface Computer{
//1.接口中的方法都是抽象方法,其中权限都是public,可以省略不写
abstract public void playGame(); //用abstract修饰
public void music();// 也可以省略 关键字 abstract
//2.在1.8 之后,有默认方法default,相当于普通方法
default void video(){
System.out.println("看视频");
}
}
2.2 接口中方法的使用
- 实现接口的,关键字
implement
。实现类,必须重写接口中的抽象方法。default
默认的方法可以,不用重写。
public class Interface_Test {
public static void main(String[] args) {
Computer c = new NoteBook();
c.playGame();
c.music();
c.video();//调用接口中普通方法。
}
}
/*定义笔记本
*/
class NoteBook implements Computer{
/*实现接口必须重写抽象方法,如果不想重写,
实现类就变成抽象类即可。
*/
@Override
public void playGame() {
System.out.println("玩Cs");
}
@Override
public void music() {
System.out.println("听周杰伦音乐");
}
}
interface Computer{
//1.接口中的方法都是抽象方法,其中权限都是public,可以省略不写
abstract public void playGame(); //用abstract修饰
public void music();// 也可以省略 关键字 abstract
//2.在1.8 之后,有默认方法default
default void video(){
System.out.println("基本功能,看视频");
}
}
3. 接口的用法
3.1 成员变量
- 接口中变量修饰 默认
public static final
- 啥意思 ?因为有
final
修饰,所以,接口中 只有常量 没有变量 。
- 啥意思 ?因为有
public class Interface_Test2 {
public static void main(String[] args) {
Computer2 c2 = new NoteBook2();
//虽然没有修饰,但是接口中成员变量就是常量。所以无法改变
// c2.MAIN=2; //Cannot assign a value to final variable 'MAIN'
}
}
/*定义笔记本
*/
class NoteBook2 implements Computer2{
}
interface Computer2{
//1.接口中修饰的成员变量为常量
// 关键字 public static final
public static final int CPU_NUM=1; //cpu个数
// 修饰的关键字也可以省略不写,但也是常量
int MAIN_BOARD=1;//主板数量
}
3.2 构造方法
-
构造方法,两个比较重要的作用
- “给成员变量初始化值” 和 “创建对象”;
public class Interface_Test2 { public static void main(String[] args) { Computer2 c2 = new NoteBook2(); //想使用子类的属性就需要向下转型 NoteBook2 noteBook2 = (NoteBook2) c2; noteBook2.name="Thinkpad"; System.out.println(noteBook2.name); } } /*定义笔记本 */ class NoteBook2 implements Computer2 { String name;//名称 public NoteBook2() { super();//这是调用谁的父类的构造方法? System.out.println("我是子类构造方法"); } } interface Computer2 { //1.接口中到底有没有构造方法创建一个即可。 //public Computer2(){} //就不允许 }
-
输出结果:
我是子类构造方法 Thinkpad
- 思考一个问题: 说一说,你自己理解的, 为什么接口中没有构造方法!?
4. 课堂案例–面向接口编程
4.1 设计交通工具
- 车的最基本两个功能: 启动,和 停止。
- 跟据车的动力来划分: 有人力,汽油,电。
- 所以问题产生了
- 例如:按照两轮车为: ,你给它 汽油 就是摩托车,你给它电,就是电动车,如果只有人力,就是自行车。
- 思考: 我能不能调用一个方法,传递不同的车,就告诉我它的启动,停止,是什么!?
public class JiaoTongToolsDemo {
public static void main(String[] args) {
//测试一下摩托车
MotorCycle m = new MotorCycle();
m.setName("摩托车");
System.out.println(m.getName());
m.go();
m.stop();
m.oil();
//测试一下新国标电动车
Bike b = new Bike ();
b.setName("电动自行车");
System.out.println(b.getName());
b.go();
b.power();
b.electric();
b.stop();
}
}
/**
* 定义车为抽象类
*/
abstract class Che{
private String name; //车的名字
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//启动
abstract public void go();
//停止
abstract public void stop();
}
//定义动力接口
interface Power1{
void oil();
}
interface Power2{
void electric();
}
interface Power3{
void power();
}
/**
* 后期有新加装的功能,设计成动作接口,这样谁来都可以使用!
*/
interface rings{
void sound();
}
/**
* 摩托车
*/
class MotorCycle extends Che implements Power1{
@Override
public void oil() {
System.out.println("加92汽油");
}
@Override
public void go() {
System.out.println("一键启动");
}
@Override
public void stop() {
System.out.println("手刹");
}
}
/**
* 2021年10月1日 新国标开始 需要电动自行车加脚蹬子。
*/
class Bike extends Che implements Power2,Power3{
@Override
public void electric() {
System.out.println("我可以充电跑");
}
@Override
public void power() {
System.out.println("我可以用脚蹬");
}
@Override
public void go() {
System.out.println("脚蹬和一键启动");
}
@Override
public void stop() {
System.out.println("手刹,脚刹");
}
}
输出结果:
摩托车
一键启动
手刹
加92汽油
电动自行车
脚蹬和一键启动
我可以用脚蹬
我可以充电跑
手刹,脚刹
5. 知识点扩展
5.1 接口和类的关系
- 类与类:继承关系,一个类只能继承一个父类,支持多重继承
class A ; class A extends B{} ; class B extends C{}
- 类和接口:只有实现关系,一个类可以实现多个接口。
class A implement B,C,D{}
- 接口和接口: 只有继承关系,一个接口可以继承多个接口。
interface A extends B ,C ,D{}
5.2 面试题:接口和抽象类的区别
- 定义关键字:
- 接口定义类型
interface
- 抽象类定义类型
class
- 接口定义类型
- 成员变量:
- 接口中默认修饰
public static final
就是常量; - 抽象类中,可以有成员变量,也可以有常量。
- 接口中默认修饰
- 方法:
- 接口中的方法都是抽象方法 {jdk 8之后,有默认方法
default
修饰。也有静态方法(静态方法必须有方法体)} - 抽象类中没有限制。
- 接口中的方法都是抽象方法 {jdk 8之后,有默认方法
- 构造方法:
- 接口中没有构造方法; 不可以实例化。
- 抽象类中有构造方法(用于子类实例化使用);不可以实例化。
- 设计思想:
- 抽象类,这个对象是什么?(强调对象本身)
- 接口,这个能干什么 (强调动作)。
5.3 老吴浅谈:什么时候用接口?什么时候用抽象类?
- 首先二者都是设计思想,都是不可以被实例化,且都属于 “抽象层面” 。
- 抽象类更倾向于说明对象的本质,具有相同的属性和行为,如人类,动物类,一系列。
- 而接口更偏向于动作规范 ,如:USB接口, 删除,增加,修改,查询等。
- 如果设计时,包含的公共代码很多,关系比较密切,可以优先考虑抽象类。如果要考虑后期代码的扩展性和维护性时,可以优先考虑使用接口。
- 举一个例子:
- 对于接口来说: 水中鲨鱼,后来发现海参可以吃,男足也吃海参,就可以把 “吃海参” 设计成一个接口。便于扩展。最后狗也可以吃海参,直接实现就可以! 三个对象没有任何联系,只是有吃海参这样的事情。
- 对于抽象类而言: 谷爱凌喜欢吃馅饼,中国女足喜欢吃面条,可以抽取共同 属性和行为 形成抽象类,二者联系紧密,都是中国人,都喜欢吃中国美食,都为国家争光。
- 原则:如果要设计小而简练的功能块,则使用接口。如果要设计大的功能单元,则使用抽象类。