在现实世界中,找对象是一门学问,找对象不在于多而在于精

在计算机世界中,面向对象编程的关键在于能否灵活地运用类,如何设计出一个符合需求的对象也是也是值得学习和思考的。

那么,面向对象编程到底是什么?

面向对象编程中,肯定会涉及对象两个概念。是什么?对象是什么,两者有什么关系?

接下来就一 一地来解答这些疑惑吧

类和对象

  • 类,是指将相同属性的东西放在放在一起,类是一个模板,能够描述一类对象的状态和行为
  • 而对象,就是实际存在某个类中的一个个的个体,所以也被称为实例(instance)。
  • 对象的抽象是类,类的具体化就是对象,也就是类的实例就是对象。

在C语言中,结构体是数据的集合,它将数据捆绑在一起,使得我们可以将这些数据看作是一个整体。而对结构体中的数据
进行操作的函数就写在结构体的外部。

而在面向对象编程中,将表示事物行为的函数也放入了这个整体,就形成了对象的概念。使得这个整体既描述属性,又能描述行为。

所以,面向对象编程是一种将关注点置于对象Object本身的程序设计方法,对象的构成要素包含对象的行为及操作,以此基础进行编程。

这种方法使得程序易于复用。OOP主要使用的编程技巧有:继承封装多态三种。

说了这么多,是不是看晕了,没关系,继续往下看。

现实世界中的抽象

在现实生活中,可以将人看成一个类,这类称为人类(抽象类)

如果某个男孩想找一个对象(女朋友),那么所有的女孩都是这个男孩选女朋友的范围,所有的女孩就是一【类】

  • 对象

如果这个时候男孩已经找到喜欢的对象了,他的女朋友名字叫【林允儿】。那么假设这个名字是唯一的,此时名字叫【林允儿】的这个女孩就是一个对象(小声bb,其实她是我老婆hē hē hē hē[狗头])

接下来通过具体的代码来讲解一下

在这里,定义了一个抽象类-人,在人的这个抽象类里面,包含了人的一些属性行为,代表了人具有的共同属性

然后,定义了一个子类Man子类Woman继承父类Person,里面包含了共同拥有的属性,并增加了性别sex,然后对方法进行了重写

那么,他们的关系就是如下图:

所以,一个类的基本组成为下图:

那么,我们再来编写下测试代码:

运行结果:

接下来,是最有意思的部分,我们来分析下代码中new的时候发生了什么。

new操作的过程

当我们new一个对象的时候JVM首先会去找到对应的类元信息,如果找不到意味着类信息还没有被加载,所以在对象创建的时候也可能会触发类的加载操作。当类元信息被加载之后,我们就可以通过类元信息来确定对象信息和需要申请的内存大小。

对象创建的流程

1.构建对象

首先main线程会在栈中申请一个属于自己的栈空间,然后我们调用main方法的时候,会生成一个main方法的栈帧,然后执行new Man(),这里会根据Man类的元信息先确定对象的大小,然后在JVM堆里申请一块内存区域并构建对象,同时对Man对象成员变量信息
并赋予默认值(在这里会涉及多态,在内存中的分配情况有机会再解释解释)。

2.初始化对象

这一步会执行对象内部的init方法,初始化成员变量值,即执行对象的构造方法(这里调用父类的构造方法进行赋值),构造方法执行完,此时的age = 21,name = "codevald"。

3.引用对象

对象实例化完成之后,再把栈中的Person对象引用地址指向Man对象在堆内存中的地址

4.继续构造、初始化,引用对象对象

这一步和上面三个步骤一样,就不详细说了
附上图



5.调用方法

调用speak()方法的时候,会先找到Person对象(codevald)中的引用地址,找到真正的在堆内存中的Man对象,执行speak()方法,执行的时候,会调用父类中的成员变量,所以会找到堆内存中的父对象的成员变量(name和age),加载进来,进行输出

我的名字是: codevald 我今年21岁了.

调用sayInfo()方法的时候,一样先找到对象(codevald)中的引用地址,找到真正的在堆内存中的Man对象,执行sayInfo()方法,执行的时候,会找到Person对象(linyuner)的地址,即指向堆内存中的Woman对象,找到父类里面的成员变量(name和age),进行输出

我的女朋友是:linyuer 她今年20岁了.

下面的代码的执行过程同理,就留给小伙伴们自行去分析啦~

附上TestPerson的字节码文件,感兴趣的小伙伴可以自行查看进行分析

学无止境,我们曾经擅长的正在被淘汰,不擅长的却是仍然存在。最基础的往往是最难的,而往往也是最重要的,平时注重基础的积累,学会去分析底层的执行过程,才是学习中最应该掌握的技能,希望这篇回答能帮到正在寻找这个问题的答案的你~

如果觉得这篇文章不错的话,记得帮我@codevald点个赞哟,感谢您的支持!

new的过程是怎样的?看完这一篇就懂了的更多相关文章

  1. 看完让你彻底搞懂Websocket原理

    偶然在知乎上看到一篇回帖,瞬间觉得之前看的那么多资料都不及这一篇回帖让我对 websocket 的认识深刻有木有.所以转到我博客里,分享一下.比较喜欢看这种博客,读起来很轻松,不枯燥,没有布道师的阵仗 ...

  2. 转--看完让你彻底搞懂Websocket原理

    偶然在知乎上看到一篇回帖,瞬间觉得之前看的那么多资料都不及这一篇回帖让我对 websocket 的认识深刻有木有.所以转到我博客里,分享一下.比较喜欢看这种博客,读起来很轻松,不枯燥,没有布道师的阵仗 ...

  3. Sql Or NoSql,看完这一篇你就懂了

    前言 你是否在为系统的数据库来一波大流量就几乎打满CPU,日常CPU居高不下烦恼?你是否在各种NoSql间纠结不定,到底该选用那种最好?今天的你就是昨天的我,这也是写这篇文章的初衷. 这篇文章是我好几 ...

  4. Sql Or NoSql,看完这一篇你就懂了(转五月的仓颉)

    前言 你是否在为系统的数据库来一波大流量就几乎打满CPU,日常CPU居高不下烦恼?你是否在各种NoSql间纠结不定,到底该选用那种最好?今天的你就是昨天的我,这也是写这篇文章的初衷. 这篇文章是我好几 ...

  5. Springboot 整合RabbitMq ,用心看完这一篇就够了

    该篇文章内容较多,包括有rabbitMq相关的一些简单理论介绍,provider消息推送实例,consumer消息消费实例,Direct.Topic.Fanout的使用,消息回调.手动确认等. (但是 ...

  6. 了解Java内存模型,看完这一篇就够了

    前言(此文草稿是年前写的,但由于杂事甚多一直未完善好.清明假无事,便收收尾发布了) 年关将近,个人工作学习怠惰了不少.两年前刚做开发的时候,信心满满想看看一个人通过自己的努力,最终能达到一个什么样的高 ...

  7. 什么是服务端渲染、客户端渲染、SPA、预渲染,看完这一篇就够了

    服务端渲染(SSR) 简述:     又称为后端渲染,服务器端在返回html之前,在html特定的区域特定的符号里用数据填充,再给客户端,客户端只负责解析HTML.     鼠标右击点击查看源码时,页 ...

  8. 看完这一篇,再也不怕面试官问到IntentService的原理

    IntentService是什么 在内部封装了 Handler.消息队列的一个Service子类,适合在后台执行一系列串行依次执行的耗时异步任务,方便了我们的日常coding(普通的Service则是 ...

  9. Python虚拟环境和包管理工具Pipenv的使用详解--看完这一篇就够了

    前言 Python虚拟环境是一个虚拟化,从电脑独立开辟出来的环境.在这个虚拟环境中,我们可以pip安装各个项目不同的依赖包,从全局中隔离出来,利于管理. 传统的Python虚拟环境有virtualen ...

随机推荐

  1. Ubuntu安装 Sublime Text 及常用插件推荐

    之前一直在用 Code Blocks 这个IDE工具,可用着还是感觉不怎么好,于是在网上找到了一篇文章,上面介绍了不少IDE,我找到了Sublime Text 感觉挺不错的. 帖子地址: http:/ ...

  2. 自动化运维工具-Ansible之1-基础

    自动化运维工具-Ansible之1-基础 目录 自动化运维工具-Ansible之1-基础 Ansible 基本概述 定义 特点 架构 工作原理 任务执行模式 命令执行过程 Ansible 安装 Ans ...

  3. 4.简单的 GNU 汇编语法

    芯片启动时很多设备没有初始化,需要汇编语言进行准备. 简单的GNU汇编语法: 1 label: instruction @ comment label :标号,类似于外号,为所在位置做标号,可以通过这 ...

  4. Linux设备上没有空间之复盘

    某天前端在调接口的时候,发现登录页面得验证码接口居然没有响应数据,显示的是500响应码.于是我一路排查,首先排查验证码接口所属的微服务是否正常,通过lsof -i:服务端口进行排查,发现该微服务进程存 ...

  5. Java8接口的默认方法

    项目实战 实现上图接口的实现类有很多,其中有些实现类已经在生成环境了,现在需要新增几个实现类,都需要有回调方法,所以在接口中添加了一个回调的默认方法,如果使用接口的普通方法就得改所有实现了接口的实现类 ...

  6. 实战Git命令(界面操作+命令行)

    先说明下公司的发版步骤,当需要开发一个新的功能,先从master分支中拉出一个自己的分支a(假设分支为a),在a分支开发功能完后,需要切换到dev分支,然后把自己的分支a合到dev分支,部署测试环境让 ...

  7. Modbus 仿真测试工具 Mod_Rssim 详细图文教程

    Mod_RSsim是一款轻量级的Modbus从机模拟器,它可以模拟ModBusTCP和ModBusRTU的从机,能够同时模拟254个被控站,软件使用简单方便,可以满足一般的主机调试. 官方网站:www ...

  8. 【SpringMVC】SpringMVC 拦截器

    SpringMVC 拦截器 文章源码 拦截器的作用 SpringMVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理. 谈到拦截器,还有另外一个概 ...

  9. wpf 在不同DPI下如何在DrawingVisual中画出清晰的图形

    环境Win10 VS2017 .Net Framework4.7.1   本文仅讨论在DrawingVisual中进行的画图.   WPF单位,系统DPI,显示器DPI三者的定义及关系 WPF单位:一 ...

  10. 解压rpm文件

    rpm2cpio zabbix-2.2.2-0.el6.zbx.src.rpm |cpio -div