JAVA面向对象之抽象类和接口

简介:

前面为大家介绍了类的相关概念以及使用方式,在Java中有两种特殊的类,分别为抽象类和接口(本质上还是类),这一片博客就为大家介绍一下抽象类以及接口的使用。对这两种特殊的类进行比较。

抽象类

如果一个类中存在某个或某些方法必须由继承该类的子类实现,这个时候我们就可以使用抽象类。使用了关键词abstract声明的类叫作“抽象类”。如果一个类里包含了一个或多个抽象方法,类就必须指定成abstract(抽象)。“抽象方法”属于一种不完整的方法,只含有一个声明,没有方法主体。定义抽象类的语法格式为:
public abstract class className {
......
}

继承和实现接口与普通类一样,只是在类名前面加上abstract关键字,以表明该类为抽象类。
在 面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是 所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类往往用来表征我们在对问题领域进行分析、 设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。比如:如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆、 三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。正是因为抽象的概念 在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。
在面向对象领域,抽象类主要用来进行类型隐藏。 我们可以构造出一个固定的一组行为的抽象描 述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个 抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。
抽象类的使用有如下几点需要注意的地方:
1. 如果将一个类声明为abstract,此类不能生成对象,只能被继承使用。
2. 抽象方法必须存在于抽象类中。
3. 抽象类中可以有一般的变量和一般的方法。
4. 子类继承抽象类必须实现其中抽象方法,除非子类为抽象类。

还是以之前的Animal类为例,我们将其改造为一个抽象类:

public abstract class Animal {
   private String type;
   private int age;

   public String getType() {
      return type;
   }
   public int getAge() {
      return type;
   }
   public void setType(String type) {
      this.type = type;
   }
   public void setAge(int age) {
      this.age = age;
   }

   public abstract void say();
}

在这个抽象类中,我们定义了一个抽象方法say()。用于子类去重写实现。子类与之前的编写几乎相同。

public class Dog extends Animal{
   public void say() {
      System.out.println("汪汪...");
   }
}

这样我们就继承了抽象类,并实现了其中的抽象方法say();。

接口

接口其实和抽象类是非常像的,只是接口着重于体现这个类能做什么,即有哪些方法。比如电脑上的主板,提供了一个显卡的插槽,不同的厂商生产显卡时要按照插槽的标准去生产,这和接口是同样的道理,接口提供了一套标准。
接口的定义格式为:
public interface className {
......
}

接口的一些用法可以总结为如下几点:
1. 因为java不支持多重继承,所以有了接口,一个类只能继承一个父类,但可以实现多个接口,接口本身也可以继承多个接口。
2. 接口里面的成员变量默认都是public static final类型的。必须被显示的初始化。
3. 接口里面的方法默认都是public abstract类型的。隐式声明。
4. 接口没有构造方法,不能被实例化。
5. 接口不能实现另一个接口,但可以继承多个接口。
6. 类如果实现了一个接口,那么必须实现接口里面的所有抽象方法,否则类要被定义为抽象类。

我们以显卡作为例子,抽象出一个GraphicsCard接口,接口中定义一个显示图像的dispaly()方法:

public interface GraphicsCard {
   public void dispaly();
}

然后我们在定义一个子类实现这个接口:

public class AMDGraphicsCard  implements GraphicsCard {
   public void dispaly() {
      System.out.println("AMD显卡");
   }
}

抽象类与接口比较

抽象类和接口之间很大程度上是很相似的,这里列举一下这两者的区别:
1. 接口只能包含抽象方法,抽象类可以包含普通方法。
2. 接口只能定义静态常量属性,抽象类既可以定义普通属性,也可以定义静态常量属性。
3. 接口不包含构造方法,抽象类里可以包含构造方法。

目录
相关文章
|
14天前
|
算法 Java 数据处理
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。HashSet基于哈希表实现,提供高效的元素操作;TreeSet则通过红黑树实现元素的自然排序,适合需要有序访问的场景。本文通过示例代码详细介绍了两者的特性和应用场景。
32 6
|
14天前
|
存储 Java 数据处理
Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位
【10月更文挑战第16天】Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位。本文通过快速去重和高效查找两个案例,展示了Set如何简化数据处理流程,提升代码效率。使用HashSet可轻松实现数据去重,而contains方法则提供了快速查找的功能,彰显了Set在处理大量数据时的优势。
26 2
|
6天前
|
安全 Java
在 Java 中使用实现 Runnable 接口的方式创建线程
【10月更文挑战第22天】通过以上内容的介绍,相信你已经对在 Java 中如何使用实现 Runnable 接口的方式创建线程有了更深入的了解。在实际应用中,需要根据具体的需求和场景,合理选择线程创建方式,并注意线程安全、同步、通信等相关问题,以确保程序的正确性和稳定性。
|
4天前
|
Java
Java基础(13)抽象类、接口
本文介绍了Java面向对象编程中的抽象类和接口两个核心概念。抽象类不能被实例化,通常用于定义子类的通用方法和属性;接口则是完全抽象的类,允许声明一组方法但不实现它们。文章通过代码示例详细解析了抽象类和接口的定义及实现,并讨论了它们的区别和使用场景。
|
5天前
|
Java 关系型数据库 数据库
面向对象设计原则在Java中的实现与案例分析
【10月更文挑战第25天】本文通过Java语言的具体实现和案例分析,详细介绍了面向对象设计的五大核心原则:单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则帮助开发者构建更加灵活、可维护和可扩展的系统,不仅适用于Java,也适用于其他面向对象编程语言。
8 2
|
5天前
|
Java 测试技术 API
Java零基础-接口详解
【10月更文挑战第19天】Java零基础教学篇,手把手实践教学!
15 1
|
7天前
|
Java 测试技术 开发者
Java零基础-抽象类详解
【10月更文挑战第17天】Java零基础教学篇,手把手实践教学!
10 2
|
9天前
|
Java 测试技术 开发者
Java零基础-抽象类详解
【10月更文挑战第15天】Java零基础教学篇,手把手实践教学!
13 2
|
10天前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
12 3
|
10天前
|
Java
在Java多线程编程中,实现Runnable接口通常优于继承Thread类
【10月更文挑战第20天】在Java多线程编程中,实现Runnable接口通常优于继承Thread类。原因包括:1) Java只支持单继承,实现接口不受此限制;2) Runnable接口便于代码复用和线程池管理;3) 分离任务与线程,提高灵活性。因此,实现Runnable接口是更佳选择。
23 2