java基础_面向对象_内存分析

Wesley13
• 阅读 562

Hello小伙伴们今天兔妞兔君都好忙,所以给大家分享的是同事帅GG的投稿呢主要讲的就是面向对象的设计思想、Java中类和对象的定义以及类加载的内存分析。

面向对象的设计思想

java基础_面向对象_内存分析

首先说明一点,面向对象是Java的重中之重,面向对象的设计思想本身不是特别难理解但是想要用的特别好,需要长时间的锤炼才行。那么面向对象到底是啥?我个人感觉是更宏观的思考方式、更符合人类在日常的思维逻辑中经常采用的思想方法与原则,它的设计出发点是为了更能直接的描述问题域中客观存在的事物。

对象则是计算机语言对问题域中事物的描述,对象拥有属性和方法,就类似于生活中事物基本上都有静态属性和动态属性。马士兵老师举过一个例子,什么是瓶子?瓶子这个概念是?喝水的就是瓶子吗?显然不是碗也能啊,当然你要是乐意水缸也是可以的,还有想喝斯嘉丽的洗澡水的呢,所以说不好说。细致去想瓶子静态属性上有一个瓶底 、瓶壁等,动态属性上可以倒水等。瓶子是一类事物的抽象,Bottle类。平常看到的都是Bottle b1 = new Bottle();的对象的引用b1。

Java中类和对象的定义

java基础_面向对象_内存分析

类是描述同一类型的是对象的一个抽象的概念,类中定义了这一类对象所具有的静态和动态属性。就像上面提到的Bottle类。

 类和对象的关系:类可以看成一类对象的模板,而对象可以看成该类的一个具体实例。

 类与类之间是有这不同的关系,是Java体系中最常见的知识。

继承:一般和特殊的关系。学生是一个人 老师是一个人 你会想到Person类&Student类。继承很有可能会产生一个继承树,C++存在多重继承,但是有问题 如果他们的父类的成员变量存在重名的情况就会变得复杂。

简单总结:假设你遇到问题的时候使用面向对象的思维不应该是先考虑第一步干啥第二步干啥,而是首先是整个问题域中应该有哪些类哪些对象;其次这些类应该具有的属性和方法;最后这些类或对象之间应该是什么关系。这才面向对象对象的设计思想啊。

比如我上个项目中是独立开发的记账类新项目,在你拿到这个新项目的时候,在记账这个问题域中,应该具有的类和方法,那应该有账单类,账单类有记账时间、记帐类别等基本属性。

类加载的内存分析

java基础_面向对象_内存分析

Java中的对象是通过引用对其操作的。理解了内存就理解了一切。先看最简单的代码:

String s ;//声明了一个String类型的应用变量。但并没有使它指向一个对象。

s= new String("hello");// 使用new语句创建了一个String类型的对象并用s指向它 以后可以通过s完成对其的操作

s就称为对象的引用。上面那段基本代码在内存中是如何分配的呢?

引用类型和基本类型不同(8种基本类型内存中只占一块空间),在内存中占2块空间。new出来的对象在堆空间中分配内存,String s 是声明了一小块内存名称叫s,其中值在对象未初始化(new)之前是为null,初始化后其中值是一个地址,根据此地址能找到new出来的对象。说迷糊了,看图:

java基础_面向对象_内存分析

总的来说,实际当中new出来的是在堆内存中,我们用的时候是拿着对象的引用去找到它。

有没有想为什么对象在堆内存?因为堆内存是动态分配内存的,只有在运行的过程当中才会有new一个对象放到堆内存中,至于具体new的东西多大、占多大空间你是没有办法提前知道的。也只有在运行期间你才知道这个对象要给它分配多大的空间,堆内存比较大。 要是不用了怎么办,那就是我们常说的垃圾,然后垃圾回收器就会回收掉占用的那块内存 。

对象是new出来的 ,位于堆内存,类的每个成员变量在不同的对象中都有不同的值(除了静态变量),而方法只有一份,只有调用执行的时候才占用内存。

再补2张图,仔细体会一下内存的分配过程,在内存中分析类和对象的关系。

java基础_面向对象_内存分析

在栈空间中分配一个c1出来,c1里面有值,通过值(地址)就能找到new出来的某一个c这个对象,这个对象中有i和j,通过c1.i就能拿到里面的值。

下面是有参构造的类初始化过程:

java基础_面向对象_内存分析

补充:构造函数

使用new+构造方法创建一个新的对象

构造函数是定义在Java类中一个用来初始化对象的函数。

构造函数与类同名且没有返回值。

好啦,这就是小伙伴的分享呢,兔妞觉得写得很棒,你觉得呢,喜欢就请关注+好看哦~~

本文分享自微信公众号 - 萌兔it(mengtu_it)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Wesley13 Wesley13
3年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。  !(http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)  2
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这