专栏首页萌兔itjava基础_面向对象_内存分析

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

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

面向对象的设计思想

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

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

Java中类和对象的定义

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

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

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

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

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

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

类加载的内存分析

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

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

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

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

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

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

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

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

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

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

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

补充:构造函数

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

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

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

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

本文分享自微信公众号 - 萌兔it(mengtu_it),作者:萌兔IT

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-03-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 前端面试宝典(二)

    Hello小伙伴们,上次的题目做的如何呀~是不是觉得对知识点有了更深层次的理解了呢?我们今天还是6道题目哦!

    萌兔IT
  • JavaScript第七弹——深入理解浅拷贝与深拷贝

    Hello小伙伴们,抱歉这两天没有更文,今天我来将功补过啦,今天的主题是“拷贝”!大家还记得之前说过的数据类型吗,那可是我们今天的基础呢!

    萌兔IT
  • JavaScript入门总结——第二弹学习对象,分清__proto__、prototype

    Hello小伙伴们,我又来啦,今天我们要继续我们JavaScript的入门总结第二弹!!!

    萌兔IT
  • Java虚拟机(二)对象的创建与OOP-Klass模型

    前言 在前一篇文章中我们学习了Java虚拟机的结构原理与运行时数据区域,那么我们大概知道了Java虚拟机的内存的概况,那么内存中的数据是如何创建和访问的呢?这篇...

    用户1269200
  • 你写的Java对象究竟占多少内存?

    Java 作为一个面向对象语言,给我们带来了多态,继承,封装等特性,使得我们可以利用这些特性很轻松的就能构建出易于扩展,易于维护的代码。作为一个Javaer,天...

    会呼吸的Coder
  • 面试被问:一个Java对象占多少内存?

    来源:https://my.oschina.net/luozhou/blog/3175463

    田维常
  • Java基础——类&对象

    定义类的注意: (1)如果类使用了public 修饰符 必须保证当前的文件名和当前类相同 (2) 类名使用名称表示 类表示某一类事物 首字母大写

    羊羽shine
  • 一个Java对象到底占用多大内存?

    最近在调研MAT和VisualVM源码实现,遇到一个可疑问题,两者计算出来的对象大小不一致,才有了这样疑惑。

    乔戈里
  • 经验之道:最有效的 iOS 内存泄漏检测

    通过过去参与过的复杂大型的iOS项目开发经验,开发新的模块的时候,总结出了一套完整的iOS内存自测的方法,通过Instruments来逐步跟踪检测我们创建和主动...

    小时光
  • 手把手:Java内存泄漏分析Memory Analyzer Tool

    点击上方"IT牧场",选择"设为星标"点击上方"IT牧场",选择"设为星标"技术干货每日送达

    用户1516716

扫码关注云+社区

领取腾讯云代金券