1.接口
在Java中,接口(interface)是一种抽象类型,用于定义类所具有的方法但不提供方法的实现。接口定义了一组方法的规范,而不关心这些方法如何实现。接口通常用于描述类应该具有的行为,而不是具体的实现细节。
总的来讲,接口就是一种规则,当需要给多个类同时定义规则时就需要用到接口。
2.接口和抽象类的异同
Java 中的接口(interface)和抽象类(abstract class)是两种实现多态的方式,它们有着一些相似之处,也有一些明显的区别:
相同之处:
-
都不能直接实例化: 接口和抽象类都不能直接被实例化,即不能通过
new
关键字来创建它们的对象。 -
都可以包含抽象方法: 接口和抽象类都可以包含抽象方法,这些方法在接口中是没有实现体的,而在抽象类中可以有实现体。
-
都支持多态: 通过接口和抽象类,可以实现对象的多态性,即一个对象可以表现出多种形态。
不同之处:
-
成员变量: 接口中只能包含常量(即
public static final
)类型的成员变量,而抽象类中可以包含各种类型的成员变量。 -
构造方法: 接口中不能包含构造方法,而抽象类中可以包含构造方法。
-
继承关系: 一个类只能继承一个抽象类,但可以实现多个接口。
-
方法实现: 在接口中,所有的方法都是抽象方法,没有方法体;而在抽象类中,可以包含抽象方法也可以包含具体方法的实现。
-
用途: 接口用于描述类所具有的方法而不涉及具体实现,通常用于实现类之间的契约;而抽象类通常用于创建子类的模板,提供一些通用的方法和字段,同时又可以定义一些子类必须实现的抽象方法。
总的来说,接口主要用于实现多重继承、定义类之间的契约和实现多态;而抽象类主要用于作为子类的模板,提供通用的方法和字段,并通过继承和覆写来实现多态。
3.接口的定义和使用
- 接口用关键字interface来定义:public interface 接口名{}
- 接口不能实例化
- 接口和类之间是实现关系,要通过implements关键字表示:
- public class 类名 implements 接口名 {}
- 接口的子类(实现类)
- 要么重写接口中的所有抽象方法
- 要么是抽象类
注意1:接口和类的实现关系,可以单实现,也可以多实现。
public class 类名 implements 接口1,接口2 {}
注意2:实现类还可以在继承一个类的同时实现多个接口。
public class 类名 extends 父类 implements 接口1,接口2 {}
4.练习:编写带有接口和抽象类的标准Javabean类
代码如下:
// Animal类
public abstract class Animal {
String name;
int age;
public Animal() {
}
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//定义抽象方法
public abstract void eat();
}
//游泳Swim接口
public interface Swim {
public abstract void swim();
}
// 兔子Rabbit类
public class Rabbit extends Animal{
public Rabbit() {
}
public Rabbit(String name,int age){
super(name,age);
}
@Override
public void eat(){
System.out.println(name+"在吃胡萝卜");
}
}
// 青蛙Frog类
public class Frog extends Animal implements Swim{
public Frog() {
}
public Frog(String name, int age) {
super(name, age);
}
@Override
public void eat(){
System.out.println(name+"在吃虫子");
}
@Override
public void swim(){
System.out.println(name+"会蛙泳");
}
}
// 狗Dog类
public class Dog extends Animal implements Swim{
public Dog() {
}
public Dog(String name, int age) {
super(name, age);
}
@Override
public void eat(){
System.out.println(name+"在吃骨头");
}
@Override
public void swim(){
System.out.println(name+"会狗刨");
}
}
// 测试类Text
public class Text {
public static void main(String []args){
// 创建青蛙的对象
Frog f = new Frog("小青",1);
System.out.println(f.getName()+","+f.getAge());
f.eat();
f.swim();
// 创建兔子的对象
Rabbit r = new Rabbit("小白",2);
System.out.println(r.getName()+","+r.getAge());
r.eat();
}
}