3.4Java语言的抽象类(Abstract)和接口(Interfaces)
目录
1.抽象类(Abstract Classes)
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,那么这样的类称为抽象类。抽象方法定义了子类必须实现的接口规范。
<abstract>class<class_name> {
<abstract><type><method_name>(parameter-iist);
}
- 通过
abstract
定义的方法是抽象方法,它只有定义,没有实现。 - 抽象类中不一定包含抽象方法,但是定义了抽象方法的class必须被定义为抽象类。
- abstract 关键字只能用于普通方法,不能用于 static 方法或者构造方法。
- abstract 关键字修饰抽象方法时不能使用 private 修饰,否则子类是无法重写的。
- 抽象类不能实例化,也就是不能使用 new 关键字创建对象,从抽象类继承的子类必须实现抽象方法。
1.1抽象类的继承
class Person {
public void run() { … }
}
class Student extends Person {
@Override
public void run() { … }
}
class Teacher extends Person {
@Override
public void run() { … }
}
2.接口(Interfaces)
抽象类是从多个类中抽象出来的模板,如果将这种抽象进行的更彻底(接口不能定义实例字段),则可以提炼出一种更加特殊的“抽象类”——接口(Interface)。接口的成员包括:类、字段、方法和接口。
interface interface_name {
// 接口体,其中可以包含定义常量和声明方法
[public] [static] [final] type constant_name = value; // 定义常量
[public] [abstract] returnType method_name(parameter_list); // 声明方法
}
2.1接口的种类
接口分为两种:普通接口(normal interfaces)和注解类型(annotation types)。
2.2接口修饰符
public protected private
abstract static strictfp
- public、protected、private:用于表示接口的访问权限。
- abstract:每个接口隐式地都是abstract的,这个修饰符目前已弃用。
- static:只能作用于成员接口,不能作用于顶层接口。
- strictfp:使所有接口中的
float
或double
表达式都严格遵守FP-strict的限制。
2.3字段修饰符
public
static final
- public:用于表示字段的访问权限。
- 接口中的变量会被隐式的指定为 public static final 变量。
2.4方法修饰符
public private
abstract default static strictfp
- public private:用于表示方法的访问权限。
- 接口中的方法会被隐式的指定为 public abstract。
- default:实现了该接口当时没有覆盖该方法的所有类提供了一种缺省实现。
- static:无需对具体对象的引用就可以被调用。
- strictfp:使所有在缺省方法体或static方法体中的
float
或double
表达式都严格遵守FP-strict的限制。
2.5接口继承
一个interface
可以继承自另一个interface
。interface
继承自interface
使用extends
,它相当于扩展了接口的方法。例如:
interface Hello {
void hello();
}
interface Person extends Hello {
void run();
String getName();
}
2.6接口的实现(implements
)
一个类只能继承自另一个类,不能从多个类继承。但是,一个类可以实现多个interface
。
class Student implements Person {
private String name;
public Student(String name) {
this.name = name;
}
@Override
public void run() {
System.out.println(this.name + " run");
}
@Override
public String getName() {
return this.name;
}
}
3.抽象类和接口区别
区别 | abstract class | interface |
---|---|---|
继承 | 只能extends一个class | 可以implements多个interface |
字段 | 可以定义实例字段 | 不能定义实例字段 |
抽象方法 | 可以定义抽象方法 | 可以定义抽象方法 |
非抽象方法 | 可以定义非抽象方法 | 可以定义default方法 |
原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/java/javabasic/2488.html