2019-08-04 19:57:28
面向对象与面向过程的总结:
1.面向过程和面向对象都是对软件分析、设计和开发的一种思想,它指导着人们以不同的方式去分析、设计和开发软件。(不对立)
2.面向过程思想思考问题时,我们首先思考“怎样按照步骤实现?"并将步骤对应成方法,一步一步,最终完成。这个适合简单任务,不需要多协作的事务。如“如何开车?”
当需要很多协作才能完成时,面向对象的思想应运而生。如“如何造车?” ,需要多人协作, 所以面向对象的思想适合开发一些大型的软件。
3.解决复杂问题时:宏观上使用面向对象把握,微观处理上依然是面向过程(方法与控制语句是典型的面向过程的产物)
4.都是解决问题的思维方式,都是代码组织的方式。
对象是一个在内存中是一个内存块,用来表示一堆相关联的数据以及一些相关的方法。
对象的产生,类比企业发展,更深刻地理解为什么会产生"对象"这个概念。
数据无管理时代:最初的计算机语言只有基本变量(类似基本数据类型),用来保存数据。面对的数据逻辑非常简单不需要涉及"数据管理"的问题。类型与企业初期发展阶段只有几个人,大家都闷头做事就行了。
数据管理和企业部门制:企业发展中,员工多了怎么办?自然的想法是将他们归类。同理在编程中,变量多了,很简单的想法就是“将同类型的数据放在一起”,于是就形成了“数组”的概念,这就是“归类”的概念,便于管理数据、管理人。
对象和企业项目制:一个完整的项目组,就是个创业公司甚至小型公司的编制,大型公司内部都采用“项目制”的方式进行管理。随着计算机编程继续发展,各种变量的类型增多了,而且对数据的操作(指的是方法)也复杂了,为了方便协作和管理,我们”将相关数据和相关方法封装到一个独立的实体”,于是对象产生了;
比如,一个学生对象:
有属性(静态特征):年龄:20 姓名:张三 学号:1706
也可以有方法:学习、吃饭、睡觉
对象和类的概念:类(class)可以看作是对象的模板,或者图纸。类是对象的抽象。对象(class,instance(实例)),我们说某个类的对象与某个类的实例是一个意思。
类=属性+方法,属性(成员变量)用于定义该类对象包含的数据或者说静态特征。 方法用于表示该类或该类实例的行为特征和功能实现。
一个简单的学生类,属性以及方法:
面向对象的内存分析:
java虚拟机的内存可以分为三个区域:栈stack 、堆heap 、方法区method area(也在堆里,作用特殊,所以独立出来)
栈的特点如下:1.栈描述的是犯法执行的内存模型。每个方法被调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)
2.栈属于线程私有,不能实现线程间的共享。启动程序一个程序的时候,这个程序会包含很多的线程。
3.JVM为每个线程创建一个栈,用于存放该线程执行方法的信息。
4.栈的存储特性是“先进先出,后进后出” (子弹夹模型)
5.栈是系统自动分配,速度快!是一个连续的内存空间。
堆的特点如下:1.用于存放创建好的对象和数组(数组也是对象)(new好的对象放在堆里)
2.JVM只有一个堆,被所有线程共享。
3.是一个不连续的内存空间,分配灵活,速度慢!
方法区:1.JVM只有一个方法区,被所有线程共享。
2.方法区实际也是堆,只是用于存储类、常量相关的信息。
3.用来存放程序中永远不变的内容。(静态变量、类信息、字符串常量等)
该程序的内存分析:
public class Student { //属性fields int id; String name; int age; Computer comp; //comp是对象 //方法 void study(){ System.out.println("我在认真学习!使用电脑:"+comp.brand); } void play(){ System.out.println("我在玩游戏"); } //程序执行的入口 //javac Student.java ,java Student(虚拟机启动)执行类 public static void main(String agrs[]){ Student stu=new Student(); //创建对象 stu.id=170602; stu.name="laura"; stu.age=20; Computer c1=new Computer(); c1.brand="联想"; stu.comp=c1; stu.study();//调用study方法 } } class Computer{ //创建一个电脑类,一个java程序中只能有一个public类 String brand; }
简略直观的小图:
垃圾回收机制(Garbage Collection)
垃圾回收机制是Java提供的自动释放内存空间的机制。垃圾回收器(Garbage Collection,GC)是JVM自带的一个线程,用于回收没有被引用的对象。
java引入了垃圾回收机制,可以讲更多的经历放在业务逻辑上而不是内存管理上,大大提高了开发效率。(相当于c++与java两个饭店,c++饭店每次客人吃完饭后需要自己打扫完桌子才能离开,如果不打扫,则下一桌客人无法继续就餐;java饭店则雇佣了一个服务员(GC),每次客人吃完饭后,主动去打扫垃圾,因此生意越来越好)
垃圾回收的过程:1.发现无用的对象 2.回收无用对象占用的空间
垃圾回收的相关算法:1.引用计数法 堆中每一个对象都有一个引用计数。被引用一次,计数器加1.被引用变量值变为null,则计数器减1,直到计数器为0,则表示变为无用对象。优点是算法简单,缺点是“循环引用的无用对象”无法识别。2.引用可达法(根搜索算法)程序把所有的引用关系看作一张图,从一个节点GC ROOT开始,寻找对应的引用节点,找到这个节点后,继续寻找这个节点的引用节点,当所有引用节点寻找完毕之后,剩余的节点被认为是没有引用到的节点,即无用的节点。
通用的分代垃圾回收机制 分代垃圾回收机制是基于这样一个事实:不同对象的生命周期是不一样的。因此,不同生命周期的对象采用不同的回收算法,以便提高回收效率。我们将对象分为三类:年轻代、年老代、持久代。JVM将堆内存分为Eden 、Survivor、Tenured/Old空间。
1.年轻代:所有新生成的对象都是放在Eden区,年轻代的目标就是尽可能快速地收集那些生命周期短的对象,对应的是Minor GC,每次Minor GC会清理年轻代的内存,算法采用效率较高的复制算法,频繁的操作,但是会浪费内存空间。当“年轻代”区域存满对象后,就将对象存放到年老代区域。
2.年老代:在年轻代中经历了N(默认15次)垃圾回收后仍然存活的对象,就会被放在老年代中。因此,当年老对象越来越多,我们就需要启动Major GC和Full GC(全量回收),来一次大扫除,全面清理年轻代区域和年老代区域。
3.持久代:用于存放静态文件,如java类、方法等,持久代对垃圾回收没有显著影响。
容易造成内存泄漏的操作:创建大量无用对象、静态集合类的使用、各种连接对象(IO流对象、数据库连接对象、网络连接对象)未关闭、监听器的使用
注:以后深入了解到相关知识时,再回过头来看这些操作
•要点:1.程序员无权调用垃圾回收器
2.程序员可以通过System.gc(),该方法只是通知JVM,并不是运行垃圾回收器,尽量少用,会申请启动Full GC,成本高,影响系统性能。
3.finalize方法,是java提高给程序员用来释放对象或资源的方法,但是尽量少用。
Minor GC :用于清理年轻代区域。Eden区满了就会触发一次Minor GC,清理无用对象,将有用对象复制到"Survivor 1"、"Survivor 2"区中(这两个区,大小空间相同,同一时刻至于一个在用,一个为空)
Major GC :用于清理老年代区域
Full GC:用于清理年轻代、年老代区域,成本较高,会对系统性能产生影响。
垃圾回收过程:
1.新创建的对象,绝大多数都会存储在Eden中
2.当Eden满了(达到一定比例)不能创建对象,则会触发垃圾回收(GC),用Minor GC将无用对象清理掉。然后剩余对象复制到某个Survivor中,如S1,同时清空Eden区。
3.当Eden再次满了,再查验一遍S1区,清空S1区的无用对象;会将S1中不能清空的对象放在另一个Survivor中,如S2。同时将Eden区不能清空的对象,也复制到S1中,保证Eden和S1均被清空。
4.重复多次Survivor中没有被清理的对象会被放在老年区Old中,老年区达到一定比例也会用Major GC清理。
5.当Old区满了,则会触发一个一次完整的垃圾回收(Full GC),之前新生代的垃圾回收称为(minor GC)