数据类型的转换
自动类型转换
数据类型的自动转换一般是指:容量小的数据类型可以自动转换为容量大的数据类型。如图:
虚线代表可以直接转换但可能会丢失一定的精度,如long类型转换为double类型时会丢失一定精度。
特例:可以将整型常量直接赋值给byte、short、 char等类型变量,而不需要进行强制类型转换,只要不超出其表数范围即可。
强制类型转换
强制类型转换,又被称为造型,用于显式的转换一个数值的类型。在有可能丢失信息的情况下进行的转换是通过造型来完成的,但可能造成精度降低或溢出。
当将一种类型强制转换成另一种类型,而又超出了目标类型的表数范围,就会被截断成为一个完全不同的值。
int x = 300;
byte bx = (byte)x; //值为44
byte的标识范围(-128~127)超出的部分从范围的最左边开始算起直到第44位为300
注意:不能在布尔类型和任何数值类型之间做强制类型转换
数据溢出问题
一些基本数据类型的范围:long的数据范围:-9223372036854775808—9223372036854775807;
int的数据范围:-2147483648—2147483647;
short:-32768—32767;
byte:-128—127;
char:0—65536;
float:-3.4E38—3.4E38
double:-1.7E38—1.7E38;
数据溢出就是指当某一种类型的数值已经达到了此类型能够保存的最大值之后,再继续扩大,或者达到了最小值后再继续缩小,就会出现数据溢出问题。如:
int money = 1000000000; //10亿
int years = 20;
int total = money*years;
System.out.println("total="+total);
//返回的total是负数,超过了int的范围
long total1 = money*years;
System.out.println("total1="+total1);
//返回的total仍然是负数。默认是int,因此结果会转成int值,再转成long,但是已经发生了数据丢失
total = -1474836480
total1 = -1474836480
解决方法:先将一个因子变成long类型使整个表达式的数据类型全变为long来计算,如:
long total2 = money*((long)years);
System.out.println("total2="+total2);
Java中Math类的使用
1.java.lang包中的Math类提供了一些用于数学计算的方法。
2.Math.random()该方法用于产生一个0到1区间的double类型的随机数,但是不包括1。
用Math.random()方法制作一个1-6的随机数游戏:
public class Text {
public static void main(String [] args){
int h = (int)(6*Math.random()+1);
System.out.println(h);
}
}
运行结果:
方法的重载(overload)
方法的重载是指一个类中可以定义多个方法名相同,但参数不同的方法。 调用时,会根据不同的参数自动匹配对应的方法。
构成方法重载的类型:
形参类型不同:
/** 求和的方法 */
public static int add(int n1, int n2) {
int sum = n1 + n2;
return sum;
}
// 方法名相同,参数类型不同,构成重载
public static double add(double n1, int n2) {
double sum = n1 + n2;
return sum;
}
形参个数不同:
/** 求和的方法 */
public static int add(int n1, int n2) {
int sum = n1 + n2;
return sum;
}
public static int add(int n1, int n2, int n3) {
int sum = n1 + n2 + n3;
return sum;
}
形参顺序不同:
/** 求和的方法 */
public static int add(int n1, int n2) {
int sum = n1 + n2;
return sum;
}
// 方法名相同,参数顺序不同,构成重载
public static double add(int n1, double n2) {
double sum = n1 + n2;
return sum;
}
注意:
重载的方法,实际是完全不同的方法,只是名称相同而已!
只有返回值不同,不构成方法的重载,如:
/** 求和的方法 */
public static int add(int n1, int n2) {
int sum = n1 + n2;
return sum;
}
public static double add(int n1, int n2) {
double sum = n1 + n2;
return sum;
}
只有参数名称不同,也不构成方法的重载