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)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。