Java基本数据类型总结
种类共有8种
byte | 1Byte = 8bit | -128 ~127 |
short | 2Byte = 16bit | -32768 ~ 32767 |
int | 4Byte = 32bit | -2147483648~+2147483647 |
long | 8Byte = 64bit | 2的63次方 ~ 2的63次方-1 |
Float(单精度) | 4Byte = 32bit |
|
Double(双精度) | 8Byte = 64bit |
|
布尔类型boolean | 在jvm中为int,或short | true,or false |
char | 2Byte = 16bit | 表示一个unicode的字符 |
引用数据类型:接口,枚举,类,数组,注解
内存中以二进制的形式存放数据,这个二进制以8位为一个单位,每8位构成一个字节(byte)
(1)boolean类型
a.boolean类型的变量只能够取true或者false,在JVM中,会使用int或者byte表示boolean,但是这对Java源程序是屏蔽的,在Java源程序中,boolean类型的变量值只能够取true或者false;
(2)整数类型byte, short, int, long
a 都是整数类型,都是有符号的整数
b 在Java语言中,如果数学表达式都是整数,则表达式的返回值只可能是int类型或者long类型,如果把返回值赋给byte类型的变量,就必须进行强制类型的转换(类型转换的目的是截断数据,保存数据的后若干位,使它满足结果类型的需要,因为long的内存位数要比int多,因此保存时不需要截断数据就可以保存)
c 在给整数类型变量赋值时,如果该整数值在类型的取值范围内,就可以把它直接赋给这种类型的变量,如果不在,则需要进行强制类型转换
(3)char类型
java中使用Unicode对字符进行编码,由于计算机中只能够保存二进制的数据类型,因此需要为各个字符进行编码,常用的是ASCII码,这种编码使用一个字节的7位,一共能够表示128个字符
3. 引用类型
3.1 引用类型可以分为类引用类型(引用类或者子类的实例),接口引用类型(引用实现接口的类的实例)和数组引用类型(数组是Java中真正的对象)
3.2 如果一个引用变量不引用任何对象,可以给它赋值为null
4. 基本类型 vs 引用类型
(1)基本类型代表简单的数据类型,引用类型引用的实例能表示任意一种复杂的数据结构(引用变量字段在执行Java程序时要进行常量池解析,具体就是有直接引用代替符号引用)
(2)基本类型仅表示数据类型,引用类型所引用的实例除了表示复杂数据结构类型外,还能够包括操纵这种数据类型的行为
(3)对于基本类型的变量,JVM会为其分配数据类型实际占用的内存空间,对于引用类型变量,它仅仅是一个指向堆区中某个实例的指针。
5. new 方法
(1)当一个引用类型的变量被定义之后,如果没有进行初始化,则它不指向任何对象,即默认值为null;
(2)使用new方法创建对象的过程
a 为对象分配内存空间,将对象的实例变量自动初始化为其变量类型的默认值;
b 如果实例变量在定义时显示初始化,则把初始化值赋给实例变量;
c.调用构造方法
d.返回对象的引用
6.变量的作用域
a. 变量的作用域指它的存在范围,只有在这个范围中,程序代码才能够访问它;
b. 变量的作用域决定变量的生命周期,变量的生命周期指从一个变量被创建并分配内存空间开始,到这个变量被销毁并清除它所占用的内存空间的过程,当一个变量被定义时,它的作用域就确定了。
c.根据作用域得不同,可以将变量分为以下几种类型:
c.1 成员变量:在类中声明,作用域是整个类(在哪里声明,作用域是哪里)
c.2 局部变量:在一个方法内部或者在方法的代码块内部生命,如果在方法中声明,则它的作用域是整个方法,如果在代码块中声明,它的作用域是这个代码块;
c.3 方法参数:方法或者构造器的参数,它的作用域是整个方法或者构造器;
c.4 异常处理参数: 传递给异常处理代码块,即catch(Exception e)语句中的异常参数e,它的作用域是紧跟catch(Exception e)语句后的代码块
7.分析各种变量:成员变量 局部变量
7.1 成员变量有两种,一种是被static修饰的变量,称为类变量或者静态变量,另一种没有static修饰,称为实例变量。
a.静态变量在内存中只有一个,只有当某个类被程序首次主动调用时,才会对该类型进行初始化,在初始化之前首先进行加载和连接操作,在连接的准备阶段给类变量分配内存,并赋予默认的初始值,在初始化阶段,对静态变量进行初始化(静态变量有两种初始化方式,一是在定义时直接进行初始化,二是在静态代码块中进行初始化)(静态变量仅初始化一次),类变量创建后,一直保存在内存运行时数据区的方法区中,保存在类型信息中,被该类型的所有实例所共享,静态变量可以通过类名访问,静态变量的生命周期取决于类的生命周期,当加载类的时候,静态变量被创建并分配内存(变量生命周期开始),当卸载类时,静态变量被销毁,并释放所占的内存(这时变量的生命周期结束)
b.类的每一个实例都有自己的实例变量,因此可以有多个实例变量,每创建一个实例,JVM就创建实例变量并分配内存,实例变量的生命周期也就开始了,当销毁对象实例时(内存被GC回收,对象的实例变量也就结束了它的生命周期)
c.不能够通过类名访问类的实例变量,因为类的每个实例变量都属于类的某个具体的实例,用类名访问实例变量不知道具体是访问那个实例的实例变量;
静态变量的生命周期取决于类型何时被加载以及卸载,实例变量的生命周期取决于实例何时被创建以及销毁
7.2 局部变量
局部变量的生命周期取决于所属的方法何时被调用以及结束调用;
当JVM中的某个线程调用一个方法时,会为这个方法中的局部变量分配内存(在堆区的Java栈中),当JVM执行结束一个方法时(或者是方法执行完毕,或者是出现某些异常),该方法的生命周期结束,方法的局部变量的生命周期也随之结束
不允许在相同的作用域中使用相同名字的变量,但是在不同的作用域中,变量的名字可以相同,比如,如果局部变量和某个实例变量重名,在局部方法中,局部变量会覆盖实例变量,如果让实例变量可见,应该使用this关键字进行调用
8.参数传递
如果方法的参数是一个简单类型,则直接传递参数的值,如果方法的参数是一个引用类型(类类型或者接口类型)或者数组类型,则传入方法中的是对象的引用,也就是对象的地址(是一个值)
需要注意的一点是,调用方法的局部变量如果作为被调用方法的参数使用,它们也不是一回事,调用方法的局部变量和被调用方法的参数保存在不同的内存空间中,前者保存在调用方法的栈帧的局部变量区中,后者保存在被调用方法的局部变量区中,它们的值可以相同,如果传入的是引用类型的变量,参数和变量保存相同的地址,这样,如果在被调用方法中修改地址中的对象的数据,实际对象就会发生改变(因为这是对内存的永久性的操作),即使被调用的方法的生命周期结束,调用方法的局部变量所引用的对象的值还是会跟着变。
9.变量的初始化
(1)对于成员变量(无论是静态的类变量还是实例变量)可以是先定义,再使用,因为JVM在为这些变量分配内存时,会首先根据类型为这些变量赋予默认值;
(2)对于局部变量,必须是先定义,再初始化,才能够使用,因为JVM在栈帧中为局部变量分配内存空间时,并不会为局部变量赋予默认值。
10.直接数的复制
Java中共有7种直接数:int long float double String char boolean
(1)基本类型不能付给引用类型,这里String是引用类型,因此String类型和char类型之间不能够相互赋值
(2)boolean类型的直接数只能够赋给boolean类型的变量,同样,boolean类型的变量值接受boolean类型的直接数
(3)把Int类型的直接数赋给byte,short或者char类型的变量是,如果直接数在这些变量的取值范围内,则可以直接赋值,如果不在变量类型的取值范围内(变量的类型说明了变量的取值范围以及在变量上能够进行的操作),必须进行强制类型转换
(4)将float和double类型的直接数赋给整形变量时,必须进行强制类型转换,而把整数型直接数赋给float和double型变量时,允许直接赋值
(5)float直接数允许直接赋给double类型的变量,而
在总结一次
Java中直接数的类型:int long float double char String boolean
java中变量的类型 整数类型:byte short int long
字符类型:char
boolean类型