02_Java综述

目录

  • 面向对象编程
    • 两种范式
    • 抽象
    • OOP 三原则
      • 封装
      • 继承
      • 多态
      • 多态、封装与继承协同工作

面向对象编程

面向对象编程(Object-Oriented Programming,OOP)在Java中核心地位。几乎所有的Java程序至少在某种程度上都是面向对象的。OOP与java是密不可分的。下面说一下OOP的理论部分。

两种范式

​ 所有计算机程序都包含两种元素:代码和数据。而且从概念上讲,程序可以围绕代码或数据进行组织。也就是说,某些程序是围绕“正在发生什么”进行编写的,其他一些程序则是围绕“将影响谁”进行编写的。这是控制程序如何构造的两种范式。第一种方式被称为面向过程模型(process-oriented model)这种方式将程序描述为一系列线性步骤(即代码)。面向过程模型可以被认为是代码作用于数据。例如,C 这类过程化语言采用这种模型是相当成功的。但是,正如在第1章提到的,随着程序规模和复杂性的不断增长,这种方式带来的问题会逐渐显现出来。
​ 为了管理日益增长的复杂性,发明了
第二种方式,称为面向对象编程(object-oriented programming)
。面向对象编程围绕数据(即对象)以及一套为数据精心定义的接口组织程序**。面向对象编程的特点是数据控制对代码的访问。正如将会看到的,通过将数据作为控制实体,可以得到组织结构方面的诸多好处。

抽象

​ 面向对象编程的本质元素之一是抽象(abstraction)。人们通过抽象管理复杂性。例如,人们不会将一辆汽车想象成一系列相互独立的部分,而是将它想象成一个定义良好的具有自己独特行为的对象。通过这种抽象人们可以驾驶汽车到杂货店,而不会因为汽车零部件的复杂性而不知所措。人们可以忽略引擎、传动以及刹车系统的工作细节。相反,可以自由地作为一个整体使用这个对象。
​ 使用层次化分类是管理抽象的一种强有力方式。这种方式允许对复杂系统的语义进行分层,将它们分解为多个更易于管理的部分。从外部看,汽车是单个对象。而从内部看,汽车是由几个子系统构成的:驾驶系统、制动系统、音响系统、安全带、加热系统、移动电话,等等。如果继续细分,每个子系统是由更多特定的单元组成的。例如,音响系统是由收音机、CD 播放器和/或磁带或 MP3 播放器组成的。关键的一点是,通过层次化抽象管理汽车(或所有其他复杂系统)的复杂性。
复杂系统的层次化抽象也可以应用于计算机程序。来自传统面向过程程序的数据,通过抽象可以转换成程序的组件对象。程序中的一系列处理步骤,何以变成这些对象之间的消息集合。因此,每个对象描述了它自己的独特行为。可以将这些对象当作响应消息的具体实体,消息告诉对象做什么事情。这就是面向对象编程的本质。
面向对象的概念形成了 Java的核心,就如同它们形成了人类理解事物的基础一样。理解这些概念是如何被迁移到程序中的,这一点很重要。将会看到,对于创建在项目生命周期过程中不可避免地要发生变化的程序来说,面向对象编程是一种强大且自然的范式,所有比较大的软件项目都要经历如下生命周期:概念提出、成长和衰老。例如,如果具有定义良好的对象,并且这些对象的接口清晰可靠,那么就可以优美地废除或替换旧系统的某些部分,而不用担心发生问题。

OOP 三原则

​ 所有面向对象编程语言都提供了用于帮助实现面向对象模型的机制,这些机制是封装(encapsulation)、继承(inheritance)和多态(polymorphism)。现在让我们看一看这些概念。

封装

封装是将代码及其操作的数据绑定到一起的机制,并且保证代码和数据既不会受到外部干扰,也不会被误用。理解封装的一种方法是将它想象成一个保护性的包装盒,可以阻止在盒子外部定义的代码随意访问内部的代码和数据。对盒子内代码和数据的访问是通过精心定义的接口严格控制的。为了将封装联系到现实世界,考虑汽车上的自动传动装置,其中封装了引擎的数百位信息,例如当前的加速度、路面的坡度以及目前的挡位等。作为用户,您只有一个方法可以影响这个复杂的封装:换挡。例如,不能通过使用转弯信号或雨刷器来影响传动。因此,挡位是定义良好的(实际上也是唯一的)传动系统接口。此外,在传动系统内部发生的操作不会影响到外部对象。例如,挡位不会开启前灯!因为自动传动装置被封装了起来,所以任何一家汽车制造商都可以选择他们喜欢的方式实现它。但是,从驾驶员的角度看,它们的作用是相同的。相同的思想可以应用于编程。封装代码的优点是每个人都知道如何访问,因此可以随意访问而不必考虑实现细节,也不必担心会带来意外的负面影响。
​ 在Java中,封装的基础是类类(class)定义了一组对象共享的结构和行为(数据和代码)。给定类的每个对象都包含该类定义的结构和行为,就好像它们是从同一个类的模子中铸造出来的一样。由于这个原因,有时将对象称作类的实例(instance ofclass)。因此,类是一种逻辑结构,而对象是物理实体。
​ 当创建类时需要指定构成类的代码和数据。笼统地讲,这些元素称为类的成员(member)。特别地,类定义的数据被称为成员变量(member variable)或实例变量(instance variable)操作数据的代码称为成员方法(member method),或简称为方法(Java 程序员所说的方法,实际上就是CIC+程序员所说的函数,如果您熟悉 CIC++的话,了解这一点是有帮助的)。在正确编写的Java 程序中,方法定义了使用成员变量的方式。这意味着类的行为和接口是由操作实例数据的方法定义的。
​ 既然类的目的是封装复杂性,那么在类的内部就存在隐藏实现复杂性的机制类中的每个方法或变量可以被标识为私有的或公有的。类的公有(public)接口表示类的外部用户需要知道或可以知道的所有内容私有(private)方法和数据只能由类的成员代码访问所有不是类成员的其他代码都不能访问私有的方法或变量。因为只能通过类的公有方法访问类的私有成员,所以可以确保不会发生不正确的行为。当然,这意味着必须仔细地设计公有接口,不要过多地暴露类的内部工作情况。

继承

继承是一个对象获得另一个对象的属性的过程。继承很重要,因为它支持层次化分类的概念。在前面提到过,通过层次化分类(即从上向下),大多数知识都将可管理。例如,金毛猎犬是狗类的一部分,狗又是哺乳动物类的一部分,哺乳动物又是更大的动物类的一部分。如果不使用层次化分类,每个对象都将需要显式定义自身的所有特征。而通过使用继承对象只需要定义自己在所属类中独有的那些属性,可以从父类继承通用的属性。因此,继承机制使得对象成为更一般情况的特殊实例成为可能。下面进一步分析这个过程。
​ 大多数人很自然地将世界看作由各种以层次化方式相互关联的对象(例如动物、哺乳动物和狗)构成的。如果希望以抽象的方式描述动物,那么会说它们具有某些属性,例如体型、智力、骨骼系统的类型等。动物还具有特定的行为,它们需要进食、呼吸以及睡觉。对属性和行为的这一描述就是动物类的定义。
​ 如果希望描述更具体的动物类,例如哺乳动物,那么它们会有更特殊的属性,比如牙齿类型、乳腺类型等。这就是所谓的动物类的子类(subclass),而动物类被称作哺乳动物类的超类(superclass)。
​ 既然哺乳动物只不过是定义更加具体的动物,它们当然可以从动物类继承所有属性。深度继承的子类会继承整个类层次(class hierarchy)中每个祖先的所有属性。
继承还与封装相互作用。如果一个给定的类封装了某些属性,那么它的任何子类除了具有这些属性之外,还会添加自己特有的属性(见图2-2)。这是一个关键概念,它使面向对象程序的复杂性呈线性增长而非几何性增长。新的子类继承所有祖先的所有属性,它不会与系统中的大部分其他代码进行不可预料的交互。
在这里插入图片描述
在这里插入图片描述

多态

多态(来自希腊语,表示“多种形态”)是允许将一个接口用于一类通用动作的特性。具体使用哪个动作与应用场合有关。考虑堆栈(一种后进先出的数据结构),可能有一个程序需要三种类型的堆栈,一种用于整数值,另一种用于浮点值,第三种用于字符。尽管存储的数据不同,但是实现每种堆栈的算法是相同的。如果使用非面向对象的语言,需要创建三套不同的堆栈例程,每套例程使用不同的名称。但是,由于支持多态,因此使用 Java 可以指定一套通用的堆栈例程,所有这些例程共享相同的名称。
​ 更一般的情况是,多态的概念经常被表达为“一个接口,多种方法”。这意味着可以为一组相关的动作设计一个通用接口。多态允许使用相同的接口指定通用类动作(general class of action),从而有助于降低复杂性。选择应用于每种情形的特定动作(即方法)是编译器的任务,程序员不需要手动进行选择,只需要记住并使用通用接口即可。
​ 再次以狗作为例子,狗的嗅觉是多态的“如果狗闻到猫的气味,就会吠叫并且追着猫跑;如果狗闻到了食物的气味,就会分泌睡液并跑向盛着食物的碗。在这两种情况下,是相同的嗅觉在工作,区别是闻到的气味,也就是作用于狗鼻子的数据的类型!当将多态应用于 Java 程序中的方法时,也可以采用相同的通用概念来实现。

多态、封装与继承协同工作

​ 如果应用得当,由多态、封装和继承联合组成的编程环境面向过程模型环境相比,能支持开发更健壮、扩展性更好的程序。精心设计的类层次结构是重用代码的基础,在这个过程中,需要投入时间和精力进行开发和测试。通过封装可以随着时间迁移您的实现,而不会破坏那些依赖于类的公有接口的代码。通过多态可以创建出清晰、易懂、可读和灵活的代码
​ 对于前面两个真实的例子,汽车更全面地演示了面向对象设计的功能。狗的例子对于思考继承则很有趣,但是汽车更像程序。依靠继承,所有驾驶员能够驾驶不同类型的车辆(子类)。不管是校车、奔驰、保时捷,还是家用货车,驾驶员大体上都能找到并操作方向盘、制动闸和油门踏板。经过一段时间的腾合,大部分人甚至能够知道手动挡与自动挡之间的差别,因为他们从根本上理解了手动挡与自动挡的共同超类——传动。
人们总是与已经封装好的汽车特性进行交互。刹车和油门踏板隐藏了不可思议的复杂性,但是接口却非常简单,使用脚就可以操作它们。而引擎的实现、制动踏板的样式以及轮胎的大小,对于如何与踏板的类定义进行交互则没有影响。
​ 汽车制造商为基本相同的车辆提供多种选项的能力,清晰地反映了最后一个特性——多态。例如,刹车系统有正锁和反锁之分,方向盘有带助力和不带助力之分,引擎有 4 缸、6缸或8缸之分。不管采用哪种方式,仍然是通过踩下刹车踏板停车、转动方向盘改变方向、踩下油门踏板开动车辆。相同的接口可以用于控制大量不同的实现。
​ 可以看出,正是通过应用封装、继承和多态,将各个独立的部分变换成了所谓的汽车对象。对于计算机程序也一样。通过应用面向对象原则,可以将复杂系统的各个部分组合到一起,形成健壮、可维护的整体。
​ 在本节开头提到过,每个 Java 程序都是面向对象的。或者更准确地说,每个 Java 程序都涉及封装、继承和多态。将会看到,Java 提供的大部分特性都是内置类库的一部分,这些类库大量使用了封装、继承和多态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/594115.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SSM+Vue酒店管理系统

SSMVue酒店管理系统,JavaWeb酒店管理系统,项目由maven工具管理依赖,数据库Mysql,一共19张表,前端用Vue写的管理端,功能丰富,需要可在最后位置联系我,可加购调试,讲解&…

自注意力架构大成者_Transformer(Pytorch 17)

1 模型简介 在上节比较了 卷积神经网络(CNN)、循环神经网络(RNN)和 自注意力(self‐attention)。值得注意的是, 自注意力同时具有并行计算和最短的最大路径长度这两个优势。因此,使…

Llama3本地部署与高效微调入门

前言 为了保持公司在AI(人工智能)开源大模型领域的地位,社交巨头Meta推出了旗下最新开源模型。当地时间4月18日,Meta在官网上宣布公布了旗下最新大模型Llama 3。目前,Llama 3已经开放了80亿(8B&#xff09…

8086 汇编学习 Part 9

端口的读写 CPU 的邻居 CPU 内部的寄存器内存单元端口(各种接口卡、网卡,显卡,主板上的接口芯片等) 各种芯片工作时,都有一些寄存器由 CPU 读写从 CPU 角度,将各寄存器当端口,并统一编制CPU …

开源im即时通讯app源码系统/php即时聊天im源码/php+uniapp框架【终身使用】

摘要 随着开源文化的蓬勃发展,即时通讯(IM)系统作为现代通信不可或缺的一部分,其开源实现正变得越来越普遍。本文将深入探讨基于PHP的全开源即时通讯源码系统,并结合UniApp开源框架,从理论基础到代码实现,再到实际应用…

探索设计模式的魅力:分布式模式让业务更高效、更安全、更稳定

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》 💪🏻 制定明确可量化的目标,坚持默默的做事。 ✨欢迎加入探索分布式模式之旅✨ 在数字化时代,企业面临着前所未有的挑战和机遇。…

机器学习-K近邻算法(KNN)

目录 什么是KNN算法 图解KNN基本算法 (1)k近邻算法中k的选取 (2)距离函数 (3)归一化处理 (4)概率kNN KNN算法的优缺点 优势 缺点 KNN算法总结 什么是KNN算法 k近邻算法&…

vs 2022 Xamarin 生成 Android apk

再保存,如果没有生成apk就重启软件 再试一次

(论文阅读-优化器)Volcano-An Extensible and Parallel Query Evaluation System

目录 摘要 一、简介 三、火山模型系统设计 3.1 文件系统 3.2 查询处理 四、扩展性 五、动态查询评估计划 六、多处理器查询评估 6.1 垂直并行化 6.2 水平并行化Horizontal 6.3 exchange operator的变体 6.4 文件系统修改 七、总结 摘要 火山模型Volcano在数据库查…

详解LLMOps,将DevOps用于大语言模型开发

大家好,在机器学习领域,随着技术的不断发展,将大型语言模型(LLMs)集成到商业产品中已成为一种趋势,同时也带来了许多挑战。为了有效应对这些挑战,数据科学家们转向了一种新型的DevOps实践LLM-OP…

Maven 在项目的 pom.xml 文件中 指定 阿里云的景象仓库

配置 在 项目的 pom.xml 文件中添加如下配置即可 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&…

Android NDK开发——Android Studio 3.5.2安装与配置踩坑

Android NDK开发——Android Studio 3.5.2安装与配置踩坑 一、Android Studio下载二、配置踩坑报错1&#xff1a;Failed to install the following Android SDK packages as some licences have not been accepted报错2&#xff1a;No toolchains found in the NDK toolchains …

如何修复连接失败出现的错误651?这里提供修复方法

错误651消息在Windows 7到Windows 11上很常见&#xff0c;通常会出现在一个小的弹出窗口中。实际文本略有不同&#xff0c;具体取决于连接问题的原因&#xff0c;但始终包括文本“错误651”。 虽然很烦人&#xff0c;但错误651是一个相对较小的问题&#xff0c;不应该导致计算…

UI组件库和内容文字的中英文切换

同时实现UI组件库(这里以ElementPlus为例)和内容文字的中英文切换 1. 安装vueI18n和element-plus pnpm i vue-i18n element-plus 2. 然后在项目中src目录下新建lang文件夹&#xff0c;里面新建en.ts和zh.ts还有index.ts index.ts import { createI18n } from vue-i18n impor…

【Android】Android应用性能优化总结

AndroidApp应用性能优化总结 最近大半年的时间里&#xff0c;大部分投在了某国内新能源汽车的某款AndroidApp开发上。 由于该App是该款车上&#xff0c;常用重点应用。所以车厂对应用性能的要求比较高。 主要包括&#xff1a; 应用冷启动达到***ms。应用热(温)启动达到***ms应…

【备战软考(嵌入式系统设计师)】07 - 计算机网络模型

七层模型 计算机网络中比较常见的有OSI七层模型和TCP/IP四层模型。 软考中主要考七层模型&#xff0c;但是实际中使用的还是四层模型比较多&#xff0c;我们主要是为了考试&#xff0c;那就主要讲讲七层模型。不过实际上四层模型就是将七层模型压缩了三层&#xff0c;本质上是…

Nginx(参数设置总结)

文章目录 Nginx&#xff08;工作机制&参数设置&#xff09;1.Master&Worker工作机制1.示意图2.解释3.Nginx争抢机制4.accept_mutex解决惊群现象5.多进程结构不用多线程结构的好处6.IO多路复用&#xff0c;实现高并发7.优势 2.参数配置1.work_processes1.基本介绍2.work…

杭电acm2018 母牛的故事 Java解法 经典递归

标准递归题 先模拟 接着找递归出口 再找递归通式 想想看 今天的母牛等于前一天的母牛数加上今天出生的母牛 而三天前的母牛所有母牛都能生一头 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scnew Scanner(System.in);l…

交互中的“互”难以产生的原因

脑机交互技术的目标是通过分析和解读大脑活动&#xff0c;将其与特定的意图、指令或行为连接起来。通过训练和分析&#xff0c;可以建立起大脑活动与特定行为或意图之间的关联模型&#xff0c;从而实现脑机交互的应用&#xff0c;例如控制外部设备、传递信息等。然而&#xff0…

unaipp推荐算法的汽车租赁系统zaxzu 微信小程序hbuiderx

随着现代汽车租赁管理的快速发展&#xff0c;可以说汽车租赁管理已经逐渐成为现代汽车租赁管理过程中最为重要的部分之一。但是一直以来我国传统的汽车租赁管理并没有建立一套完善的行之有效的汽车租赁管理系统&#xff0c;传统的汽车租赁管理已经无法适应高速发展&#xff0c;…
最新文章