字面常量顾名思义就是固定不变的量。
比如:
public class Demo{
public static void main(String[] args){
System.Out.println("hello world!");
System.Out.println(100);
System.Out.println(3.14);
System.Out.println('A');
System.Out.println(true);
System.Out.println(false);
}
}
在上面的代码中,helloworld
、100
、3.14
等都是常量。那么根据这些常量的不同类型,可以将字面常量分为:
""
括起来的,比如“12345”、“hello”、“你好”。在Java中数据类型分为两大类:基本数据类型和引用数据类型
基本数据类型分为四大类:整型、浮点型、字符型以及布尔型
这四大类可以细分为八种:
这里我们需要做几点说明,用来区别我们之前学过的C语言。
在C语言中,部分数据类型在32位电脑和64位电脑中是存在一定差异的。但是java中的数据类型不论是32位还是64位,都不会发生改变,这也就是可移植性的体现,如果大家阅读了作者上一章的内容:JavaSE介绍与第一个Java程序的话,就知道这种可移植性是与java的虚拟机有关的。
同时,整型和浮点型都是有符号的。
在我们的java程序中,除了有始终不变的字面常量外,还有一些量是变量,这些变量也是有分类的,比如有的变量是浮点数,有的变量是字符,因此刚刚介绍的数据类型就是来定义不同种类的变量的。
方式1:
数据类型 变量名 = 初始值;
当然也可以分开写:
方式2:
数据类型 变量名;
变量名 = 初始值;
如果我们要定义很多相同数据类型的变量,我们也可以采取以下方式:
方式3:
数据类型 变量名1 = 初始值1,变量名2 = 初始值2,变量名3 = 初始值3,...;
方式1
int a = 10;
double b = 2.3;
char c = 'c';
方式2
int a;
a = 10;
double b;
b = 20.1;
方式3
int a1 = 1, a2 = 2, a3 = 3;
\\方式1
int a1 = 1;
\\方式2
int a2;
a2 = 2;
我们可以用以下方式输出int
的最大值和最小值。
//最大值
System.out.println(Integer.MAX_VALUE);
//最小值
System.out.println(Integer.MIN_VALUE);
int
的范围,则会发生报错。\\方式1
long a1 = 1L;
\\方式2
long a2;
a2 = 2L;
这里要在数值的后面加字母L
,因为整型的字面常量默认是int
类型的,因此如果我们给long
类型的变量赋上超过int
范围的数字的话,会出现报错,所以我们需要将字面常量转化为长整型。
//最大值
System.out.println(Long.MAX_VALUE);
//最小值
System.out.println(Long.MIN_VALUE);
L
。\\方式1
short a1 = 1;
\\方式2
short a2;
a2 = 2;
short不需要将字面常量的int转化为short,因为short的范围比int小,所以我们不会遇到超过int范围的赋值情况。
//最大值
System.out.println(Short.MAX_VALUE);
//最小值
System.out.println(Short.MIN_VALUE);i
\\方式1
byte b1 = 10;
\\方式2
byte b2;
b2 = 10;
//最大值
System.out.println(Byte.MIN_VALUE);
//最小值
System.out.println(Byte.MAX_VALUE);
double d1 = 1.0;
double d2;
d2 = 2.0;
//最大值
System.out.println(Double.MAX_VALUE);
//最小值
System.out.println(Double.MIN_VALUE);
public class HelloWorld {
public static void main(String[] args) {
double d1 = 1.1;
double d2 = 1.1;
System.out.println(d1 * d2);
}
}
//方式1:
float a1 = 1.2f;
//方式2:
float b1;
b1 = 2.1f;
//最大值
System.out.println(Float.MAX_VALUE);
//最小值
System.out.println(Float.MIN_VALUE);
f
。//方式1:
char a1 = 'a';
//方式2:
char a2;
a2 = 'b';
System.out.println(Character.MAX_VALUE);
System.out.println(Character.MIN_VALUE);
//方式1:
boolean b1 = true;
//方式2:
boolean b2;
b2 = false;
Java是一个强类型的语言,即当不同类型之间的变量相互赋值的时候,会有严格的类型校验规则。
在Java中,当参与运算数据类型不一致时,就会进行类型转换。Java中类型转换主要分为两类:自动类型转换(隐式) 和 强制类型转换(显式)。
什么叫自动类型转换?自动类型转换即:代码不需要经过任何处理,在代码编译时,编译器会自动进行处理。
那么什么情况下会进行自动类型转换呢?
当我们将数据范围小的转为数据范围大的时候,编译器会自动进行类型转换。
比如下面的代码:
public class HelloWorld {
public static void main(String[] args) {
int a = 100;
long b = 200;
b = a;//将int赋值给long,int会自动转化为long
}
}
那么如果我们反过来呢?我们将long赋值给int,那么此时由于是需要将long转换为int,即大范围转小范围的过程,所以此时不会发生自动类型转换,编译器会出现报错。
如下图所示:
强制类型转换:当进行操作时,代码需要经过一定的格式处理,不能自动完成。
特点:数据范围大的到数据范围小的时候,需要我们手动将大类型转化为小类型,转化的语法即我们在被转变量前加上(小范围的数据类型)
。
示例如下:
public class HelloWorld {
public static void main(String[] args) {
int a = 1;
long b = 2;
a = (int)b;
byte b1 = (byte) 12456;
double d1 = 3.14;
float f1 = (float)d1;
}
}
类型提升是指在进行表达式运算的时候,数据类型小的会被提升到数据类型大的。
public class HelloWorld {
public static void main(String[] args) {
int a = 10;
long b = 20;
long c = a + b;//int + long表达式,int会被提升到long类型,所以转化成了long+long,结果也为long
int d = a + b;//结果也为long,但是long结果给int需要强制类型转换,不转换会报错。
}
}
public class HelloWorld {
public static void main(String[] args) {
byte a = 30;
byte b = 120;
byte c = a + b;//出现报错,java: 不兼容的类型: 从int转换到byte可能会有损失
}
}
为什么byte之间的运算还与int的转化有关呢?
byte 和 byte 都是相同类型, 但是出现编译报错。原因是,虽然 a 和 b 都是 byte, 但是计算 a + b 会先将 a和 b 都提升成 int, 再进行计算,得到的结果也是 int, 这时赋给 c, 就会出现上述错误。
从硬件运算效率的角度分析:
由于计算机的 CPU 通常是按照 4 个字节为单位从内存中读写数据,为了硬件上实现方便,诸如 byte 和 short这种低于 4 个字节的类型,会先提升成 int, 再参与计算。
public class HelloWorld {
public static void main(String[] args) {
String str1 = "ab";
String str2 = "cd";
String str3 = str1 + str2;
System.out.println(str3);
}
}
public class HelloWorld {
public static void main(String[] args) {
int num = 10;
//方法1:
String str1 = num + "";
//方法2:
String str2 = String.valueOf(num);
}
}
其余类型的转化与之类似。
public class HelloWorld {
public static void main(String[] args) {
String str1 = "123";
int a1 = Integer.parseInt(str1);
System.out.println(a1+3);
}
}
其余类型的转化与之类似。