接口
接口是功能的集合,可以看作一个引用类型,它是比抽象类更加抽象的"类"
接口只描述所应该具有的方法,并没有具体的实现;具体的实现让接口的实现类去完成。
这样的好处是:让功能的声明和具体实现相分离,优化了程序的设计。
请记住:一切事物均有功能,即一切事物均匀接口。
接口的概述
格式
public interface 接口名{
抽象方法;
抽象方法;
}
与定义类有所不同,类是用class,而接口用interface关键字,但是所有的接口依然是.java文件,经过编译后还好生成.class文件。所有可以把接口看作一个特殊的Java类
注意
接口中所有的方法都是抽象方法,用public修饰或者默认不写修饰符
接口中无法定义普通的成员变量
接口中定义变量,有固定的写法:public static final 大写名称 ,其值是不能改变的
接口是不能直接创建对象的
接口定义好之后,让子类去实现,用关键字implements
实现接口的格式
public class Child implements 接口1,接口2,接口3{
重写接口1、2、3里面所有方法
}
案例演示
package com.hcj.inter;
/**
* A
*
* @author hcj
* @date 2022-07-11
*/
public interface A {
// 固定格式的成员变量
public static final String A_B = "固定";
// 抽象方法
void methodA1();
void methodA2();
}
package com.hcj.inter;
/**
* B
*
* @author hcj
* @date 2022-07-11
*/
public interface B {
void methodB1();
void methodB2();
}
(1) 类实现接口可以多实现,接口之间用逗号 , 隔开
package com.hcj.inter;
/**
* AImpl
*
* @author hcj
* @date 2022-07-11
*/
public class AImpl implements A,B{
@Override
public void methodA1() {
}
@Override
public void methodA2() {
}
@Override
public void methodB1() {
}
@Override
public void methodB2() {
}
}
(2) 接口是可以继承接口用关键字 extends,接口可以多继承,接口之间用逗号 , 隔开
public interface C extends A,B{}
(3) 类可以继承类,也可以同时实现接口。注意要先继承后实现(单继承多实现)
public class BImpl extends Person implements A,B{
@Override
public void methodA1() {
}
@Override
public void methodA2() {
}
@Override
public void methodB1() {
}
@Override
public void methodB2() {
}
}
接口的定义
格式
public interface 接口名{
抽象方法;
抽象方法;
}
与定义类有所不同,类是用class,而接口用interface关键字,但是所有的接口依然是.java文件,经过编译后还好生成.class文件。所有可以把接口看作一个特殊的Java类
注意:接口中所有的方法都是抽象方法,用public修饰或者默认不写修饰符
接口中无法定义普通的成员变量
接口中定义变量,有固定的写法:public static final 大写
名称 ,其值是不能改变的
接口是不能直接创建对象的
接口定义好之后,让子类去实现,用关键字implements
实现接口的格式
public class Child implements 接口1,接口2,接口3{
重写接口1、2、3里面所有方法
}
案例演示
package com.hcj.inter;
/**
* A
*
* @author hcj
* @date 2022-07-11
*/
public interface A {
// 固定格式的成员变量
public static final String A_B = "固定";
// 抽象方法
void methodA1();
void methodA2();
}
package com.hcj.inter;
/**
* B
*
* @author hcj
* @date 2022-07-11
*/
public interface B {
void methodB1();
void methodB2();
}
(1) 类实现接口可以多实现,接口之间用逗号 , 隔开
package com.hcj.inter;
/**
* AImpl
*
* @author hcj
* @date 2022-07-11
*/
public class AImpl implements A,B{
@Override
public void methodA1() {
}
@Override
public void methodA2() {
}
@Override
public void methodB1() {
}
@Override
public void methodB2() {
}
}
(2) 接口是可以继承接口用关键字 extends,接口可以多继承,接口之间用逗号 , 隔开
public interface C extends A,B{}
(3) 类可以继承类,也可以同时实现接口。注意要先继承后实现(单继承多实现)
public class BImpl extends Person implements A,B{
@Override
public void methodA1() {
}
@Override
public void methodA2() {
}
@Override
public void methodB1() {
}
@Override
public void methodB2() {
}
}
接口的特点
(1)接口是多继承
(2)接口与父类的功能可以重复,均代表要具备的某种功能,并不冲突
public class Fu {
public void method(){
System.out.println("Fu");
}
}
public interface D {
public void method();
}
public class Zi extends Fu implements D{
// 此时有两个method() 如果不去重写接口D的method(),会
使用Fu中的method()
}
public static void main(String[] args) {
Zi z = new Zi();
z.method();
}
public class Zi extends Fu implements D{
// 如果重写method() 这时会同时重写Fu中method()和接口D
中的method()
@Override
public void method() {
System.out.println("重写method");
}
}
public static void main(String[] args) {
Zi z = new Zi();
z.method();
}
(3)类可以实现多个接口
(4)类可以继承类,紧接着可以实现多个接口,但是不能先实现接口后继承类
public class BImpl extends Person implements A,B{}
面试题:接口和抽象类有什么区别?
先去解释一下类和接口的定义
(1)从继承关系
类继承类用extends,只能单继承接口继承接口用extends,可以多继承类实现接口用implements,可以多实现接口不能继承类
(2)从方法
抽象类可以有抽象方法,也可以有非抽象方法接口中的方法必须都是抽象方法
(3)从成员变量
抽象类有成员变量,接口没有普通的成员变量,只有public static final 常量
(4)从修饰符
抽象类声明方法和类要加上abstract关键字,成员变量可以无固定的修饰符接口里abstract关键字可以省略不写,用固定的修饰符去定义成员变量