Java中数据类型的分类

我们知道Java是强类型语言,那么肯定对应的也就有弱类型语言,以下是强类型语言与弱类型语言的区别:

  强类型语言:

    强类型语言也就是强制数据类型定义的语言。也就是说,一旦一个变量被指定了某个数据类型,如果不经过转换,那么该变量就永远是此数据类型了。(如:定义一个整型变量叫“a”,程序也只会认为“a”这个变量是整型,并且不可能把它来当作字符来处理。)强类型语言也是类型安全的语言。

  弱类型语言:

    弱类型语言也就是同强类型语言相对的语言,也就是说它的数据类型是可以被忽略的语言。它与强类型语言定义的语言完全是相反的,它的一个变量可以被定义为多种数据类型,而且不用进行转换。(如:定义一个变量“a”,这个“a”可以被赋值整型,又可以被赋值字符型,还可以被赋值为其他类型。)弱类型语言对应的是类型不安全的语言。

  强类型语言在速度上可能会稍逊色于弱类型语言,但是强类型语言带来的严谨性能够有效的避免许多错误的发生。(另外,判断一个语言是不是类型安全的与该语言是不是动态类型的没有关系。)

  (如:Java是静态语言,是强类型语言(是类型安全的语言)。Python是动态语言,是强类型语言(是类型安全的语言)。JavaScript是动态语言,是弱类型语言(是类型不安全的语言)。)

Java中的数据类型:

  Java中的数据类型分为两类:

    基本数据类型(Primitive Type) 

    引用数据类型(Reference Type)

  

 

  基本数据类型:

    基本类型共有八种,其中包括六种数值型与两个非数值型。基本数据类型的信息如下:

 

Java中基本数据类型
数据类型 大小(单位:bit/位) 所属包装类 最小范围 最大范围
byte 8 java.lang.Byte -128 +127
short 2byte = 16 java.langShort -32768 +32767
int 4byte = 32 java.lang.Integer -2^31 +2^31-1
long 8byte = 64 java.lang.Long -2^63 +2^63-1
float 4buye = 32 java.lang.Float -3.4 * 10^38 +3.4 * 10^38
double 8byte = 64 java.lang.Double -1.7 * 10^308 +1.7 * 10^308
char 2byte = 16 java.lang.Character 0 65535
boolean 所占大小不明确 java.lang.Boolean 只有"true"和"false"两个取值

(注解:内存的存储最小单位是“bit/位”,1byte/字节 = 8bit/位)

 

 

(注意:在Java中定义的八种基本数据类型中,除了其它七种类型都有明确的内存占用字节数外,boolean类型没有给出明确的占用字节数,因为对虚拟机来说根本就不存在 boolean 这个类型,在虚拟机中boolean类型的值:false/true是用0/1来表示的,所以不确定。原因如下:)

  大小为1bit:

    boolean类型的值只有true和false两种逻辑值,在编译后会使用1和0来表示,这两个数在内存中只需要1位(bit)即可存储,位是计算机最小的存储单位。

  大小为1byte:

    虽然编译后1和0只需占用1位空间,但计算机处理数据的最小单位是1个字节,1个字节等于8位,实际存储的空间是:用1个字节的最低位存储,其他7位用0填补,如果值是true的话则存储的二进制为:0000 0001,如果是false的话则存储的二进制为:0000 0000。

  大小为4byte:

    来源是《Java虚拟机规范》一书中的描述:“虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持。在Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达式所操作的boolean值,在编译之后都使用Java虚拟机中的int数据类型来代替,而boolean数组将会被编码成Java虚拟机的byte数组,每个元素boolean元素占8位”。这样我们可以得出boolean类型占了单独使用是4个字节,在数组中又是1个字节。

  显然第三条是更准确的说法,那虚拟机为什么要用int来代替boolean呢?为什么不用byte或short,这样不是更节省内存空间吗。使用int的原因是,对于当下32位的处理器(CPU)来说,一次处理数据是32位(这里不是指的是32/64位系统,而是指CPU硬件层面),具有高效存取的特点。所以boolean类型没有给出精确的定义,《Java虚拟机规范》给出了4个字节,和boolean数组1个字节的定义,具体还要看虚拟机实现是否按照规范来,所以1个字节、4个字节都是有可能的。

  

 

  整数类型:

    Java中整数类型一般默认为int型,整型有四种表示形式:①二进制(锋二进一)、②八进制(锋八进一)、③十进制(也就是我们生活中所表达的类型,锋十进一)、④十六进制(锋十六进一);

    (注意:十六进制从第十位开始就不是数字了,而是字母,如:10就为A,11为B,16为10,28为1C)

    (注意:我们一般声明整型时默认的就是十进制,若要声明其他进制形式,需要在值的最前面加上特定的标识)

    如:

    byte a = 0b100;    //声明一个二进制byte型变量a,给定值为4(二进制为100),(二进制以0b标识)
    short b = 0100;    //声明一个八进制short型变量b,给定值为144(八进制为100),(八进制以0标识)
    int c = 0x100;    //声明一个十六进制int型变量c,给定值为400(十六进制为100),(十六进制以0x标识)

 

    声明一个byte型变量:  

byte a = 1;

 

    声明一个short型变量:

short a = 22;

    

    声明一个int型变量:

int a = 123;

    

    声明一个long型变量

    (注意:若声明了long类型,且该值在int范围内,则后面可以不加“L”,否则需要在后面加上“L”)

long b = 5555555555555555L;

 

 

  浮点类型:

    Java中浮点类型一般默认为double型

      float:单精度浮点(小数点后可精确到7位有效数字)

      double:双精度浮点(小数点后可精确到float的二倍有效数字)

    声明一个float型变量:

    (注意:声明float型需要在后面加上“f”或“F”)

float c = 3.14f;
float d = 3.14F;

    

    声明一个double型的变量:

double e = 3.1415;

    (注意:浮点类型存在舍入误差,如果需要不产生误差的小数类型用来精确计算可以使用java.math包下的BigDecimal类)

  字符型:

    我们知道Java中的字符是基于Unicode码表的,所以字符型是用来表示Unicode编码中的字符的,范围在:“0 - 65535”,也就是说char也可以用数字来表示;

    字符型在赋值的时候与其他类型有点区别,char作为单个字符型,在赋值时要加上单引号。

    声明一个char型变量:

char a = 'A';

 

 

  布尔型:

    boolean型只有两个值,true(正确/真)和false(错误/假);一般用boolean来做判断或者接收判断结果;

    声明一个boolean型变量:

boolean flag = true;
boolean boo = false;

 

 

 

  引用数据类型:

    引用类型分别有:

      ①类:具备某些共同特征的实体的集合,它是一种抽象的数据类型,它是对所具有相同特征实体的抽象。

      定义一个类TestDemo:

public class TestDemo{

}

 

      ②接口:接口可以理解为:定义了一系列规范,在编写程序的时候“必须”遵循接口所规定的所有要求。

      定义一个接口TestInterface:

public interface TestInterface{

}

 

      ③数组:用于储存多个相同类型数据的集合。

      定义一个int型的数组:给定值“0,1,2”

int[] array = {0,1,2};

 

    Java中也有字符串类型,而且与C/C++一样都是String,只不过在Java中String(字符串类型)是作为一个类来实现的,也就是说,Java中String类型是属于引用类型的,属于类。

    不过String类型在使用时并没那么麻烦,String在声明赋值时与char不同,因为是字符串,所以要带双引号。

    声明一个String型变量:

String str = "Hello";

 

    可以这样理解:只要不是基本数据类型的八种,以外的都是属于引用数据类型的。

 

 

 

原文地址:https://www.cnblogs.com/joyfulcode/p/11822369.html