提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 概念与语法规则
- 使用
- 特性
- 实现多个接口
- 接口间的继承
- 抽象类和接口的区别
一.概念与语法规则
在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型。
语法规则:
接口的定义格式与定义类的格式基本相同,将class关键字换成 interface 关键字,就定义了一个接口。
提示
:
1.
创建接口时
,
接口的命名一般以大写字母
I
开头
.
2.
接口的命名一般使用
"
形容词
"
词性的单词
.
3.
阿里编码规范中约定
,
接口中的方法和属性不要加任何修饰符号
,
保持代码的简洁性
.
二.接口的使用
注意:
子类和父类之间是
extends
继承关系,类与接口之间是
implements
实现关系。
请实现笔记本电脑使用
USB
鼠标、
USB
键盘的例子
1. USB
接口:包含打开设备、关闭设备功能
2.
笔记本类:包含开机功能、关机功能、使用
USB
设备功能
3.
鼠标类:实现
USB
接口,并具备点击功能
4.
键盘类:实现
USB
接口,并具备输入功能
|
package dean1; interface USB{//接口 void openDevice();//对此进行重写 void closeDevice(); } class Mouse implements USB{//鼠标类 @Override public void openDevice() { System.out.println("打开鼠标"); } @Override public void closeDevice() { System.out.println("关闭鼠标"); } public void click(){ System.out.println("鼠标点击"); } } class KeyBoard implements USB{//键盘类 @Override public void openDevice() { System.out.println("打开键盘"); } @Override public void closeDevice() { System.out.println("关闭键盘"); } public void inPut(){ System.out.println("键盘输入"); } } class Computer{// 笔记本类:使用USB设备 public void powerOn(){ System.out.println("打开笔记本电脑"); } public void powerOff(){ System.out.println("关闭笔记本电脑"); } public void useDevice(USB usb){ usb.openDevice(); if(usb instanceof Mouse){ Mouse mouse=(Mouse) usb;//向下转型 mouse.click(); } else if(usb instanceof KeyBoard){ KeyBoard key=(KeyBoard) usb; key.inPut(); } usb.closeDevice(); } } public class Teat{//测试类 public static void main(String[] args) { Computer c=new Computer(); c.powerOn(); c.useDevice(new Mouse()); c.useDevice(new KeyBoard()); c.powerOff(); } }
四.特性
1.
接口类型是一种引用类型,但是不能直接
new
接口的对象 (无法实例化接口)
2.
2.
接口中
每一个方法
都是
public
的
抽象方法
,
即接口中的方法会被隐式的指定为
public abstract
(只能是 public abstract,
其他修饰符都会报错
)
3.
接口中的方法是不能在接口中实现的,只能由实现接口的类来实现
4.
重写接口中方法时,不能使用默认的访问权限
5.
接口中可以含有变量,但是接口中的变量会被隐式的指定为
public static final
变量
public interface
USB
{
double
brand
=
3.0
;
//
默认被:
final public static
修饰
void
openDevice
();
void
closeDevice
();
}
public class
TestUSB
{
public static
void
main
(
String
[]
args
) {
System
.
out
.
println
(
USB
.
brand
);
//
可以直接通过接口名访问,说明是静态的
//
编译报错:
Error:(12, 12) java:
无法为最终变量
brand
分配值
USB
.
brand
=
2.0
;
//
说明
brand
具有
final
属性
}
}
}
6.
接口中不能有静态代码块和构造方法
7.
接口虽然不是类,但是接口编译完成后字节码文件的后缀格式也是
.class
8.
如果类没有实现接口中的所有的抽象方法,则类必须设置为抽象类
9. jdk8
中:接口中还可以包含
default
方法。
五.实现多个接口
Java
中不支持多继承
,但是
一个类可以实现多个接
口
package dean1; class Animal{ public String name; public Animal(String name){ this.name=name; } } interface IRunning{ void run(); } interface ISwimming{ void swimming(); } class Cat extends Animal implements IRunning{ @Override public void run() { System.out.println(this.name+"正在跑"); } public Cat(String name){ super(name); } } class Dog extends Animal implements IRunning,ISwimming{ public Dog(String name){ super(name); } @Override public void run() { System.out.println(this.name+"正在跑"); } @Override public void swimming() { System.out.println(this.name+"正在游泳"); } } public class Teat{ public static void show(IRunning r){ r.run(); } public static void f1(ISwimming s){ s.swimming(); } public static void main(String[] args) { Cat cat=new Cat("小猫"); show(cat); Dog dog=new Dog("小狗"); f1(dog); show(dog); } }
上面的代码展示了
Java
面向对象编程中最常见的用法
:
一个类继承一个父类
,
同时实现多种接口
.
六.接口间的继承
接口间的继承相当于把多个接口合并在一起
.
interface
IRunning
{
void
run
();
}
interface
ISwimming
{
void
swim
();
}
//
两栖的动物
,
既能跑
,
也能游
interface
IAmphibious
extends
IRunning
,
ISwimming
{
}
class
Frog
implements
IAmphibious
{
...
}
七.抽象类和接口的区别
核心区别
:
抽象类
中可以包含普通方法和普通字段
,
这样的普通方法和字段可以被子类直接使用
(
不必重写
),
而
接口
中 不能包含普通方法,
子类必须重写所有的抽象方法
.
如之前写的
Animal
例子
.
此处的
Animal
中包含一个
name
这样的属性
,
这个属性在任何子类中都是存在的
.
因此此 处的 Animal
只能作为一个抽象类
,
而不应该成为一个接口
.
再次提醒
:
抽象类存在的意义是为了让编译器更好的校验
,
像
Animal
这样的类我们并不会直接使用
,
而是使用它的子类
.
万一不小心创建了
Animal
的实例
,
编译器会及时提醒我们
.