Java进阶 之 再论面向对象(1)——面向对象的编程思想 Java中的类和对象 深入认识对象,内存图解+变量作用域+参数传递

news2025/2/26 5:17:04

在这里插入图片描述

前言

我们都知道Java是一门面向对象object-oriented(OOP)的编程语言,但究竟什么是面向对象,为什么要用面向对象,往往会语焉不详。

本篇博客从面向过程和面向对象的编程思想谈起,阐述了类和对象在Java中的编程中的应用,此外,对于对象的内存,变量作用域,参数传递等进行了阐述。

其他相关的Java进阶相关的博客文章合集如下:

【合集】Java进阶——Java深入学习的笔记汇总 & JVM底层、多线程、类加载 …

在这里插入图片描述

目录

  • 前言
  • 引出
  • 编程思想
    • 什么是思想
    • 编程思想分类
    • 面向过程与面向对象对比
    • 面向对象举例
      • 1.面向过程解决
      • 2.面向对象解决
    • 面向对象思维方式的好处
    • 总结
  • 类和对象
    • 对象在需求中的使用
    • 对象在代码中的体现
    • 使用定义好的类
      • 创建对象
      • 测试
  • 深入认识对象
    • 对象的内存图解
      • 说明
      • 图示
    • 类和对象的区别
    • 局部变量和成员变量区别
    • 基本类型和引用类型作为参数传递
      • 1.基本类型作为参数传递
      • 2.引用类型作为参数传递
  • 总结

引出


从面向过程和面向对象的编程思想谈起,阐述了类和对象在Java中的编程中的应用,此外,对于对象的内存,变量作用域,参数传递等进行了阐述。

编程思想

什么是思想

何谓编程思想?首先解释一下“思想”。

先问你个问题:你想做个怎样的人?

可能你会回答:我想做个好人,孝敬父母,尊重长辈,关爱亲朋…

你看,这就是思想。这是你做人的思想,或者说,是你做人的原则。做人有做人的原则,编程也有编程的原则。这些编程的原则呢,就是编程思想。

编程思想分类

  • 面向对象:Object Oriented Programming
  • 面向过程:Procedure Oriented Programming

面向过程与面向对象都是我们编程中,编写程序的一种思维方式。

面向过程与面向对象对比

  • 面向过程

    面向过程的程序设计方式,是遇到一件事时,思考“我该怎么做”,然后一步步实现的过程。

    例如:公司打扫卫生(擦玻璃、扫地、拖地、倒垃圾等),按照面向过程的程序设计方式会思考“打扫卫生我该怎么做,然后一件件的完成”,最后把公司卫生打扫干净了。

  • 面向对象

    面向对象的程序设计方式,是遇到一件事时,思考“我该让谁来做”,然后那个“谁”就是对象,他要怎么做这件事是他自己的事,反正最后一群对象合力能把事就好就行了。

    例如,公司打扫卫生(擦玻璃、扫地、拖地、倒垃圾等),按照面向对象的程序设计方式会思考“我该让谁来做,如小明擦玻璃、让小丽扫地、让小郭拖地、让小强倒垃圾等”,这里的“小明、小丽、小郭、小强”就是对象,他们要打扫卫生,怎么打扫是他们自己的事,反正最后一群对象合力把公司卫生打扫干净了。

面向对象举例

需求:买电脑(组装机)

1.面向过程解决

假如我们需要买组装电脑,这时首先会在网上查询具体每一个硬件的参数和报价。然后会去电脑城进行多家询价,接着询价结束后回家根据具体的结果分析出自己比较满意的哪家报价,接着会到这家店里进行组装,组装时还需要进行现场监督,组装完成安装相应的系统,然后电脑抱回家。

分析上述整个过程大体分一下几步:上网查询参数和报价、电脑城询价、现场安装和监督、抱电脑回家。在整个过程中我们参与了每一个细节,并且会感觉相当累。

2.面向对象解决

假如我们需要买组装机,这时应该找一个懂电脑硬件的人,让他帮我们查看参数和报价,并进行询价和杀价,以及现场组装监督。而我们自己并不需要亲历亲为具体怎么做,只要告诉这个人我们想要的具体需求即可。

分析上述整个过程,发现瞬间变的十分轻松,只要找到懂电脑硬件的这个人,我们的问题都可以解决。并且在这个过程中我们不用那么辛苦。

面向对象思维方式的好处

通过生活中的真实场景使用面向对象分析完之后,我们开始分析面向过程和面向对象的差异做出总结:

  • 面向对象思维方式是一种更符合人们思考习惯的思想
  • 面向过程思维方式中更多的体现的是执行者(自己做事情),面向对象中更多的体现是指挥者(指挥对象做事情)。
  • 面向对象思维方式将复杂的问题简单化。
  • 程序员从面向过程的执行者转化成了面向对象的指挥者。

总结

洗衣服:

面向过程:把衣服脱下来—>找盆—>放洗衣粉—>加点水—>浸泡10分钟—>揉一揉—>清洗衣服—>拧干—>晾起来

面向对象:把衣服脱下来—>打开全自动洗衣机—>扔衣服—>按钮—>晾起来

区别:

  • 面向过程:强调步骤。
  • 面向对象:强调对象,这里的对象就是洗衣机。

类和对象

对象在需求中的使用

对面向对象有了了解之后,我们来说说在具体问题中如何使用面向对象去分析问题,和如何使用面向对象。

我们把大象装冰箱为例进行分析。

在针对具体的需求,可以使用名词提炼的办法进行分析,寻找具体的对象。

需求:把大象装冰箱里

对象:大象、冰箱

分三步:

1、打开冰箱门

2、将大象装进去

3、关闭冰箱门

分析发现打开、装、关闭都是冰箱的功能。即冰箱对象具备如下功能:

冰箱打开

冰箱存储

冰箱关闭

用伪代码描述,上述需求中有两个具体的事物 大象 和 冰箱

 描述大象:

 class 大象
	{}

 描述冰箱:

 class 冰箱
{
     void 打开(){}
     void 存储(大象){}
     void 关闭(){}
 }

当把具体的事物描述清楚之后,需要使用这些具体的事物,Java使用具体的事物,需要通过new关键字来创建这个事物的具体实例。

使用对象:

1、创建冰箱的对象

冰箱 bx = new 冰箱();

2、调用冰箱的功能

对象.功能();

bx.打开();

bx.存储(new 大象());

bx.关闭();

总结:

  • 先按照名词提炼问题领域中的对象
  • 对对象进行描述,其实就是在明确对象中应该具备的属性和功能
  • 通过new的方式就可以创建该事物的具体对象
  • 通过该对象调用它以后的功能。

对象在代码中的体现

在分析现实生活中的事物时发现,这些事物都有其具体的特点和功能,这些特点和功能就组成了这个特殊的事物。

描述小汽车。

分析:

事物的特点(属性):

颜色。

轮胎个数。

事物的(功能):

运行。

可以简单理解:属性就是数值,其实就是变量;行为就是功能,就是方法。

小汽车

{

​ 颜色;

​ 轮胎个数;

​ 运行() { }

}

通过计算机语言Java来描述这个事物:

定义类的格式:

public class 类名 {
    //可编写0至n个属性
    数据类型 变量名1;
    数据类型 变量名2//可编写0至n个方法
    修饰符 返回值类型 方法名(参数){
        执行语句;
    }
}

汽车类:

public class Car {
    String color;
    int number;
    public void run() {
        System.out.println(color + ":" + number);
    }
}

通过代码的描述,知道类的真正意义就是在描述事物。属性和功能统称为事物中的成员。

  • 事物的成员分为两种:成员属性和成员功能。
  • 成员属性在代码中的体现就是成员变量
  • 成员功能在代码中的体现就是成员方法

使用定义好的类

创建对象

# 类名 对象名 = new 类名();

测试

public class CarDemo {
    public static void main(String[] args) { 
        // 1,创建Car的对象。给对象起个名字。
        Car c = new Car();// c是类类型的变量。c指向了一个具体的Car类型的对象。
        // 2,通过已有的对象调用该对象的功能。格式:对象.对象成员;
        // 3,可以该对象的属性赋值。
        c.color = "red";
        c.number = 4;
        c.run();
    }
}

深入认识对象

对象的内存图解

说明

经过上面对小汽车的描述,和Java代码测试,我们虽然可以将生活中的事物使用Java代码描述出来,但是这些代码在内存中是如何执行的,接下来我们需要研究下对象在内存的图解。

接下来就是分析对象在内存中的分配情况。这里需要画图一步一步演示,严格按照画图流程讲解内存对象创建过程。

图示

在这里插入图片描述

类和对象的区别

面向对象的编程思想力图在程序中对事物的描述与该事物在现实中的形态保持一致。为了做到这一点,面向对象的思想中提出两个概念,即类和对象。其中,类是对某一类事物的抽象描述,而对象用于表示现实中该类事物的个体。接下来通过一个图例来抽象描述类与对象的关系,如下图所示。

在这里插入图片描述

在上图中,可以将玩具模型看作是一个类,将一个个玩具看作对象,从玩具模型和玩具之间的关系便可以看出类与对象之间的关系。类用于描述多个对象的共同特征,它是对象的模板。对象用于描述现实中的个体,它是类的实例。从上图中可以明显看出对象是根据类创建的,并且一个类可以对应多个对象。

经过前面几个知识点的学习,基本上掌握了类是用于描述事物的,类中可以定义事物的属性和行为。而对象是通过描述的这个类,使用new关键字创建出来,通过对象就可以调用该对象具体的属性和功能了。

局部变量和成员变量区别

理解清楚了类和对象之后,发现在描述类的属性和前面学习定义变量差别不大,唯一区别就是位置发生了改变,那么类中定义的变量,和在方法定义的变量有啥差别呢?

回忆以前学习时变量的定义方式和位置,以及现在定义类中属性的特点。总结下面几点异同:

  • 区别一:定义的位置不同

    • 定义在类中的变量是成员变量
    • 定义在方法中的变量是局部变量
  • 区别二:在内存中的位置不同

    • 成员变量存储在对内存的对象中
    • 局部变量存储在栈内存的方法中
  • 区别三:声明周期不同

    • 成员变量随着对象的出现而出现在堆中,随着对象的消失而从堆中消失
    • 局部变量随着方法的运行而出现在栈中,随着方法的弹栈而消失
  • 区别四:初始化不同

    • 成员变量因为在堆内存中,所有默认的初始化值
    • 局部变量没有默认的初始化值,必须手动的给其赋值才可以使用。

基本类型和引用类型作为参数传递

1.基本类型作为参数传递

在这里插入图片描述

基本类型作为参数传递时,其实就是将基本类型变量x空间中的值复制了一份传递给调用的方法show(),当在show()方法中x接受到了复制的值,再在show()方法中对x变量进行操作,这时只会影响到show中的x。当show方法执行完成,弹栈后,程序又回到main方法执行,main方法中的x值还是原来的值。

2.引用类型作为参数传递

在这里插入图片描述

当引用变量作为参数传递时,这时其实是将引用变量空间中的内存地址(引用)复制了一份传递给了show方法的d引用变量。这时会有两个引用同时指向堆中的同一个对象。当执行show方法中的d.x=6时,会根据d所持有的引用找到堆中的对象,并将其x属性的值改为6.show方法弹栈。

由于是两个引用指向同一个对象,不管是哪一个引用改变了引用的所指向的对象的中的值,其他引用再次使用都是改变后的值。

总结


1.什么是类

:是一组相关属性行为的集合。可以看成是一类事物的模板,使用事物的属性特征和行为特征来描述该

类事物。

现实中,描述一类事物:

  • 属性:就是该事物的状态信息。
  • 行为:就是该事物能够做什么。

举例:小猫。

  • 属性:名字、体重、年龄、颜色。
  • 行为:走、跑、叫。

2.什么是对象

对象:是一类事物的具体体现。对象是类的一个实例,必然具备该类事物的属性和行为。

现实中,一类事物的一个实例:一只小猫。

举例:一只小猫。

  • 属性:tom、5kg、2 years、yellow。
  • 行为:溜墙根走、蹦跶的跑、喵喵叫。

3.类和对象的关系

  • 类:类是对现实生活中一类具有共同属性和行为的事物的抽象
  • 对象:是能够看得到摸的着的真实存在的实体
  • 简单理解:类是对事物的一种描述,对象则为具体存在的事物

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

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

相关文章

044:mapboxGL利用fill-extrusion自定义挤出状建筑体

第044个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中利用fill-extrusion自定义挤出状建筑体。填充挤压样式图层在地图上渲染一个或多个填充(以及可选的描边)挤压(3D)多边形。 您可以使用填充拉伸图层来配置多边形或多多边形要素的拉伸和视觉外观。 直接复…

JMeter定时器

一. 同步定时器(Synchronizing Timer) (在Loadrunner中叫做集合点) 思考: 如何模拟多个用户同时抢一个红包?如何测试电商网站中抢购活动、秒杀活动? 1.1 介绍 Sync Timer的目的是阻塞线程,直…

【算法-动态规划】完全背包问题

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

计算机毕业设计选什么题目好?springboot 儿童福利院管理系统

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

【Java 定时任务】crontab定时任务配置(139)

背景 在日常的开发工作中我们经常会遇到定时任务的相关问题,比如: 信用卡定时每月给用户推送账单数据; 轮训更新某个任务的状态是否完成; 设置一个定时提醒; 邮件或消息设置定时发送; 定时统计某个时间段的…

高压放大器在软体机器人领域的应用

软体机器人是一种新型机器人技术,与传统的硬体机器人有着很大的不同。软体机器人通常由柔软的材料制成,具有高度的柔韧性和灵活性,并且可以实现多种形状和动作。但是,软体机器人的发展面临很多技术挑战,其中之一就是控…

信息与网络安全基础知识汇总

需要面试真题和考证资料的 面试真题考证资料点我领取 面试真题考证资料点我领取 面试真题考证资料点我领取 一、概述 1.网络信息安全基本概念 信息安全:是指信息网络中的硬件、软件及其系统中的数据受到保护,不受偶然的或者恶意的原因而遭到破…

2023年中国潜望式镜头市场发展趋势分析:潜望式镜头渗透将进一步提升[图]

随着摄像技术的渐渐成熟,专业摄影师对镜头的要求越来越高,所以产生了潜望式镜头,“潜望镜式变焦”镜头俗称“内变焦”镜头,由于光学变焦是在机身内部完成,所以可以很容易安装滤镜,无需额外安装镜头筒。其次…

推荐16款最好的3dMax插件

3DMAX本身就是一个非常复杂的3d软件,有许多功能。所有的建模、动画和模拟工具都在其中.然而,也有由外部作者创建的插件或脚本。 这些插件可以显著改善和促进3DMAX的工作的。在许多情况下,它们超出了这个应用程序的基本工具,并引入了原始创造者未提供的功能。下面就给大家介绍…

C语言之文件操作篇(1)

目录 为什么要使用文件 什么是文件 文件名 文件名的访问路径 相对路径 绝对路径 文件类型 文件缓冲区 文件指针 文件的打开与关闭 fopen fclose 打开方式如下 w r 今天我们来介绍C语言的文件操作。之前我们实现的通讯录有两个问题 信息太多,空间小了…

什么是无人直播呢?

无人直播是指通过技术手段实现直播间不停播,从而无需主播真人出镜参与直播。这种直播方式通常需要使用一些特定的软件或工具,例如虚拟背景软件等。 无人直播通常用于一些商业目的,如广告宣传、产品销售等。 通过无人直播,商家可…

2023年中国在线问诊行业发展历程及趋势分析:线上医疗将朝服务多样化、智慧化发展[图]

在线问诊是指通过开设线上义诊等通道进行诊疗的活动,主要作用是可防止线下就诊造成交叉感染。在线问诊平衡医疗资源供给,但问诊顺利开展的前提是可以提供专业的诊断或医疗建议。线上问诊病人很难甄别医生的资质,所以只能作基础性诊断参考。 …

ssm+vue的培训学校教学管理平台(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频: ssmvue的培训学校教学管理平台(有报告)。Javaee项目,ssm vue前后端分离项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结…

keepalived+nginx实现高可用

1.安装keepalived、nginx yum install keepalived –y//centos默认无nginx源 rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpmyum install -y nginx2.修改keepalived配置文件(/etc/keepalived/keepalived.c…

代码随想录算法训练营第六十二、六十三天 | 单调栈 part 2 | 503.下一个更大元素II 、42. 接雨水、84.柱状图中最大的矩形

目录 503.下一个更大元素II思路代码 42. 接雨水思路一 双指针思路二 单调栈代码 84.柱状图中最大的矩形思路一 双指针思路二 单调栈代码 503.下一个更大元素II Leetcode 思路 将数组乘2来遍历即可,就是加长版的每日温度。 但是处理起来会有细节,如果…

Annoy vs Milvus:哪个向量数据库更适合您的AI应用?知其然知其所以然

1. Annoy vs Milvus简介 Annoy 和 Milvus 都是用于向量索引和相似度搜索的开源库,它们可以高效地处理大规模的向量数据。 Annoy(Approximate Nearest Neighbors Oh Yeah): Annoy 是一种近似最近邻搜索算法,它通过构…

微信小程序服务通知(订阅消息)定时推送消息功能

首先先说项目需求:向预约参观的用户提前一天晚上8点推送消息。小程序端主要用到的API是我是小程序用到的API。以及服务端用到的API:我是服务端用到的API。 1. 开通订阅消息功能 (1)、 首先需要在小程序管理后台开通订阅消息功能。没开通前如下图所示: …

解读提示工程(Prompt Engineering)

提示工程(Prompt Engineering),也称为上下文提示,是一种通过不更新模型的权重/参数来引导LLM行为朝着特定结果的方法。这是与AI有效交流所需结果的过程。提示工程可以用于各种任务,从回答问题到算术推理乃至各种应用领…

Python爬虫技术

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。关…

只有正规才有机会,CTF/AWD竞赛标准参考书来了

目录 前言 一、内容简介 二、读者对象 三、目录 前言 随着网络安全问题日益凸显,国家对网络安全人才的需求持续增长,其中,网络安全竞赛在国家以及企业的人才培养和选拔中扮演着至关重要的角色。 在数字化时代,企业为了应对日益…