java中最常见的就是数据类型和变量了,所有的一切都是基于这两个产生的,所以这两个东西是十分基础页是十分重要的,今天就具体的消化一下数据类型和变量的存储
数据类型
基础数据类型
1.Java基本类型共有八种:char、boolean、byte、short、int、long、float、double
而基本类型可以分为三类:
字符类型:char
布尔类型:boolean
数值类型:
- 整数类型:byte、short、int、long
- 浮点数类型:float、double
JAVA中的数值类型不存在无符号的,它们的取值范围是固定的,不会随着机器硬件环境或者操作系统的改变而改变。
2.基本数据类型的区别与使用范围
基本类型 | 含义 | 最小值 | 最大值 | 默认值 | 使用范围 |
byte | 8位、有符号的、以二进制补码表示的整数 | -128(-2^7) | 127(2^7-1) | 0 | 在大型数组中节约空间,为int的四分之一 |
short | 16 位、有符号的、以二进制补码表示的整数 | -2^15 | 2^15-1 | 0 | 可以像 byte 那样节省空间,为int的二分之一 |
int | 32位、有符号的、以二进制补码表示的整数 | -2^31 | 2^31 - 1 | 0 | 一般地整型变量默认为 int 类型 |
long | 64 位、有符号的、以二进制补码表示的整数 | -2^63 | 2^63 -1 | 0L | 使用在需要比较大整数的系统上 |
float | 单精度、32位、符合IEEE 754标准的浮点数 | 2的-149次方 | 2的128次方-1 | 0.0f | 在储存大型浮点数组的时候可节省内存空间 |
double | 双精度、64 位、符合IEEE 754标准的浮点数 | 2的-1074次方 | 2的1024次方-1 | 0.0d | 浮点数的默认类型为double类型 |
boolean | 只有两个取值:true 和 false | 无 | 无 | false | 只作为一种标志来记录 true/false 情况 |
char | 一个单一的16位Unicode字符 | \u0000(即为0) | \uffff (即为2^16-1) | 无 | 可以储存任何字符 |
上表中的float和double的最大值和最小值没有符号位,即可以当做正数的时候的最大最小值,而负数的时候最大最小值在最前面添加符号后相反即是。
变量在jvm中的存储
变量和常量
说起变量,不得不提到常量,说直白一点
变量是可以改变的量,如int size=0;
常量是不可以改变的量,如 final int SIZE=0;
看出来区别了吗?常量即是在最前方加了一个final。
标识符
这里再提一下上述例子的“size”是什么东西——标识符
标识符最常见的就是一个字母,一个单词,或者一个拼音
比如 int i=0 中的i就是标识符,int a 中的a也是标识符
百度的标识符的定义:标识符是用来给类、对象、方法、变量、接口和自定义数据类型命名的。
标识符的使用合法标准:
1.类和接口名 | 每个字的首字母大写,含有大小写。例如,MyClass,HelloWorld,Time等。 |
2.方法名 | 首字符小写,其余的首字母大写,含大小写。尽量少用下划线。例如,myName,setTime等。这种命名方法叫做驼峰式命名。 |
3.常量名 | 基本数据类型的常量名使用全部大写字母,单词与单词之间用下划线分隔。对象常量可大小混写。例如,SIZE_NAME。 |
4.变量名 | 首字符小写,单词间分隔符用字母的首字母大写。不用下划线,少用美元符号。给变量命名是尽量做到见名知义。列如:int moneySize;(表示钱的大小范围) |
这里主要看常量和变量的命名方式~
按照上面的标识符命名方式是绝对正确的,在公司也是可以直接上手的,
而标识符的误区就是一定不能写系统关键字
abstract | default | if | private | this |
boolean | do | implements | protected | throw |
break | double | import | public | throws |
byte | else | instanceof | return | transient |
case | extends | int | short | try |
catch | final | interface | static | void |
char | finally | long | stricftp | volatile |
class | float | native | super | while |
const | for | new | switch |
|
continue | goto | package | synchronized |
|
萌新一看~哇~这么多不能写的关键字啊,不小心把标识符写成这个了怎么办?
不要紧,这些东西刚开始看起来就是一堆难懂的单词,但逐渐学习的过程中就会慢慢记住这些关键字,根本不用担心会错写成关键字噢,这里列出来不是让你记住,而是看一哈而已。
往对了写就不会错嘛!
变量在jvm中的存储
讲了这么多别的,主要是为了萌新,这篇文章的意愿是想让小白也能看的懂,能讲到的分支我都会一一去讲,缺点是没有突出重点
1.什么是jvm?为什么变量在jvm中存储?是如何存储的?
什么是jvm?
JVM是Java Virtual Machine(Java虚拟机)的缩写,它是由软件技术模拟出计算机运行的一个虚拟的计算机。
java代码(通过javac.exe编译)→.class文件(通过java.exe运行)→jvm开始执行操作
我们知道,java程序写好后通过javac.exe编译成.class文件,.class文件才是jvm能够识别的语言。
而jvm通过识别你的操作系统匹配出适合你操作系统的虚拟机,执行.class文件,这就是java能够跨平台运行的原因。
说白了,java之所以可以无视平台运行,就是因为jvm这个利器!
为什么变量在jvm中存储?
下图为jvm的执行图
我们可以看到,class文件通过类加载子系统(类加载器),把你的程序分为五个区域存在内存中。
java栈:这里存放的是“对象的引用”、“基本数据类型的数据”
- 对象的引用:也就是程序中new出来的那个对象的名字,比如我有个Student类,Student stu=new Student();,这个stu是我创建的对象名,将它放在java栈中,而stu所拥有的属性和方法放在java堆内,而对象的引用的意思就是把这个stu所对应的java堆中的属性和方法对应到java栈的stu对象名,如下图:
- 基本数据类型的数据:char、boolean、byte、short、int、long、float、double这八大基本数据类型都直接存放在java栈内,因为他们不是类的对象,如下图:
java堆:这里存放的是“对象的属性和方法”,仍然是对象的引用那张图,堆跟栈的关系密不可分。