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:使所有接口中的floatdouble 表达式都严格遵守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方法体中的floatdouble 表达式都严格遵守FP-strict的限制。

2.5接口继承

一个interface可以继承自另一个interfaceinterface继承自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 classinterface
继承只能extends一个class可以implements多个interface
字段可以定义实例字段不能定义实例字段
抽象方法可以定义抽象方法可以定义抽象方法
非抽象方法可以定义非抽象方法可以定义default方法

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/java/javabasic/2488.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注