首页 > 技术文章 > 抽象类和接口

jingRegina 2019-10-08 16:09 原文

转载:https://blog.csdn.net/qq_37766026/article/details/90702387

 https://www.jianshu.com/p/93d701282bd9

一、抽象类

在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就可以称之为抽象类。

1.抽象方法:使用abstract修饰且没有方法体的方法。

特点:

① 抽象方法没有方法体,交给子类实现

② 抽象方法修饰符不能是private final static(如果是private则子类无法访问,final则子类无法继承,static是类就可以使用,但抽象方法是在子类实现后才可用)

③ 抽象方法必须定义在抽象类或者接口中

2.抽象类:包含抽象方法的类,即使用abstract修饰的类。

特点:

① 抽象类不能被实例化,只能被继承

② 抽象类中可以不包含抽象方法(不包含抽象方法就没有太大意义,可以作为工具类防止被实例化)

③ 抽象类的子类可以不实现该类所有的抽象方法,但也必须作为抽象类(抽象派生类)

④ 抽象类的构造方法不能定义成私有(子类构造方法会调用父类构造方法)

⑤ 抽象类不能使用final修饰,final修饰的类不能被继承

public class Test3 {
    public static void main(String[] args) {
        Gun gun = new Gun("机关枪");
        Grenade grenade = new Grenade("手榴弹");
        gun.attack();
        grenade.attack();
        gun.how2Attack();
        grenade.how2Attack();
    }
}
 
abstract class Weapon{
    String name;
    public void attack(){
        System.out.println(name+"具有攻击行为");
    }
 
    abstract void how2Attack();
 
}
class Gun extends Weapon{
    public Gun(String name) {
        this.name = name;
    }
 
    @Override
    void how2Attack() {
        System.out.println(name+"射击敌人");
    }
}
class Grenade extends Weapon{
    public Grenade(String name){
        this.name = name;
    }
    @Override
    void how2Attack() {
        System.out.println(name+"丢向敌人");
    }
}
View Code

二 、Java中的接口:在JAVA编程语言中是接口一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。

特点:

① 接口中没有构造器,不能被实例化

② 接口只能继承接口,不能继承类,接口支持多继承

③ 接口中的定义的成员变量,默认是public static final修饰的静态常量

④ 接口中定义的方法,默认是public abstract修饰的抽象方法

⑤ 接口中定义的内部类,默认是public static修饰的静态内部类

(1)Java中抽象类和接口中有构造方法吗?

①在接口中 不可以有构造方法

在接口里写入构造方法时,编译器提示:Interfaces cannot have constructors。

A. 构造方法用于初始化成员变量,但是接口成员变量是常量,无需修改。接口是一种规范,被调用时,主要关注的是里边的方法,而方法是不需要初始化的,

B. 类可以实现多个接口,若多个接口都有自己的构造器,则不好决定构造器链的调用次序

C. 构造器是属于类自己的,不能继承。因为是纯虚的,接口不需要构造器。

抽象类中不一定有抽象方法,抽象方法一定存在于抽象类中。

继承抽象类的可以是普通类,但必须重写抽象类中的所有抽象方法,也可以是抽象类,无需重写抽象类中的所有抽象方法。

 

推荐阅读