接口
1.接口的概念
-
接口:就是公共的行为规范标准,在实现时,只要符合规范标准,就可以通用。在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型。
-
比如:电源插座上,可以插电脑、冰箱、电视等所有符合规范的设备
2.接口的特性
2.1语法规则
- 使用interface关键字来修饰;
- 接口命名一般以大写字母 I(i) 开头;
- 接口中的抽象方法默认是public abstract;(public abstract是固定搭配,可以不写)
interface IShape{
public abstract void draw();
void draw();//抽象方法
}
2.2接口的特性
- 接口当中的成员变量默认是public static final 的;并且在定义时,必须先进行初始化;
interface IShape{
/*public int a;
public int b;*///报错,必须初始化
public static final int c=3;//2默认是public static final
int a=4;
}
- 接口中可以定义实现了的方法,要么被default修饰,要么被static修饰;
interface IShape{
default public void test(){
System.out.println("这就是一个默认的方法");
}
public static void test2(){
System.out.println();
}
}
- 接口不可以被实例化;
interface IShape{
public abstract void draw();
}
public class TestDemo {
//IShape iShape=new IShape() ;报错,不能实例化
}
- 类和接口的关系,可以通过implements来完成关系的建立。此时这个类就需要重写接口当中的所有的抽象方法;
interface IShape{
public abstract void draw();
}
class Cycle implements IShape{
@Override
public void draw() {//重写draw方法
System.out.println("画⭕");
}
}
- default方法是接口的默认方法;也可以在实现类当中重写接口的这个默认方法;(敲击方法名test回车,系统会自动生成重写的方法)
interface IShape{
default public void test(){
System.out.println("这就是一个默认的方法");
}
}
class Cycle implements IShape{//6
@Override
public void test() {//重写default方法
IShape.super.test();
}
}
- 一个类可以实现多个接口,使用逗号隔开。同时所有的接口当中的方法必须重新实现(除非是抽象类不用重写)
package demo3;
interface IA{
void test1();
}
interface IB{
void test2();
}
class CA implements IA,IB{//8
@Override
public void test1() {
}
@Override
public void test2() {
}
}
abstract class CA implements IA,IB{//抽象类
}
- 一个类可以继承一个抽象类/普通类,同时可以实现多个接口。但是,先要继承 然后实现接口,接口的实现放在最后;
package demo3;
interface IA{
void test1();
}
interface IB{
void test2();
}
interface IC{
void test3();
}
abstract class CA implements IA,IB{//8
public abstract void test();//CA自己的抽象方法
}
class CC extends CA implements IC{//9
@Override
public void test1() {
}
@Override
public void test2() {
}
@Override
public void test3() {
}
@Override
public void test() {
}
}
- 当一个接口使用extends拓展了其他的接口,此时当一个类实现了这个接口,需要重写的是所有的接口的方法;
package demo3;
interface IA{
void test1();
}
interface IB{
void test2();
}
interface IC{
void test3();
}
//ID这个接口,扩展了IA,IB,IC的功能
interface ID extends IA,IB,IC{//10
void test4();
}
class CID implements ID{//10
@Override
public void test1() {
}
@Override
public void test2() {
}
@Override
public void test3() {
}
@Override
public void test4() {
}
}
3.实现多个接口
Java中一个类只能继承一个类,不能实现多继承,但是一个类可以实现多个接口。
下列代码中,跑和游泳方法不能放在父类中,因为不是所有的动物都会跑或者都会游泳(鱼不会跑,但是狗和猫可以跑,狗和鱼都能游泳);
package demo1;
import com.sun.xml.internal.ws.api.ha.StickyFeature;
class Animal{
public String name;
public Animal(String name){//构造方法
this.name=name;
}
}
class Dog extends Animal{
public Dog(String name) {
super(name);
}
public void Running(){
System.out.println(this.name+"正在跑");
}
public void swimming(){
System.out.println(this.name+"正在游泳");
}
}
class Cat extends Animal{
public Cat(String name) {
super(name);
}
public void Running(){
System.out.println(this.name+"正在跑");
}
}
class Fish extends Animal{
public Fish(String name){
super(name);
}
public void swimming(){
System.out.println(this.name+"正在游泳");
}
}
public class testDemo {
public static void main(String[] args) {
}
}
那么如何来实现多个接口,改写上述代码?
- 添加一组接口,分别表示“跑”和“游泳”;
interface IRunning{
void Running();
}
interface ISwimming{
void Swimming();
}
- 狗类继承动物类,再实现“跑”和“游泳”两个接口;其他两个类似。
- 注意:当一个类实现多个接口的时候,每个接口中的抽象方法都要实现。
class Dog extends Animal implements IRunning,ISwimming{
public Dog(String name) {
super(name);
}
@Override
public void Running(){
System.out.println(this.name+"正在跑");
}
@Override
public void Swimming(){
System.out.println(this.name+"正在游泳");
}
}
class Cat extends Animal implements IRunning{
public Cat(String name) {
super(name);
}
@Override
public void Running(){
System.out.println(this.name+"正在跑");
}
}
class Fish extends Animal implements ISwimming{
public Fish(String name){
super(name);
}
@Override
public void Swimming(){
System.out.println(this.name+"正在游泳");
}
}
- 如何来打印, 实现一个walk方法。(下列代码中注释掉的也可以用来打印)
public class testDemo {
//只要实现了该接口的类,都可以传入
public static void walk(IRunning iRunning){
iRunning.Running();
}
public static void main(String[] args) {
/* walk(new Dog("豆豆"));
walk(new Cat("小小"));*/
Dog dog=new Dog("豆豆");
walk(dog);
Cat cat=new Cat("小小");
walk(cat);
}
}