JAVA学习笔记 06——面向对象和类

面向对象:

类和对象可以和表格进行一一的对应:表格结构对应类,一行内容对应一个对象。

互联网上所有的数据本质上都是“表格”。


面向对象(Oriented-Object)思想更契合人的思维方式。面向对象可以帮助我们从宏观上把握整个系统。


面向过程是一种“执行者思维”,解决简单问题可以使用面向过程。

面向对象是一种“设计者思维”,解决复杂、需要协作的问题可以使用面向对象。


面向对象离不开面向过程

宏观上:通过面向对象进行整体设计

微观上:执行和处理数据,仍然面向过程



类可以看作是一个模板,或者图纸,系统根据类的定义来找出对象。

类:我们叫做class,对象:我们叫做Object,instance(实例)。


类的定义:class 类名{定义内容}

对于一个类来说:一般有三种常见的成员:属性field方法method构造器constructor,这三种成员都可以定义零个或多个。


JAVA学习笔记 06——面向对象和类


属性:用于定义该类或该类对象包含的数据或者说静态特征,属性作用范围是整个类体。在定义成员变量时可以对其初始化,如果不对其初始化,Java使用默认的值对其初始化。


方法:用于该类或该类实例的行为特征和功能实现。方法是类和对象行为特征的抽象。方法很类似于面向过程中的函数。面向过程中,函数是最基本单位,整个程序由一个个函数调用组成。面向对象中,整个程序的基本单位是类,方法是从属于类和对象的。


构造器:也叫构造方法(constructor),用于对象的初始化。构造器是一个创建对象时被自动调用的特殊方法,目的是对象的初始化。构造器的名称应与类的名称一致。Java通过new关键字来调用构造器,从而返回该类的实例,是一种特殊的方法。


构造器四个要点:

1. 构造器通过new关键字调用

JAVA学习笔记 06——面向对象和类

2. 构造器虽然有返回值,但是不能定义返回值类型(返回值的类型肯定是本类),不能在构造器里使用return返回某个值

3. 如果我们没有定义构造器,则编译器会自动定义一个无参的构造函数。如果已定义则编译器不会自动添加。

4. 构造器的方法名必须和类名一致


构造器的重载:

构造方法也是方法,只不过有特殊的作用而已。与普通方法一样,构造方法也可以重载。



从属线程的内存区域:

JVM的内存划分中,有部分区域是线程私有的,有部分是属于整个JVM进程;我们将这部分归为一类;

线程:程序计数器、虚拟机栈、本地方法栈


程序计数器:在JVM规范中,每个线程都有自己的程序计数器。这是一个比较小的内存空间,存储当前线程正在执行的JAVA方法的JVM指令地址,即字节码的行号。如果正在执行Native方法,则这个计数器为空。


JAVA虚拟机栈:同样也是属于线程私有区域,每个线程在创建的时候都会创建一个虚拟机栈,生命周期与线程一致,线程退出时,线程的虚拟机栈也回收。虚拟机栈内部保持一个个的栈帧,每次方法调用都会进行压栈,JVM对栈帧的操作只有出栈和压栈两种,方法调用结束时会进行出栈操作。该区域存储着局部变量表,编译时期克制的各种基本类型数据、对象引用、方法出口等信息。


本地方法栈:与虚拟机栈,本地方法栈是在调用本地方法时使用的栈,每个线程都有一个本地方法栈。类似


堆(heap):

堆,几乎所有创建的JAVA对象实例,都是被直接分配到堆上的。堆被所有的线程所共享,在堆上的区域,会被垃圾回收器进一步划分。


方法区(Method Area):

方法区与堆一样,也是所用的线程所共享,存储被虚拟机加载的元数据,包括类信息、常量、静态变量、即时编译器编译后的代码等数据。

方法区是一种java虚拟机的规范。由于方法区存储的数据和对重存储的数据一致,实质上也是堆,因此,在不同的JDK版本中方法区的实现方式不一样。


运行时常量池(方法区中):

这是方法区中的一部分,常量池主要存放两大类常量:

1. 字面量,如文本字符串、final常量值

2. 符号引用,存放了与编译相关的一些常量,因为JAVA不像C++那样有连接的过程,因此字段方法这些符号引用在运行期就需要进行转换,以便得到真正的内存入口地址。


直接内存:

直接内存并不属于JAVA规范少女规定的属于Java虚拟机运行时数据区的一部分。Java的NIO可以使用Native方法直接在java堆外分配内存,使用DirectBytebuffer对象作为这个对外内存的引用。


程序执行的内存分析过程:

虚拟机栈(简称:栈)的特点如下:

1. 栈描述的是方法执行的内存模型。每个方法被调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)。

2. JVM为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量等)

3. 栈属于线程私有,不能实现线程间共享!

4. 栈的存储特性是“先进后出,后进先出”

5. 栈是由系统自动分配,速度快!栈是一个连续的内存空间


堆的特点如下:

1. 对用于存储创建好的对象和数组(数组也是对象)

2. JVM只有一个堆,被所有线程共享

3. 堆是一个不连续的内存空间,分配灵活,速度慢!


方法区(又叫静态区,也是堆)特点如下:

1. 方法区是JAVA虚拟机规范,可以有不同的实现

2. JVM只有一个方法区,被所有线程共享

3. 方法区实际也是堆,只是用于存储类、常量相关的信息

4. 用来存放程序中永远不变或唯一的内容(类信息、静态变量、字符串常量等)


在JAVA中“字符串”是一个类!


分享到:


相關文章: