Java面试专题——面向对象

面向过程和面向对象的区别

面向过程:当事件比较简单的时候,利用面向过程,注重的是事件的具体的步骤/过程,注重的是过程中的具体的行为,以函数为最小单位,考虑怎么做。

面向对象:注重找“参与者”,将功能封装进对象,强调具备了功能的对象,以类/对象为最小单位,考虑谁来做。

二者相辅相成,并不是对立的。

解决复杂问题,可以通过面向对象方式,便于我们从宏观上把握事物之间复杂的关系;具体到微观操作,仍然使用面向过程方式来处理。

面向对象三个阶段

【1】面向对象分析OOA -- Object Oriented Analysis

  • 从对象抽取出类
  • 类里面有什么
    • 动词--》动态特性--》方法
    • 名词--》静态特性--》属性

【2】面向对象设计OOD -- Object Oriented Design

  • 先有类,再有对象

【3】面向对象编程OOP -- Object Oriented Programming

如何理解Java的面向对象

面向对象编程的核心,主要是对象、类、封装、继承、多态以及抽象。

  • 首先是将万事万物都看成一个个具体的对象,而类就是抽取一部分对象共同的属性、行为等构建的一个用于创建这类对象的模板;
  • 封装则是为了提高数据的安全性,通过访问修饰符去控制类的相关权限;
  • 继承则是通过子类继承父类的属性和方法来提高代码的复用,当然也是多态的前置条件;
  • 而多态则是通过方法的重载和重写,来简化程序的调用,提高代码的灵活性和可拓展性;
  • 最后则是抽象,通过抽象类和接口的方式,来解决单继承的不足,进一步提高代码的可拓展性和可维护性。

面向对象三大特性

封装(Encapsulation)

封装的本质,就是把该隐藏的隐藏起来,该暴露的暴露出来。

封装的主要目的是隐藏对象内部的复杂性和实现细节,只对外公开简单的接口。

封装是一种信息隐藏技术,在java中通过访问修饰符(如private、protected、public等)来实现,控制用户对类的修改和访问数据的程度,其中private是最严格的访问级别,它限制了类外部对类内部成员的访问。

适当的封装可以让程式码更容易理解和维护,也加强了程式码的安全性。

封装的好处

  1. 提高代码的安全性:通过隐藏类的内部实现细节,封装可以防止外部代码直接访问和修改类的内部状态,从而减少了错误的发生。

  2. 提高代码的复用性:封装使得类的内部实现可以独立于外部使用,因此可以在不同的上下文中重用同一个类。

  3. 提高代码的可维护性:由于封装隐藏了类的内部实现,因此当需要修改类的内部实现时,只需要修改类的内部代码,而不需要修改使用该类的外部代码。

封装的设计,也就是所谓的“高内聚,低耦合”:

  • 高内聚:类的内部数据操作细节自己完成,不允许外部干涉;
  • 低耦合:仅对外暴露少量的方法用于使用。 隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提高系统的可扩展性、可维护性。

继承(Inheritance)

继承的本质就是子类继承父类所定义的内容。

继承就是让一个类继承另一个类的属性和方法。通过继承,子类可以重用父类的代码,而不需要重新编写相同的代码。

继承是代码复用的重要手段之一,也是多态性的基础。

继承的好处

  1. 提高代码的复用性:子类可以继承父类的属性和方法,从而避免了代码的重复编写。

  2. 便于代码的扩展:通过继承,可以在不修改父类代码的情况下,通过扩展子类来添加新的功能。

  3. 支持多态性:多态性是面向对象编程的一个重要特性。

注意: 

  • 在Java中,一个类只能直接继承一个父类(单继承),但可以通过多层继承来间接继承多个类。

  • 继承具有传递性,即子类会继承父类以及父类的父类(直到Object类)的所有非私有属性和方法。

  • 父类的私有成员(属性和方法)虽然被子类继承,但子类不能直接访问它们。子类只能通过父类提供的公共或受保护的方法来间接访问这些私有成员。

多态(Polymorphism)

多态的本质,就是通过对于同一个方法调用,然后由于其实现子类的不同,来实现不同的需求。

多态就是可以用统一的接口来操作不同的对象。当通过父类类型的引用调用方法时,由于多态的存在,会根据引用所指向的对象的实际类型来调用相应的方法,这就实现了多态。

Java中的多态通过继承和方法重写实现:

  1. 继承:子类通过继承获得父类的属性和方法,从而可以扩展父类的功能。

  2. 方法重写:子类根据需要重写父类中的方法,以改变方法的行为。

多态的设计,也就是所谓的“开闭原则”

  • 对扩展是开放:可以通过实现不同子类,实现不同的能力;
  • 对修改关闭:避免了修改旧代码。

类与类之间的关系

一、继承关系

继承指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力。在Java中继承关系通过关键字extends明确标识,在设计时一般没有争议性。

在UML类图设计中,继承用一条带空心三角箭头的实线表示,从子类指向父类,或者子接口指向父接口。

二、实现关系

实现指的是一个class类实现interface接口(可以是多个)的功能,实现是类与接口之间最常见的关系。在Java中此类关系通过关键字implements明确标识,在设计时一般没有争议性。

在UML类图设计中,实现用一条带空心三角箭头的虚线表示,从类指向实现的接口。

三、依赖关系

简单的理解,依赖就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是类B的变化会影响到类A。比如某人要过河,需要借用一条船,此时人与船之间的关系就是依赖。表现在代码层面,让类B作为参数被类A在某个method方法中使用。

在UML类图设计中,依赖关系用由类A指向类B的带箭头虚线表示。

四、关联关系

关联体现的是两个类之间语义级别的一种强依赖关系,比如我和我的朋友,这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的。关联可以是单向、双向的。表现在代码层面,为被关联类B以类的属性形式出现在关联类A中,也可能是关联类A引用了一个类型为被关联类B的全局变量。

在UML类图设计中,关联关系用由关联类A指向被关联类B的带箭头实线表示,在关联的两端可以标注关联双方的角色和多重性标记。

五、聚合关系

聚合是关联关系的一种特例,它体现的是整体与部分的关系,即has-a的关系。此时整体与部分之间是可分离的,它们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享。比如计算机与CPU、公司与员工的关系等,比如一个航母编队包括海空母舰、驱护舰艇、舰载飞机及核动力攻击潜艇等。表现在代码层面,和关联关系是一致的,只能从语义级别来区分。

在UML类图设计中,聚合关系以空心菱形加实线箭头表示。

六、组合关系

组合也是关联关系的一种特例,它体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合。它同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束,比如人和人的大脑。表现在代码层面,和关联关系是一致的,只能从语义级别来区分。

在UML类图设计中,组合关系以实心菱形加实线箭头表示。

七、总结

对于继承、实现这两种关系没多少疑问,它们体现的是一种类和类、或者类与接口间的纵向关系。其他的四种关系体现的是类和类、或者类与接口间的引用、横向关系,是比较难区分的,有很多事物间的关系要想准确定位是很难的。前面也提到,这四种关系都是语义级别的,所以从代码层面并不能完全区分各种关系,但总的来说,后几种关系所表现的强弱程度依次为:组合>聚合>关联>依赖。

 

 

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

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

相关文章

GeekHour

Linux Linux的是类Unix系统,作者是Linus,也是git的作者。符合GPL(General Public License)就可以Linux的使用、修改、再发布。 Linux四部分: 内核:驱动、内存管理、进程管理、文件系统、网络协议栈…。作…

学习golang语言时遇到的难点语法

作者是java选手,实习需要转go,记录学习go中遇到的一些与java不同的语法。 defer defer特性 1. 关键字 defer 用于注册延迟调用。 2. 这些调用直到 return 前才被执。因此,可以用来做资源清理。 3. 多个defer语句,按先进…

一个面向领域的直播平台开源!

面向教育等领域,二开后可以做视频会议等 在线直播平台 基于 Spring Boot 和 SRS 平台功能 视频直播 在线聊天 直播提醒 作业上传和批改 项目介绍了一个基于Spring Boot和SRS的在线直播平台,这个平台具备视频直播、在线聊天、直播提醒以及…

软件测试—— 接口测试(HTTP和HTTPS)

软件测试—— 接口测试(HTTP和HTTPS) HTTP请求方法GET特点使用场景URL结构URL组成部分URL编码总结 POST特点使用场景请求结构示例 请求标头和响应标头请求标头(Request Headers)示例请求标头 响应标头(Response Header…

Mysql约束(学习自用)

一、概述 注意: 1)多个约束之间用空格分开 二、外键约束 三、约束行为

linux-NFS网络共享存储服务配置

1.NFS服务原理 NFS会经常用到,用于在网络上共享存储,这样讲,你对NFS可能不太了解,举一个例子, 加入有三台机器A,B,C,它们需要访问同一个目录,目录中都是图片,传统的做法是把这些 图…

LabVIEW太赫兹二维扫描成像系统

使用LabVIEW设计太赫兹二维扫描成像系统。通过LabVIEW平台开发,结合硬件如太赫兹源、平移台、锁相放大器等,实现了高效、精准的成像功能。系统采用蛇形扫描方式,通过动态调整扫描参数,达到优化成像质量的目的。 ​ 项目背景 在非…

kafka学习笔记6 ACL权限 —— 筑梦之路

在Kafka中,ACL(Access Control List)是用来控制谁可以访问Kafka资源(如主题、消费者组等)的权限机制。ACL配置基于Kafka的kafka-acls.sh工具,能够管理对资源的读取、写入等操作权限。 ACL介绍 Kafka的ACL是…

ARM学习(42)CortexM3/M4 MPU配置

笔者之前学习过CortexR5的MPU配置,现在学习一下CortexM3/M4 MPU配置 1、背景介绍 笔者在工作中遇到NXP MPU在访问异常地址时,就会出现总线挂死,所以需要MPU抓住异常,就需要配置MPU。具体背景情况可以参考ARM学习(41)NXP MCU总线挂死,CPU could not be halted以及无法连…

Python----Python高级(正则表达式:语法规则,re库)

一、正则表达式 1.1、概念 正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、 regexp或RE),是一种文本模式,包括普通字符(例如,a 到 z 之间的字母&#xff0…

docker 使用远程镜像启动一个容器

使用前提: 首先你得安装docker,其次你得拥有一个远程镜像 docker run --name io_11281009 --rm -it -p 2233:22 -v .:/root/py -e ed25519_rootAAAAC3NzaC1lZDI1********Oy7zR7l7aUniR2rul ghcr.lizzie.fun/fj0r/io srv对上述命令解释: 1.docker run:…

SSM课设-学生管理系统

【课设者】SSM课设-学生管理系统 技术栈: 后端: SpringSpringMVCMybatisMySQLJSP 前端: HtmlCssJavaScriptEasyUIAjax 功能: 学生端: 登陆 学生信息管理 个人信息管理 老师端: 多了教师信息管理 管理员端: 多了班级信息管理 多了年级信息管理 多了系统用户管理

SpringMVC 实战指南:打造高效 Web 应用的秘籍

第一章:三层架构和MVC 三层架构: 开发服务器端,一般基于两种形式,一种 C/S 架构程序,一种 B/S 架构程序使用 Java 语言基本上都是开发 B/S 架构的程序,B/S 架构又分成了三层架构三层架构: 表现…

工程上LabVIEW常用的控制算法有哪些

在工程应用中,LabVIEW常用的控制算法有很多,它们广泛应用于自动化、过程控制、机器人、测试测量等领域。以下是一些常见的控制算法: 1. PID 控制 用途:PID(比例-积分-微分)控制是最常用的反馈控制算法&…

2024年博客之星主题创作|从零到一:我的技术成长与创作之路

2024年博客之星主题创作|从零到一:我的技术成长与创作之路 个人简介个人主页个人成就热门专栏 历程回顾初来CSDN:怀揣憧憬,开启创作之旅成长之路:从平凡到榜一的蜕变持续分享:打卡基地与成长复盘四年历程&a…

【2024年华为OD机试】(B卷,200分)- 战场索敌 (JavaScriptJava PythonC/C++)

一、问题描述 题目描述 有一个大小为 N * M 的战场地图,被墙壁 # 分隔成大小不同的区域。上下左右四个方向相邻的空地 . 属于同一个区域,只有空地上可能存在敌人 E。请求出地图上总共有多少区域里的敌人数小于 K。 输入描述 第一行输入为 N, M, K&…

机器学习(5):支持向量机

1 介绍 支持向量机(Support Vector Machine,简称 SVM)是一种监督学习算法,主要用于分类和回归问题。SVM 的核心思想是找到一个最优的超平面,将不同类别的数据分开。这个超平面不仅要能够正确分类数据,还要使…

【Linux入门】2w字详解yum、vim、gcc/g++、gdb、makefile以及进度条小程序

文章目录 Ⅰ. Linux 软件包管理器 yum一、什么是软件包?二、查找软件包三、安装与卸载软件包 拓展:lrzsz简介拓:配置 yum 源路径的方法Ⅱ. Linux开发工具vim编辑器一、vim 的基本概念二、vim 的基本操作三、vim 命令模式的操作四、vim 底行模…

《动•情》组诗浅析

路遇一枚运动的灵魂,邂逅一张随拍的悸动。 (笔记模板由python脚本于2025-01-21 22:59:21创建,本篇笔记适合喜欢诗的coder翻阅) 【学习的细节是欢悦的历程】 Python官网:https://www.python.org/ Free:大咖免费“圣经”教程《 pyt…

redis-排查命中率降低问题

1.命中率降低带来的问题 高并发系统,当命中率低于平常的的运行情况,或者低于70%时,会产生2个影响。 有大量的请求需要查DB,加大DB的压力;影响redis自身的性能 不同的业务场景,阈值不一样,一般…