Java的抽象类和接口机制应用 你get了没

简介: Java的抽象类和接口机制应用 你get了没

抽象

还记得在校期间上《大学物理》课的时候,老师在讲物质之间的万有引力定律,其实我内心不是很理解,就感觉有点点抽象,在生活中没有实际应用。

换句话说,我们看不见,摸不着,但不能否认他的存在。

又比如说,水果就是一个抽象概念。

“吃水果”,代表吃苹果香蕉梨等具体的水果,而不是“水果”这个物质。

在Java面向对象编程中,也有“抽象”这一个概念,Java提供了abstract关键字。

abstract

abstract是Java语言中一个重要的关键字,是表示抽象的修饰符,可以修饰类和方法,被修饰的类和方法分别被称为抽象类和抽象方法。

比如水果类就是一个抽象类,具体到某种水果的实现时,总是归类于某类水果种类。

所以说,在需要某个抽象类的具体实例化时,只能用具体类的实例来代替。

而且,抽象类不能实例化,不能new一个新对象。


抽象类

在Java中,抽象类可以理解为一个半成品,需要子类继承该抽象类,并且覆盖抽象方法,这样子类才有new对象的能力。

但如果子类还是没能实现父类的抽象方法,那么子类也是抽象类,可以无限循环下去。

抽象类一般位于抽象层,表示该类的设计还没完善,还没得到具体解释,必须在子类进一步完善之后,才可以实例化对象。

创建一个抽象类:User


package cn.zwz;
public interface User {
    void say();
}

创建User类的实例化:Student


package cn.zwz;
public class Student implements User{
    @Override
    public void say() {
        System.out.println("我是学生");
    }
}

Student类实现了抽象类User的say方法,才能实例化对象进行调用方法:


package cn.zwz;
public class Main {
    public static void main(String[] args) {
        Student student = new Student();
        student.say();
    }
}

Java的abstract有一定的约束条件,比如:

1.抽象类可以没有抽象方法,如:


public abstract class User {
}

2.在一个类中存在抽象方法时,该类会变成抽象类


public abstract class User {
    abstract void say();
}

3.类的构造方法不能抽象化


public abstract class User {
    private String name;
    private int age;
    // 错误
    abstract public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

4.类的静态方法不能抽象化


public abstract class User {
    /**
     * 错误
     */
    public abstract static int add(int a,int b) {
        return a + b;
    }
}

5.抽象类抽象方法不能被final修饰


public abstract class User {
    private String name;
    private final int age; // 错误
}

6.抽象方法不能和public等权限关键字连用。


public abstract class User {
    private String name;
    private abstract int age; // 错误
}

接口

在Java程序设计中,不支持多继承,但支持实现多个接口。

Java提供了interface关键字来定义接口,可以理解为是一种规范或者一种标准。

Java采用单一继承机制,多继承的使用场景则用接口来弥补。

比如有一名工人张三,在人类生物学角度看,只有一位生物学意义上的父亲。但对张三来说,在不同场景下有不同的身份,在学校是一个学生,在公司是一名软件工程师,在超市是一名消费者…根据传统的面向对象概念,张三必须要有学生父亲,才能成为学生;必须要有一名消费者父亲,才能成为消费者…这显然是不成立的。

Java如何实现?就是用了接口的概念,张三接了学生的口,那么他就是学生,接了消费者的口,那么他就是消费者。

又比如说生活中各式各样的标准件,比如A4纸,无需提供纸张的长宽度,即可完成打印;比如电器的220V电压,无需提供电阻和电流值;又比如说软考,我们通过学习成长,拿到了软考证书,就可以去当软件工程师。

接口就是规范、标准,在日常生活中有着各式各样广泛的应用。在Java开发中也是这样,开发者在设计接口时,可以不关注细节,只关心接口的功能和数据格式要求。

比如下面的一个User接口

public interface User {
    /**
     * 要实现说话功能
     */
    public void say();
    /**
     * 要实现加法计算功能
     * @param x
     * @param y
     * @return
     */
    public int add(int x,int y);
}

在Java程序设计中,接口的出现让面向对象程序设计理念前进了一大步,使得代码能够更好的模拟现有世界。


接口的具体实现

在Java中,一个类可以通过关键字 implements 申明自己实现的接口。

如果需要实现多个接口,用逗号隔开即可。

如下Student学生类实现了User接口。

public class Student implements User{
    @Override
    public void say() {
        System.out.println("我是一名学生!");
    }
    @Override
    public int add(int x, int y) {
        return x + y;
    }
}

Student类实现了User接口,和继承机制一样,继承了接口中定义的常量和抽象方法。

常量可以直接使用,但抽象方法需要在类中提供具体实现;也可以不实现且继续成为抽象类,不能实例化对象。


接口和抽象类的关系

接口是抽象类的子集,是抽象类的一种特殊实现。

接口中所有方法都必须是抽象的,但抽象类中可以有不抽象的方法。

接口中方法默认为public、abstract,抽象类中默认为public、static、final,两者存在明显差异。

接口不能存在构造方法,而抽象类可以。

接口没有普通成员变量,但抽象类可以。

接口不能存在静态方法,但抽象类可以。

Java类可以实现多个接口,但只能继承一个抽象类。


接口的作用

从以上抽象类和接口的对比中可以发现,接口是在系统架构设计方面发挥更多的作用,主要用于定义模块之间的关联信息。而抽象类在实际编程中提供更好的作用,可以实现代码的复用,降低代码的耦合性。


多态机制

多态是面向对象程序设计的一大特性,也是一个基本的设计原则。

对于同样一个触发条件,不同对象的响应事件是不一样的,也就是多态。

在生物学的多样性,也就是Java的多态机制。

Java可以通过方法重载、方法覆盖来实现多态机制,在不同的应用场景有着丰富的应用场景。


相关文章
|
6天前
|
安全 Java API
java如何请求接口然后终止某个线程
通过本文的介绍,您应该能够理解如何在Java中请求接口并根据返回结果终止某个线程。合理使用标志位或 `interrupt`方法可以确保线程的安全终止,而处理好网络请求中的各种异常情况,可以提高程序的稳定性和可靠性。
36 6
|
16天前
|
Java 程序员
深入理解Java异常处理机制
Java的异常处理是编程中的一块基石,它不仅保障了代码的健壮性,还提升了程序的可读性和可维护性。本文将深入浅出地探讨Java异常处理的核心概念、分类、处理策略以及最佳实践,旨在帮助读者建立正确的异常处理观念,提升编程效率和质量。
|
17天前
|
Java 开发者 UED
深入探索Java中的异常处理机制##
本文将带你深入了解Java语言中的异常处理机制,包括异常的分类、异常的捕获与处理、自定义异常的创建以及最佳实践。通过具体实例和代码演示,帮助你更好地理解和运用Java中的异常处理,提高程序的健壮性和可维护性。 ##
42 2
|
17天前
|
Java 开发者
Java中的异常处理机制深度剖析####
本文深入探讨了Java语言中异常处理的重要性、核心机制及其在实际编程中的应用策略,旨在帮助开发者更有效地编写健壮的代码。通过实例分析,揭示了try-catch-finally结构的最佳实践,以及如何利用自定义异常提升程序的可读性和维护性。此外,还简要介绍了Java 7引入的多异常捕获特性,为读者提供了一个全面而实用的异常处理指南。 ####
39 2
|
21天前
|
缓存 Java 开发者
Java多线程并发编程:同步机制与实践应用
本文深入探讨Java多线程中的同步机制,分析了多线程并发带来的数据不一致等问题,详细介绍了`synchronized`关键字、`ReentrantLock`显式锁及`ReentrantReadWriteLock`读写锁的应用,结合代码示例展示了如何有效解决竞态条件,提升程序性能与稳定性。
74 6
|
19天前
|
监控 Java 数据库连接
Java线程管理:守护线程与用户线程的区分与应用
在Java多线程编程中,线程可以分为守护线程(Daemon Thread)和用户线程(User Thread)。这两种线程在行为和用途上有着明显的区别,了解它们的差异对于编写高效、稳定的并发程序至关重要。
26 2
|
20天前
|
Java 程序员 UED
深入理解Java中的异常处理机制
本文旨在揭示Java异常处理的奥秘,从基础概念到高级应用,逐步引导读者掌握如何优雅地管理程序中的错误。我们将探讨异常类型、捕获流程,以及如何在代码中有效利用try-catch语句。通过实例分析,我们将展示异常处理在提升代码质量方面的关键作用。
31 3
|
20天前
|
Java 数据库连接 开发者
Java中的异常处理机制:深入解析与最佳实践####
本文旨在为Java开发者提供一份关于异常处理机制的全面指南,从基础概念到高级技巧,涵盖try-catch结构、自定义异常、异常链分析以及最佳实践策略。不同于传统的摘要概述,本文将以一个实际项目案例为线索,逐步揭示如何高效地管理运行时错误,提升代码的健壮性和可维护性。通过对比常见误区与优化方案,读者将获得编写更加健壮Java应用程序的实用知识。 --- ####
|
21天前
|
运维 Java 编译器
Java 异常处理:机制、策略与最佳实践
Java异常处理是确保程序稳定运行的关键。本文介绍Java异常处理的机制,包括异常类层次结构、try-catch-finally语句的使用,并探讨常见策略及最佳实践,帮助开发者有效管理错误和异常情况。
65 4
|
20天前
|
开发框架 安全 Java
Java 反射机制:动态编程的强大利器
Java反射机制允许程序在运行时检查类、接口、字段和方法的信息,并能操作对象。它提供了一种动态编程的方式,使得代码更加灵活,能够适应未知的或变化的需求,是开发框架和库的重要工具。
35 2
下一篇
DataWorks