Java基础—数据类型

1.数据类型

  Java是一种强类型语言。这就意味着必须为每一种变量声明一种类型。在Java中,一共有8种基本类型(primitive type),其中有4种整型,2种浮点类型,一种用于表示Unicode编码的字符单元的字符类型char和一种用于表示真值的boolean类型

  ①、整型

    整型用于表示没有小数部分的数值,他允许是负数。Java提供了4种整形:

    int:4字节,存储范围为-2147483648~2147483647(正好超过20亿);

    short:2字节,存储范围为-32768~32767;

    long:8字节,存储范围为-9233372036854775808~9233372036854775807;

    byte:1字节,存储范围为-128~127。

  在通常情况下,int类型最为常用。但如果需要表示宇宙中星球的数量的话,那就必须使用long类型了(或许long还不够用)。byte和short主要适用于特定的场合,或者在同一个平台中的不同操作系统之间进行移植给程序员带来的诸多问题。与此相反,C和C++程序需要针对不同的处理器选择最为有效的整形,这样就有可能造成一个在32位处理器上运行很好的程序在16位系统上运行却发生整数溢出。由于Java程序必须保证在所有机器上都能够得到相同的运行结构,所以每一种数据类型的范围必须固定。

  长整型数值有一个后缀L(如8000000000L)。十六进制数值有一个前缀0x(如0xCAFE)。八进制有一个前缀0,例如,010对应八进制中的8。很显然,八进制表示法比较容易混淆,所以建议最好不要使用八进制常数。

  ②、浮点类型

  浮点类型用于表示有小数部分的数值。在Java中有两种浮点类型。

  float:4字节,取值范围大约±3.40282347E+38F(有效位数为6~7位);

  double:8字节,取值范围大约±1.79769313486231570E+308(有效位数为15位)。

  double表示这种类型的数值精度是float的两倍(有人称之为双精度数值)。绝大部分应用程序都采用double类型。在很多情况下,float类型的精度很难满足需求。例如,用7位有效数字足以精确的表示一个村或者一个镇的人口数量,但表示全球的人口数量就不够用了。实际上,只有很少的情况下适合使用float类型,例如,需要快速的处理单精度数据,或者需要存储大量大量数据。

  float类型的数值有一个后缀F(例如,3.402F)。没有后缀F的浮点数值(如3.402)默认为double类型。当然,也可以在浮点数值后面添加后缀D(例如,3.402D)。

  ③、char类型

  char类型用于表示单个字符,通常用来表示字符常量。例如:'A'是编码为65所对应的字符常量。于"A"不同,"A"是一个包含字符A的字符串。Unicode编码单元可以表示为十六进制值,其范围从u0000到Uffff。

  除了可以采用转义序列符u表示Unicode代码单元的编码之外,还有一些用于表示特殊字符的转义序列符,例如(u0008)表示退格、 (u000a)表示换行和 (u000d)表示回车等。所以这些转义序列符都可以出现在字符常量或者字符创的引号内。例如,'u2122'或'Hello '。转义序列符u还可以出现在字符常量或者字符串的引号之外(而其他所有转义序列不可以)。例如:

public static void main(Stringu005Bu005D args){}

 这种形式完全符合语法规则,u005B和u005D是(和)的编码。

  ④、boolean类型

  boolean(布尔)类型有两个值:false和true,用来判定逻辑条件。整型值和布尔值之间不能进行相互转换。

  ⑤、枚举类型

  如何在Java SE 5.0以后的版本中定义枚举类型。下面是一个典型的例子:

public enum Size { SMALL, DEDIUM, LARGE, EXTRA_LARGE };

  实际上,这个声明定义的类型是一个类,它刚好有4个实例,在此尽量不要构造新对象。

  因此,在比较两个枚举类型的值时,永远不要调用equals,而直接使用 == 就可以了。

  如果需要的话,可以在枚举类型中添加一些构造器,方法或域。当然,构造器只是在构造枚举常量的时候被调用。下面是一个示例:

enum Size{
  SMALL("S"),MEDIUM("M"),LARGE("L"),EXTRA_LARGE("XL");
  
  private Size(String abbreviation) { this.abbreviation = abbreviation }
  publlic String getAbbreviation() { return abbreviation; }
  
  private String abbreviation;                    
}

  所有的枚举类型都是Enum类的子类。它们继承了这个类的许多方法。其中最有用的一个是toString,这个方法能够返回枚举常量名。例如,Size.SMALL.toString()将返回字符串"SMALL"。

  toString的逆方法是静态方法valueOf。例如,语句:

Size s = (Size) Enum.valueOf(Size.class, "SMALL"); //将 s 设置成Size.SMALL

  每个枚举类型都有一个静态的values方法,它将返回一个包含全部枚举值的数组。例如:

Size[] values = Size.values(); //返回包含元素Size.SMALL, Size.MEDIUM, Size.LARGE, Size.EXTRA_LARGE 的数组

  ordinal方法返回enum声明中枚举常量的位置,位置从0开始计数。例如:Size.MEDIUM.ordinal()返回1。

  ⑥、引用类型

  引用类型是一个对象类型,值是什么呢?它的值是指向内存空间的引用,就是地址,所指向的内存中保存着变量所表示的一个值或一组值。对象引用实例变量的缺省值为 null。除此之外,Java有4钟引用类型:强引用(StrongReference)、软引用(SoftReference)、弱引用(WeakReference)和虚引用(PhantomReference)。

2.数值类型之间的转换

  在程序运行时,经常需要将一种数值类型转换成另一种数值类型。

  ①、byte→short→int→long;

  ②、char→int→double;

  ③、int→float;

  ④、long→float;

  ⑤、long→double;

  其中①和②表示无精度丢失的转换;③、④、⑤表示可能有精度损失的转换。例如123456789是一个大整数,它所包含的位数比float类型所能表达的位数多,当将这个整数值转化成float类型时,将会得到同样大的结果,但却失去了一定的精度。

int n = 123456789;
float f = n; //f is 1.23456792E8

  当使用上面两个数值进行二元操作时(例如n+f,n是整数,f是浮点数),先要将两个操作数转换成同一种类型,然后再进行计算。

  如果两个操作数中有一个是double类型的,另一个操作数就会转换为double类型;

  否则,如果其中一个操作数是float类型,另一个操作数将会转成float类型;

  否则,如果其中一个操作数是long类型,另一个操作数将会转换成long类型;

  否则,两个操作数都将被转换成int类型。

 3.强制类型转换

  从上面可以看到,在必要的时候,int类型的值会自动的转换为double类型。但另一方面,有时也需要将double转换成int。在Java中,允许进行这种数值之间的类型转换。当然,有可能会丢失一些信息。在这种情况下,需要通过强制类型转换(cast)实现这个操作。强制类型转换的语法格式是在圆括号中给出想要转换的目标类型,后面紧跟待转换的变量名。例如:

double x = 9.99767;
int nx = (int) x; //nx is 9

这样,变量nx的值为9。强制类型转换通过截断小数部分将浮点值转换为整型。如果想对浮点型进行舍入运算,以便得到最接近的整数(在很多情况下,希望使用这种操作方式),那就需要使用Math.round()方法:

double x = 9.99767
int nx = (int) Math.round(x); //nx is 10

现在,变量nx的值为10。当调用round的时候,仍然需要使用强制类型转换(int)。起原因是round方法返回的结果是long类型,由于存在信息丢失的可能性,所以只有显示的强制类型转换才能够将long类型转换成int类型。

  这里有一个警告:如果试图将一个数值从一种类型强制转换为另一种类型,而又超出了目标类型的表示范围,结果就会截断成一个完全不同的值。例如,(byte)300的实际值为44。

原文地址:https://www.cnblogs.com/JackWeTa/p/11422841.html