前言
大家好,我是行谦YIFO,正在学习Java编程语言。我喜欢通过写作来记录自己的学习过程,并与大家分享我的知识和经验。我相信“以教促学”,希望通过分享我的学习成果,也能帮助到其他正在学习Java的朋友。我会努力提高自己的技术水平,同时也期待与大家一起交流和进步。感谢大家的关注和支持!
一、Java的基本类型
1.1 基础数据类型介绍
Java有八种基础数据类型,它们是:
- byte:字节型,占用8位内存空间,取值范围为-128到127。通常用于节省内存空间的场合。
- short:短整型,占用16位内存空间,取值范围为-32768到32767。
- int:整型,占用32位内存空间,取值范围为-231到231-1。
- long:长整型,占用64位内存空间,取值范围为-263到263-1。
- float:单精度浮点型,占用32位内存空间,精确到7位小数。
- double:双精度浮点型,占用64位内存空间,精确到15位小数。
- char:字符型,占用16位内存空间,用来存储Unicode编码的一个字符。
- boolean:布尔型,占用1位内存空间,只有两个值,
true
和false
。
如果超出了java的数值类型范围,在编译java文件的时候,编译器会给你报错。
以上就是Java中的八种基础数据类型,它们都有对应的包装类,如Byte
、Short
、Integer
、Long
、Float
、Double
、Character
和Boolean
。在实际开发中,我们通常使用这些包装类来操作对应的基础数据类型,这在第二节会讲到。
public class DemoTest {
public static void main(String[] args) {
byte a = 127;
short b = 32767;
int c = 2147483647;
long d = 9223372036854775807L;
boolean e = true;
char f = 'a';
float g = 1.2f;
double h = 1.2d;
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
System.out.println(e);
System.out.println(f);
System.out.println(g);
System.out.println(h);
}
}
1.2 为什么Java需要不同位数的类型
在这里内存空间的大小是以字节(byte)为单位的,一个字节由8个二进制位组成。这样做的原因是,8位二进制可以表示256种不同的状态,这对于大多数常见的数据类型来说已经足够了。例如,一个字节就可以表示0到255之间的所有无符号整数,也可以表示-128到127之间的所有带符号的整数。
对于需要更大存储空间的数据类型,比如整数、浮点数和字符等,就需要多个字节来表示。例如,一个16位的整数需要两个字节来存储,可以表示0到65535之间的无符号整数,或者-32768到32767之间的带符号的整数。
此外,不同类型的变量在内存中占据的空间大小也是不同的。例如,一个字符型变量(char)占用16位内存空间,一个整型变量(int)占用32位内存空间,一个长整型变量(long)占用64位内存空间,等等。
总的来说,内存空间的大小是由数据类型的需求决定的,而数据类型的需求则是由实际应用的需求决定的。
二、Java的包装类型
2.1 包装类型介绍
在Java编程语言中,有一些基础数据类型,如int、double、boolean等。这些基础数据类型可以直接用来进行计算和比较等操作,但是它们也有一些限制,比如不能直接和其他对象一起使用,也不能作为方法的参数或返回值等。
为了克服这些限制,Java提供了一些包装类,如Integer、Double、Boolean等。这些包装类提供了更多的功能和灵活性,可以将基础数据类型转换为对象,并且可以和其他对象一起使用。
例如,如果你想在一个集合中存储一些整数,你可以使用ArrayList<Integer>而不是ArrayList<int>,因为后者是不允许的。同样地,如果你想将一个整数传递给一个方法,你可以使用Integer对象而不是int变量,因为后者是不允许的,ArrayList暂时不了解也没关系。
除了提供更多的功能和灵活性之外,包装类还提供了一些其他的好处。例如,它们可以自动装箱和拆箱,这意味着你可以在需要的时候将基础数据类型转换为对象,而在不需要的时候再将其转换回基础数据类型。
2.1 包装类型实操理解
public class DemoTest {
public static int add(Integer a, Integer b) {
return a + b;
}
public static void main(String[] args) {
Integer num1 = 3;
Integer num2 = 4;
int sum = add(num1, num2); // 调用add方法
System.out.println("这两个数字之和是: " + sum);
}
}
在这个方法中,我们直接将两个Integer参数相加,并返回它们的和。这里没有显式地进行拆箱或装箱操作,因为Java编译器会自动为我们完成这些操作。
装箱就像把一群小动物(基础数据类型)关进笼子(包装类),以便于管理和运输。在这个过程中,我们需要选择合适的笼子(包装类),并将小动物(基础数据类型)放进去。而拆箱则是从笼子里取出小动物(基础数据类型)。在这个过程中,我们需要打开笼子(包装类),并取出里面的小动物(基础数据类型)。
我们也可以不通过Java自动拆箱装箱,可以调用对应的装箱方法:Integer.valueOf。
int num = 5; // 基础数据类型int
Integer integer = Integer.valueOf(num); // 装箱操作,将int转换为Integer
同样地,如果我们有一个Integer对象,如果我们想要将其转换为int类型,就可以使用intValue()方法进行拆箱操作,如下所示,其他的基础类型也有类似的方法:
Integer integer = new Integer(5); // 包装类Integer
int num = integer.intValue(); // 拆箱操作,将Integer转换为int
2.3 包装类型的高级应用
public class DemoTest {
public static void main(String[] args) {
Box<Integer> intBox = new Box<>(10);
System.out.println(intBox.getValue()); // 输出 10
Box<String> stringBox = new Box<>("Hello");
System.out.println(stringBox.getValue()); // 输出 Hello
}
}
public class Box<T> {
private T value;
public Box(T value) {
this.value = value;
}
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
}
在这个例子中,我们定义了一个名为 Box 的类,它有一个泛型参数 T,表示它可以存储任何类型的数据。然后我们在 main 方法中创建了两个 Box 对象,一个是整数类型,另一个是字符串类型。这样我们就可以在同一个程序中使用不同类型的 Box 对象,而不需要为每种类型都创建一个新的类了。