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类图设计中,组合关系以实心菱形加实线箭头表示。

七、总结

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

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电阻电位器可调电阻信号隔离变送器典型应用

电阻电位器可调电阻信号隔离变送器典型应用 产品描述: 深圳鑫永硕科技的XYS-5587系列是一进一出线性电子尺(电阻/电位计信号及位移)信号隔离变送器,是将输入电阻,线性电子尺,角度位移传感器信号进行采集,隔离,放大并转换成模拟量信号的小型仪表设备,并以…

Alluxio 联手 Solidigm 推出针对 AI 工作负载的高级缓存解决方案

作者:Wayne Gao, Yi Wang, Jie Chen, Sarika Mehta Alluxio 作为全球领先的 AI 缓存解决方案供应商, 提供针对 GPU 驱动 AI 负载的高速缓存。其可扩展架构支持数万个节点,能显著降低存储带宽的消耗。Alluxio 在解决 AI 存储挑战方面的前沿技…

文件系统格式RAW数据恢复全攻略

一、RAW文件系统格式深度解析 在数据存储的世界里,文件系统扮演着至关重要的角色,它负责管理和组织硬盘、U盘、SD卡等存储设备上的数据。而RAW文件系统格式,作为一种特殊状态,常常让许多用户感到困惑与不安。RAW格式并非一种标准…

探索 Stable-Diffusion-Webui-Forge:更快的AI图像生成体验

目录 简介🌟 主要特点📥 安装步骤1. 下载2. 配置环境和安装依赖3. 模型目录说明 🚀 运行 Stable-Diffusion-Webui-Forge1. 进入项目目录2. 运行项目3. 打开页面 🎨 使用体验常见问题📝 小结 简介 Stable-Diffusion-We…

汇编与逆向(一)-汇编工具简介

RadASM是一款著名的WIN32汇编编辑器,支持MASM、TASM等多种汇编编译器,Windows界面,支持语法高亮,自带一个资源编辑器和一个调试器。 一、汇编IDE工具:RadASM RadASM有内置的语言包 下载地址:RadASM asse…

Yearning开源MySQL SQL审核平台

一款MYSQL SQL语句/查询审计工具,为DBA与开发人员使用. 本地部署,注重隐私,简单高效的MYSQL审计平台。 它可以通过流程审批,实现真实线上环境sql的审核和执行,还可以回滚执行,能够确保线上SQL更新的可靠性…

PyTorch使用教程(10)-torchinfo.summary网络结构可视化详细说明

1、基本介绍 torchinfo是一个为PyTorch用户量身定做的开源工具,其核心功能之一是summary函数。这个函数旨在简化模型的开发与调试流程,让模型架构一目了然。通过torchinfo的summary函数,用户可以快速获取模型的详细结构和统计信息&#xff0…

【2024 博客之星评选】请继续保持Passion

我尝试复盘自己2024年走的路,希望能给诸君一些借鉴。 文章目录 回头望感想与收获成长与教训今年计划感恩一些体己话 回头望 回望我的2024年,年初拿高绩效,但感觉逐渐被公司一点点剥离出中心;年中一直在学习防患于未然&#xff1b…

C++ 类- 构造和析构

空类 class A {};空类大小: sizeof(A) 1编译器会默认生成 6 个成员函数: class A { public:A();//构造函数 - 完成对象初始化工作~A();//析构函数 - 完成对象的资源清理A(const A& a);//拷贝构造函数 - 使用同一类中之前创建的对象来初始化新创建…

集群、分布式及微服务间的区别与联系

目录 单体架构介绍集群和分布式架构集群和分布式集群和分布式区别和联系 微服务架构的引入微服务带来的挑战 总结 单体架构介绍 早期很多创业公司或者传统企业会把业务的所有功能实现都打包在一个项目中,这种方式就称为单体架构 以我们都很熟悉的电商系统为例&…

从Windows通过XRDP远程访问和控制银河麒麟ukey v10服务器,以及多次连接后黑屏的问题

从Windows通过XRDP远程访问和控制银河麒麟ukey v10服务器,以及多次连接后黑屏的问题。 安装 rdp 服务: yum install -y epel-release yum install -y xrdp或者如下: 可以通过下载rpm软件包,然后rpm方式安装。访问xrdp官网https…

Maven多环境打包方法配置

简单记录一下SpringBoot多环境打包配置方法,分部署环境和是否包含lib依赖包两个维度 目录 一、需求说明二、目录结构三、配置方案四、验证示例 一、需求说明 基于Spring Boot框架的项目分开发,测试,生产等编译部署环境(每一个环境…

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

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

github汉化

本文主要讲述了github如何汉化的方法。 目录 问题描述汉化步骤1.打开github,搜索github-chinese2.打开项目,打开README.md3.下载安装脚本管理器3.1 在README.md中往下滑动,找到浏览器与脚本管理器3.2 选择浏览器对应的脚本管理器3.2.1 点击去…

阳振坤:AI 大模型的基础是数据,AI越发达,数据库价值越大

2024年1月12日,第四届OceanBase数据库大赛决赛在北京圆满落幕。在大赛的颁奖典礼上,OceanBase 首席科学家阳振坤老师为同学们献上了一场主题为“爱上数据库”的公开课,他不仅分享了个人的成长历程,还阐述了对数据库行业现状与未来…

2.1.3 第一个工程,点灯!

新建工程 点击菜单栏左上角,新建工程或者选择“文件”-“新建工程”,选择工程类型“标准工程”选择设备类型和编程语言,并指定工程文件名及保存路径,如下图所示: 选择工程类型为“标准工程” 选择主模块机型; 选择熟悉的编程语言; 填写工程名,选择存放路径; 确定。 编…

Chrome谷歌浏览器如何能恢复到之前的旧版本

升级了谷歌最新版不习惯,如何降级版本 未完待续。。 电脑中的Chrome谷歌浏览器升级到了最新版本,但是有种种的不适应,如何能恢复到之前的旧版本呢?我们来看看操作步骤,而且无需卸载重装。 怎么恢复Chrome 之前版本&a…

IO进程----进程

进程 什么是进程 进程和程序的区别 概念: 程序:编译好的可执行文件 存放在磁盘上的指令和数据的有序集合(文件) 程序是静态的,没有任何执行的概念 进程:一个独立的可调度的任务 执行一个程序分配资…

LabVIEW处理复杂系统和数据处理

LabVIEW 是一个图形化编程平台,广泛应用于自动化控制、数据采集、信号处理、仪器控制等复杂系统的开发。它的图形化界面使得开发人员能够直观地设计系统和算法,尤其适合处理需要实时数据分析、高精度控制和复杂硬件集成的应用场景。LabVIEW 提供丰富的库…

部署Metricbeat监测ES

官方参考文档 安装Metricbeat curl -L -O https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-7.17.27-linux-x86_64.tar.gztar xzvf metricbeat-7.17.27-linux-x86_64.tar.gz设置 Metricbeat连接到 Elasticsearch 进入metricbeat目录配置metricbeat.yml …