数据类型转换
强制转换
格式(目标类型)变量名;
public class helloworld {
public static void main(String[] args) {
int i = 128;
byte a = (byte)i;//i=128,将类型int的i强制转换为byte
System.out.println(i);
System.out.println(a);//导致内存溢出
}
输出结果为128,-128,因为byte的范围是-128至127,超了,所以应避免内存溢出的情况
自动类型转换
public class helloworld {
public static void main(String[] args) {
int i = 128;
double a = i;
System.out.println(i);
System.out.println(a);
}输出结果为128,128.0。这是一个低到高的转换(注意上图)。
float、double转为int的时候会把小数点后面直接消掉,甚至不带四舍五入。
public class helloworld {
public static void main(String[] args) {
char c = 'a';
int d = c+1;
System.out.println(d); 结果为98
System.out.println((char)d);结果为b
}
}在类型如果char直接加int类型会被自动转换,这就是我们说的自动转换。
public class helloworld {
public static void main(String[] args) {
int money = 1000000000;
int years = 20;
int total = money*years;
long total2 = money*years;
System.out.println(total);输出-1474836480
System.out.println(total2);输出-1474836480
这俩都溢出了,为啥long也会溢出呢?因为他是先算成int再变为long,在转换之前已经出问题了。
System.out.println((long)money*years);输出200_0000_0000好了,在算之前先转换就没问题了。
}
}
!!注意!!
- 不能把布尔值进行转换。
- 不能把数据类型转为不相干的类型。
- 高往低需要进行强制转换。
- 转换时可能存在内存溢出、精度问题。
变量
public class helloworld {
public static void main(String[] args) {
int money = 1000000000;
String name = "王小明";
long i = 555L;
}
}上面这些就是变量
有局部变量、实例变量、类变量
局部变量
public class helloworld {
public static void main(String[] args) {
int money = 10_0000_0000;//新特性,在数字中加下划线不会被输出。
String name = "王小明";
//局部变量被定义之后必须赋予初始值才能用。
long i = 555L;
}
public void add(){
System.out.println(i);这个i就是上面那个方法中的局部变量,出了上面那个区域就不能用了。
}
}
局部变量只能在一个方法中调用
类变量
这是一个从属于类的变量,在一个类的下面可以随意调用(跨方法)。
定义时在数据类型前加static
实例变量
是属于一个类对象的的变量
一个对象的实例变量,可以不被赋值,如若此做,就会被赋予一个初始值,大多为0,0.0,null,false此类。
public class helloworld {
static int b = 2;
int age = 1;
public static void main(String[] args) {
helloworld X = new helloworld();创建一个实例对象
System.out.println(X.age);输出1,要用实例变量就得创建一个实例对象
System.out.println(helloworld.b); 输出2 类变量可以直接用
}
}
常量
final+数据类型+变量名=数值
这是一个不允许被改变结果的值。