4.2Java数据类型划分(整型类型)
在Java程序里面任何一个整数的常量类型都是int型。
范例:定义一个整型变量
public class TestDemo {
public static void main(String args[]){
//10是一个整数(不会改变的数据是常量)
//程序之中任何一个整数对应的类型都是int
int num = 10 ; //声明一个int型变量
//num是int型的变量 * 2是int型的常量 = 结果还是int型
System.out.println(num * 2);
}
}
但是在进行整型数据操作的过程之中也会存在有一个数据溢出问题,指的是当已经达到了整型的最大或最小值。如果继续进行数学计算而可能产生的错误数据。
关于变量的命名要求:第一单词的字母小写,而后每个单词的首字母大写 例如:maxValue
范例:观察数据溢出操作
public class TestDemo {
public static void main(String args[]){
int maxValue = Integer.MAX_VALUE; //取得最大值
int minValue = Integer.MIN_VALUE; //取得最小值
System.out.println(maxValue); //2147483647
System.out.println(minValue); //-2147483648
//maxValue属于int型变量 + int型常量 = int型
System.out.println(maxValue + 1); //数据溢出(最小值):-2147483648
System.out.println(minValue - 1); //数据溢出(最大值):2147483647
System.out.println(minValue - 2); //2147483647
}
}
发现当已经超过了数据类型的局限之后,数据的计算就会出现偏差啊,多以一点更要在操作前预估你的数据大小。但是现在的问题是,既然已经知道了int会存在有益处的问题,就需要去解决这个溢出的问题。解决方案只有一个:更换更大的数据类型。而比int大的数据类型就是long类型。
范例:使用long来解决int的数据溢出问题
错误方法
public class TestDemo {
public static void main(String args[]){
int maxValue = Integer.MAX_VALUE; //取得最大值
int minValue = Integer.MIN_VALUE; //取得最小值
long result = maxValue + 1 ;
System.out.println(result);
}
}
在使用此类方式处理之前请一定要注意一个问题,所有的程序的执行顺序都是由等号的右边到左边,也就是说如果你现在继续使用了int进行计算,那么计算结果依然会由溢出,所以最简化的做法是将其中的一个变量首先做类型的扩充,而扩充有两种的实现形式:
1、直接将int变量的内容复制给long变量:
public class TestDemo {
public static void main(String args[]){
int maxValue = Integer.MAX_VALUE; //取得最大值
int minValue = Integer.MIN_VALUE; //取得最小值
long result = maxValue ; //将int的数据变量赋值给long
//result是long类型 + 1是int类型 = long类型
System.out.println(result + 1); //2147483648
}
}
2、直接将某一个int型的变量变为long型
public class TestDemo {
public static void main(String args[]){
int maxValue = Integer.MAX_VALUE; //取得最大值
int minValue = Integer.MIN_VALUE; //取得最小值
//先将int型变为long型 + int型常量 = long类型
long result = (long)maxValue + 1 ; //将int的数据变量赋值给long
//result是long类型 + 1是int类型 = long类型
System.out.println(result); //2147483648
}
}
数据类型除了可以有效变大之外,也可以实现由大变小。但是这就需要强制完成,强制的结果就是会丢内容。
范例:数据类型强制转换
public class TestDemo {
public static void main(String args[]){
//任何的整数其默认类型都是int,但是该数据已经超过了int可以保存的数据范围
//那么现在就需要将这个数据明确表示是一个long型常量。
long num = 2147483648L ; //“L”或者"l"都可以
//在强制的时候设置其目标类型,这种操作有可能会丢失精度
int result = (int)num ; //大的类型变为小的类型
System.out.println(result); //-2147483648
}
}
在开发之中没事干别整这个,懂这个流程即可,记住以下几句话。
1、范围小的数据类型可以自动变为范围大的数据类型
2、数据范围大的数据类型只有强制转换才可以变为数据范围小的数据类型。
没事干别弄这些操作,给你的数据类型在99%的情况下都够你用的。
重要说明:关于数据类型默认值问题
在之前就说过所有的数据类型都有其默认值,但是这个默认值在方法的声明中(主方法)无效。
范例:观察一个错误程序
public class TestDemo {
public static void main(String args[]){
int num ; //定义一个num变量
System.out.println(num); //错误: 可能尚未初始化变量num
}
}
那么这个时候有两种解决方案,一种是在使用前进行赋值,另外一种是在定义变量的时候直接赋值
范例:在使用前为变量赋值内容
public class TestDemo {
public static void main(String args[]){
int num ; //定义一个num变量
num = 10 ; //在num输出之前为变量设置内容
System.out.println(num); //错误: 可能尚未初始化变量num
}
}
但是这种形式在老版本的JDK之中也会出现错误,所以最保险的做法就是在变量声明的时候设置他的默认值
public class TestDemo {
public static void main(String args[]){
int num = 10 ; //在num输出之前为变量设置内容
System.out.println(num); //错误: 可能尚未初始化变量num
}
}
而对于各个数据类型的默认值的时候,需要结合到类的情况才可以观察到
既然说到了整型数据,就不得不考虑byte数据类型,首先byte数据类型可以保存范围是:-128-127之间。
范例:声明byte变量
public class TestDemo {
public static void main(String args[]){
//10是int,int的范围要大于byte范围,那么理论上要进行强制转换。
//可是这里面没有转换,应为其数据量符合byte要求
byte data = 10; //10是int类型在byte范围内
System.out.println(data);
}
}
如果说现在你为byte赋值的内容大于byte的范围,这个时候就需要强制转换了
public class TestDemo {
public static void main(String args[]){
//10是int,int的范围要大于byte范围,那么理论上要进行强制转换。
//可是这里面没有转换,应为其数据量符合byte要求
byte data = (byte)128; //10是int类型在byte范围内
System.out.println(data); //-128
}
}
同时需要注意的是,如果要将int常量直接赋值给byte变量,那么只能够是常量,而不能够是int变量
public class TestDemo {
public static void main(String args[]){
int num = 10 ; //10在byte范围内
//10是int,int的范围要大于byte范围,那么理论上要进行强制转换。
//可是这里面没有转换,应为其数据量符合byte要求
byte data = (byte)num; //10是int类型在byte范围内
System.out.println(data); //-128
}
}
在以后的开发之中,byte和int 经常会一起出现。