A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 逆风TO 黑马粉丝团   /  2020-2-12 16:57  /  1059 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Java 中的抽象类和接口
抽象类与接口是 Java 语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予了 Java 强大的面向对象能力。他们两者之间对抽象概念的支持有很大的相似,甚至可以互换,但是也存在区别。

抽象类
在面向对象编程的世界里面,一切都是对象,同时所有的对象都是通过类来描述的,但是并不是所有的类都是用来描述对象的。如果一个类没有足够的信息来描述一个具体对象,而是需要其他类来支撑的话,那么这样的类就称为抽象类。 比如,new Animal(),我们知道这个产生了一个动物对象,但是这是具体的什么动物是无法表达的,所以它是一个抽象类。

在面向对象领域中,由于抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类不能实例化。

同时,抽象类体现了数据抽象的思想,是实现多态的一种机制。它定义了一组抽象的方法,至于这组抽象方法的具体表现形式由具体的派生类来实现。同时,抽象类提供了继承的概念,它的出发点就是为了继承,否则它没有存在的任何意义。所以说定义的抽象类一定是用来继承的,同时在一个以抽象类为节点的继承关系中,叶子节点一定是具体的实现类。

示例:定义一个抽象动物类 Animal,提供抽象方法 cry ,猫、狗都是动物的子类,由于 cry 为抽象方法,所以子类必须要实现这个方法。

抽象类 Animal

public abstract class Animal {
    public abstract void cry();
}

子类 Cat

public class Cat extends Animal {
    @Override
    public void cry() {
        System.out.println("miao~");
    }
}

子类 Dog

public class Dog extends Animal {
    @Override
    public void cry() {
        System.out.println("wow~");
    }
}

子类一旦继承抽象类,必须实现抽象类中的所有抽象方法(抽象类中的方法不一定都是抽象方法)。

在使用抽象类时需要注意的点:

抽象类不能实例化,实例化的工作应该交由它的子类来完成,它只需要一个引用即可。
抽象方法必须由子类进行重写
只要包含一个抽象方法的类都必须定义为抽象类
抽象类中可以包含具体方法,当然也可以不包含抽象方法。
子类中的抽象方法不能与父类的抽象方法同名。
abstract 不能与 final 并列修饰一个类。(前者为了继承,后者不能继承)
abstract 不能与 private、static、final、native 并列修饰一个方法。
接口
接口是一种比抽象类更加抽象的表达形式。接口不是类,不能被实例化。接口是用来建立类与类之间关系的协议,它所提供的是一种形式,而没有具体的实现。同时实现该接口的实现类必须要实现该接口的所有方法。

接口是抽象类的延伸,在 Java 中,类是单继承的,但是接口则可以实现多个。

使用接口的注意事项:

接口中所有方法默认都声明为 public
在接口中可以定义 “成员变量” ,或者说不可变的常量,因为接口中的 “成员变量” 会被自动声明为 public static final。
接口中不存在实现方法。
实现接口的非抽象类必须实现该接口的所有方法,抽象类可以不用实现。
不能实例化对象,但是可以把一个引用声明为接口类型,实例化的对象必须是实现该接口的类。
在实现多接口的时候一定要避免方法名重复。
抽象类与接口的区别
1.语法层次
抽象类可以拥有任意范围的成员数据,同时可以拥有自己的非抽象方法。但是在接口中,它只能有静态的,不能修改的成员数据,同时它所有的方法都是抽象的。在某种程度上来说,接口是抽象类的特殊化。

2.设计层次
抽象层次不同,抽象类是对类抽象,而接口是对行为的抽象。抽象类是对整个类进行抽象,包括属性、行为,但是接口只对类的局部进行抽象。
跨域不同。抽象类所跨域的是具有相似特点的类,而接口却可以跨域不同的类,甚至毫无关系的类。
设计层次不同。对于抽象类而言,它是自下往上设计的,我们需要知道子类才能抽象出父类,而接口不同,它根本就不需要知道子类,它更像一种面向行为的设计方式。


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马