抽象方法:
将共性的方法/行为抽取到父类之后,由于每一个子类执行的内容是不一样的,所以在父类中不能确定具体的方法体,该方法就可以定义为抽象方法。
格式:
抽象方法:public abstract 返回值类型 方法名(参数列表)
抽象类:
一个类中存在抽象方法,那么该类就必须声明为抽象类
格式:
抽象类:public abstract class 类名{}
注意事项:
- 抽象类不能创建对象
- 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
- 抽象类可以有构造方法
- 抽象类的子类 要么重写抽象类中的所有抽象方法,要么是抽象类(多采用前者)
接口:
1.用关键字interface来定义
public interface 接口名{}
2.接口不能实例化(不能创建对象)
3.接口和类之间是实现关系,通过implements关键字表示
public class 类名 implements 接口名{}
4.接口的子类(实现类)
要么重写接口中的所有抽象方法
要么是抽象类
注意:
1.接口和类的实现关系,可以单实现,也可以多实现
public class 类名 implements 接口名1,接口名2{}
2.实现类还可以在继承一个类的同时实现多个接口
public class 类名 extends 父类 implements 接口名1,接口名2{}
接口中成员的特点
1.成员变量
只能是常量
默认修饰符(没有写但存在):public static final
2.构造方法
没有。因为接口不能创建对象也不能赋值,,
3.成员方法
只能是抽象方法
默认修饰符:public abstract
JDK7以前:接口中只能定义抽象方法
接口和类之间的关系:
类和类的关系:
继承关系,只能单继承,不能多继承,但是可以多层继承
类和接口的关系:
实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口(一个实现类实现了两个接口,则要重写两个接口中的所有抽象方法。若其中有重名方法,重名的方法只用写一遍就可以了)
接口和接口的关系:
继承关系,可以单继承,也可以多继承(如果实现类实现了最下面的子接口,就需要重写所有的抽象方法,若inter3继承了inter1和inter2,实现类实现(implements)inter3,则实现类要重写inter1,2,3中所有的抽象方法)
接口和抽象类有以下区别:
-
定义方式:接口使用
interface
关键字进行定义,而抽象类使用abstract
关键字进行定义。 -
实现方式:一个类可以实现多个接口,但只能继承一个抽象类。
-
方法实现:接口中的方法都是抽象方法,没有方法体,而抽象类可以包含抽象方法和具体方法的实现。
-
构造函数:接口不能有构造函数,而抽象类可以有构造函数。
-
成员变量:接口中的成员变量默认是
public static final
类型的常量,而抽象类可以有各种类型的成员变量。 -
继承关系:一个类实现接口时,必须实现接口中的所有方法;而抽象类可以包含一些已经实现的方法,子类只需要实现抽象类中的抽象方法即可。
-
使用场景:接口用于定义一组相关的方法,用于实现多态性和解耦;抽象类用于定义一些通用的属性和方法,用于代码复用和继承。
下面是一个示例,展示了接口和抽象类的定义和使用:
// 定义接口
interface Animal {
void eat();
void sleep();
}
// 定义抽象类
abstract class Shape {
String color;
Shape(String color) {
this.color = color;
}
abstract double getArea();
void display() {
System.out.println("This is a " + color + " shape.");
}
}
// 实现接口
class Dog implements Animal {
@Override
public void eat() {
System.out.println("The dog is eating.");
}
@Override
public void sleep() {
System.out.println("The dog is sleeping.");
}
}
// 继承抽象类
class Circle extends Shape {
double radius;
Circle(String color, double radius) {
super(color);
this.radius = radius;
}
@Override
double getArea() {
return Math.PI * radius * radius;
}
}
// 使用接口和抽象类
public class Main {
public static void main(String[] args) {
Animal animal = new Dog();
animal.eat();
animal.sleep();
Shape shape = new Circle("red", 5.0);
shape.display();
System.out.println("Area: " + shape.getArea());
}
}
使用接口而不使用抽象类的情况
1. 需要实现多态
2. 要实现的方法(功能)不是当前类族的必要(属性).
3. 要为不同类族的多个类实现同样的方法(功能).