JAVA面向对象

      类和对象

      类:类是对对象的一种抽象描述,也就是说,类其实就是定义对象的一个模板,在这个模板里面充分描述了对象所具有的属性和行为(方法)

    对象:通过类具体创建出来的实体,就是对象,这些对象是可以拿来使用的,一个类可以创建出任意个相同的对象(也就是一对多关系)

所以,在编写代码时,必须先编写类(Class),然后通过这个Class来创建对象,创建对象使用new关键字(例如:People p = new People())
类加载器和加载过程、

我们都知道,当我们编写完一个类以后,需要通过javac编译成成对应的class字节码文件(也就是将java源文件编译成二进制的字节码文件)

概念:
当运行一个Java程序的时候,JVM(Java虚拟机)首先要做的事情就是类加载。类加载是通过类加载器(ClassLoader)来完成的。当类加载加载完class文件以后,会对这个class文件创建一个Class对象。Class对象就是在内存中队字节码文件的一个具体描述,以后创建的所有实例,都是由这个Class对象来创建的,每一个class文件对应着一个Class对象,这个Class对象是有JVM创建的。

1)Java中的类加载器主要分为三类:
     BootClassLoader(启动类加载器,主要是用于加载JRE\lib文件夹下的jar文件,其中有一个是rt.jar包,这个jar包含了JDK的核心类库。这个类加载器是使用C++语言编写的,所以在Java程序中不能直接使用它,因此这个类加载器是由JVM在启动时创建来使用的。) 

    ExtClassLoader(扩展类加载器,它主要用于加载jre\lib\ext目录下的jar文件,这个目录下是jre的扩展类库)

     AppClassLoader(系统类加载器,它主要用于加载classpath下的class文件以及jar包,通常我们自己编写的类都是由这个加载器来完成的)

这三个类加载器的加载顺序:
在加载一个class的时候,是基于双亲委模型来加载的,
AppClassLoader首先会调用ExtClassLoader来加载,ExtClassLoader又会委托给BootClassLoader来加载,
当父类加载器不能加载该class的时候,又会让其子类来加载,
当所有加载器都不能加载这个class文件时,就会引发一个ClassNotFoundException异常,表示无法找到该类文件。
JVM的内存配置
JVM在运行时将内存分为三大块:
1.
栈是遵循先进后出的原则(先入栈的变量最后才出栈)。
局部变量都是在栈中分配的,如果变量是基本数据类型,那么这个变量的值一并存放在栈中。如果是引用数据类型,那么在栈中存放的只是一个引用地址,这个地址是只想堆中的对象首地址。

2.
只要通过new关键字创建出来的对象,都会分配到堆中,每个对象在堆中都会有一个唯一的地址,这个地址可以被栈中的变量所引用。

堆中的对象通常存放实例变量,实例变量是随着对象的创建而创建,也随着对象的销毁而销毁,每个实例都有自己的实例变量,他们之间是互不影响的,不会产生共享。

(注意:在参数传递的过程中,如果参数的类型是基本数据类型,那么传递过去的就是基本数据类型的值,如果参数的类型是引用数据类型,那么传递过去的是一个引用地址的值,这个引用地址同样是指向堆中的同一个对象)

关于垃圾回收:当堆中的任何一个对象没有引用指向它的时候,这个对象就被视为垃圾对象,JVM会在定期去自动回收它,并释放内存。 
3.方法区
方法区中通常用于存放类加载的class信息(字段信息,方法信息,类的信息,接口信息,还包括静态变量,以及常量等等)当这些信息加载到方法区后,jvm就会根据这些信息构建一个Class对象