Java的数据类型
Java的数据类型主要分为两种,一为基本类型,二为引用类型。前者包含整型、浮点型、字符型和布尔型,后者主要与使用类对象有关。
1、基本类型简介
1、1 整型
简单的使用如
public class exec
{
public static void main(String args[])
{
int i=0;
System.out.println(i);
}
}
输出为0
也可以使用其他进制的数据来赋值,如
public class exec
{
public static void main(String args[])
{
int i=0x30;
System.out.println(i);
}
}
输出为:48
注意:x或者X都是可以的
Java的整型包含四种子类型,分别为byte,short,int和long,各自的长度分别为1字节、2字节、4字节和8字节,用在不同的情况下,如byte类型适用于数据较小的情况,而且可以节省内存空间的占用,而long类型可以表达的整型数据显然是最大的。不同类型间的相互转换要防止精度的丢失问题,如
public class exec
{
public static void main(String args[])
{
byte i=256;
System.out.println(i);
}
}
编译会报错,“possible loss of precision”,但是使用强制类型转换,就可以成功运行。
public class exec
{
public static void main(String args[])
{
byte i=(byte)256;
System.out.println(i);
}
}
输出为0
请问下面的程序将会怎样?你知道为什么吗?
public class exec
{
public static void main(String args[])
{
byte i=128;
System.out.println(i);
}
}
提示:byte类型只有一个字节,保存的数据却是有符号数据。
1、2 浮点型
有两种子类型,一为float,二为double。如
public class exec
{
public static void main(String args[])
{
double i=1.25;
System.out.println(i);
}
}
这两种类型字节数分别为4和8,所以精度并不一样,所以相互之间的转换要注意精度丢失问题。如
public class exec
{
public static void main(String args[])
{
float i=1.25;
System.out.println(i);
}
}
编译会报错,主要原因在于1.25作为浮点型常量,默认为double型,所以从double到float进行转换,Java认为存在“可能的精度丢失”。可以通过强制类型转换来克服,如
public class exec
{
public static void main(String args[])
{
float i=(float)1.25;
System.out.println(i);
}
}
更简单的做法是将常量说明成float类型,如
public class exec
{
public static void main(String args[])
{
float i=1.25F;
System.out.println(i);
}
}
注意:F大小写没有关系,都是可以的。
1、3 字符型
Java的字符型是两个字节,存放数据的Unicode码,因此保存汉字信息显得相当简单,如public class exec
{
public static void main(String args[])
{
char i='南';
System.out.println(i);
}
}
输出为:南
注意:只能使用单引号而不能使用双引号,否则就是字符串对象了。
请问下面的程序将会怎样?你知道为什么吗?
public class exec
{
public static void main(String args[])
{
char i='\n';
System.out.println(i);
}
}
提示:\n表示转义字符,输出一个空换行
1、4 布尔型
用一个位来表示,值为true或者false,如
public class exec
{
public static void main(String args[])
{
boolean i=true;
System.out.println(i);
}
}
输出为:true
2、基本类型之间的相互转换
2、1 整型和字符型之间的转换
应该说,和C很相似,两者的转换相当简单,完全可以自由进行,不必使用强制转换,如
public class exec
{
public static void main(String args[])
{
int i='A';
System.out.println(i);
}
}
输出为:65
再如:
public class exec
{
public static void main(String args[])
{
char i=65;
System.out.println(i);
}
}
输出为:A
但是有时会产生一些其他问题,如
public class exec
{
public static void main(String args[])
{
char i='A';
i=i+0x20;
System.out.println(i);
}
}
编译会报错,原因并不在于字符和整型不能同时相加运算,相反,由于整型和字符型转换相当灵活,这样的相加完全可以实现。
编译的错误在于“possible loss of precision”,因为一个字符型数据再加上其他的整型数据,产生的结果值可能会大于一个字符所拥有的两字节能表达的范围,所以必须使用强制类型转换,如
public class exec
{
public static void main(String args[])
{
char i='A';
i=(char)(i+0x20);
System.out.println(i);
}
}
输出为:a
注意强制转换的用法。
上述程序可以写成:
public class exec
{
public static void main(String args[])
{
char i='A';
i=(char)(i+'z'-'Z');
System.out.println(i);
}
}
或者:
public class exec
{
public static void main(String args[])
{
char i='A';
i=Character.toLowerCase(i);
System.out.println(i);
}
}
2、2 整型和浮点型之间的转换
由于具有不同的小数精度,所以精度的丢失问题将会产生,如
public class exec
{
public static void main(String args[])
{
int i=0.5;
System.out.println(i);
}
}
编译报错,“possible loss of precision”,解决方法为强制类型转换。
请问下面的程序将会怎样?你知道为什么吗?
public class exec
{
public static void main(String args[])
{
int i=1/2;
System.out.println(i);
}
}
提示:1和2皆为整数,运算结果依然为整数
请问下面的程序将会怎样?你知道为什么吗?
public class exec
{
public static void main(String args[])
{
double i=1/2;
System.out.println(i);
}
}
提示:道理和上例一样,输出为:0.0
2、3 整型和布尔型之间的转换
和C不一样,Java语言不再支持整型和布尔型之间的相互转换,即使使用强制类型转换也不行,如
public class exec
{
public static void main(String args[])
{
boolean i=0;
System.out.println(i);
}
}
编译会报错,“incompatible types”
所以在条件中不能使用整型来表达真假,如
public class exec
{
public static void main(String args[])
{
int i=0;
if(i=0)
System.out.println(i);
}
}
编译会报错,“incompatible types”
修正为:
public class exec
{
public static void main(String args[])
{
int i=0;
if(i==0)
System.out.println(i);
}
}
请问下面的程序将会怎样?你知道为什么吗?
public class exec
{
public static void main(String args[])
{
boolean i=false;
if(i=false)
System.out.println(i);
}
}
提示:条件中可以使用赋值表达式,这本身不会出错,错误主要在于表达式的值(就是表达式中要赋给变量的值)只能是布尔型,而此例显然并不违反