目录
一. 基本类型
Java 中的基本数据类型包括以下 8 种:
byte
:字节型,占 1 个字节(8 位),取值范围是 -128 到 127。
- 示例:
byte num = 10;
short
:短整型,占 2 个字节(16 位),取值范围是 -32768 到 32767。
- 示例:
short num = 100;
int
:整型,占 4 个字节(32 位),取值范围是 -2147483648 到 2147483647。这是在程序中最常用的整数类型。
- 示例:
int num = 1000;
long
:长整型,占 8 个字节(64 位),取值范围很大。当需要表示更大的整数时使用。
- 示例:
long num = 10000000000L;
注意,在给long
类型变量赋值时,需要在数值后面加上L
或l
。
float
:单精度浮点型,占 4 个字节,能表示 6 到 7 位有效数字。
- 示例:
float num = 3.14f;
给float
类型变量赋值时,需要在数值后面加上F
或f
。
double
:双精度浮点型,占 8 个字节,能表示 15 位左右有效数字。精度更高,通常在涉及浮点数运算时使用。
- 示例:
double num = 3.14;
char
:字符型,占 2 个字节,用于表示单个字符,采用 Unicode 编码。
- 示例:
char ch = 'A';
boolean
:布尔型,只有两个值:true
和false
,常用于条件判断。
- 示例:
boolean flag = true;
二. 转义符
在 Java 中,转义符用于表示一些特殊的字符或控制字符。以下是一些常见的 Java 转义符及其含义:
\n
:换行符,将光标移动到下一行的开头。- 示例:
System.out.println("Hello\nWorld");
输出结果为:
- 示例:
Hello
World
-
\r
:回车符,将光标移动到当前行的开头。- 示例:
System.out.println("Hello\rWorld");
输出结果可能因系统而异,在某些系统上可能显示为World
,因为回车符将光标移到了行首并覆盖了前面的部分内容。
- 示例:
-
\t
:制表符,用于在输出中产生一定的缩进效果。- 示例:
System.out.println("Name\tAge");
输出可能类似于Name Age
,具体的缩进长度取决于系统设置。
- 示例:
-
\\
:表示反斜线字符\
。- 示例:
System.out.println("C:\\Program Files");
输出为C:\Program Files
- 示例:
-
\'
:表示单引号字符'
。- 示例:
System.out.println("It\'s a pen.");
输出为It's a pen.
- 示例:
-
\"
:表示双引号字符"
。- 示例:
System.out.println("He said, \"Hello!\"");
输出为He said, "Hello!"
- 示例:
转义符使得在字符串中能够准确地表示那些具有特殊含义的字符,从而增强了字符串处理的灵活性和准确性。
三. 数值类型相互转换
自动转换
在 Java 中,数字类型的自动转换遵循一定的规则。
当把一个取值范围小的数字类型的值赋给一个取值范围大的数字类型的变量时,会发生自动类型转换。
以下是数字类型自动转换的基本规则:
byte
可以自动转换为short
、int
、long
、float
、double
。
- 例如:
short num1 = 10; int num2 = num1;
short
可以自动转换为int
、long
、float
、double
。
- 例如:
int num3 = 200; long num4 = num3;
int
可以自动转换为long
、float
、double
。
- 例如:
float num5 = 300; double num6 = num5;
long
可以自动转换为float
、double
。
- 例如:
double num7 = 400L;
(注意这里给double
类型赋值一个long
类型的值时,要加上L
后缀)
char
可以自动转换为int
,因为char
在底层是用整数表示的 Unicode 值。
需要注意的是,自动类型转换可能会导致精度的损失。例如,将一个大的 int
或 long
值转换为 float
时,可能会因为 float
的精度限制而丢失一些小数位。
以下是一个示例代码,展示了数字类型的自动转换:
public class AutoTypeConversionExample {
public static void main(String[] args) {
byte b = 10;
short s = b; // byte 自动转换为 short
int i = s; // short 自动转换为 int
long l = i; // int 自动转换为 long
float f = l; // long 自动转换为 float
double d = f; // float 自动转换为 double
System.out.println("Byte value: " + b);
System.out.println("Short value: " + s);
System.out.println("Int value: " + i);
System.out.println("Long value: " + l);
System.out.println("Float value: " + f);
System.out.println("Double value: " + d);
}
}
在实际编程中,要根据具体的需求和数据的特点来谨慎处理类型转换,以避免出现意外的结果。
强制类型转换
在 Java 中,强制类型转换是将一种数据类型显式地转换为另一种数据类型。但强制类型转换可能会导致数据丢失或精度降低,需要谨慎使用。
以下是强制类型转换的基本语法:
目标数据类型 变量名 = (目标数据类型) 要转换的值;
例如,将一个 int
类型的值转换为 byte
类型:
int num1 = 128;
byte num2 = (byte) num1;
在这个例子中,由于 int
的取值范围大于 byte
,当进行强制类型转换时,num1
的值 128 超出了 byte
的取值范围 -128 到 127,会导致数据截断,实际 num2
的值为 -128 。
再比如,将一个 double
类型的值转换为 int
类型:
double num3 = 3.14;
int num4 = (int) num3;
这里会直接舍去小数部分,num4
的值为 3 。
需要注意的是,如果强制类型转换不合法,例如将一个超出目标类型取值范围的值进行转换,或者将一个不兼容的类型进行转换,会导致运行时错误。
以下是一个完整的示例代码,展示了不同类型的强制类型转换:
public class ForceTypeConversionExample {
public static void main(String[] args) {
// 将 int 转换为 byte
int intValue = 150;
byte byteValue = (byte) intValue;
System.out.println("将 int 转换为 byte: " + byteValue);
// 将 double 转换为 int
double doubleValue = 5.8;
int intValueFromDouble = (int) doubleValue;
System.out.println("将 double 转换为 int: " + intValueFromDouble);
// 将 long 转换为 short
long longValue = 1000L;
short shortValue = (short) longValue;
System.out.println("将 long 转换为 short: " + shortValue);
}
}
四. 引用类型
在 Java 中,引用类型用于操作对象。引用类型包括类、接口、数组等。
类类型
通过定义类来创建自定义的数据类型。例如:
class Person {
String name;
int age;
public void displayInfo() {
System.out.println("Name: " + name + ", Age: " + age);
}
}
可以创建 Person
类的对象,并通过引用来操作对象的属性和方法。
接口类型
定义了一组方法的规范,类可以实现接口来遵循这些规范。
interface Shape {
double calculateArea();
}
class Circle implements Shape {
double radius;
@Override
public double calculateArea() {
return Math.PI * radius * radius;
}
}
数组类型
用于存储相同类型的多个元素。
int[] numbers = {1, 2, 3, 4, 5};
String[] names = {"Alice", "Bob", "Charlie"};
引用类型与基本数据类型的主要区别在于:
-
存储方式:基本数据类型直接存储值,而引用类型存储的是对象的引用(内存地址)。
-
传递方式:作为参数传递时,基本数据类型是值传递,引用类型是引用传递。这意味着对引用类型参数的修改会影响到原始对象。
-
内存分配:基本数据类型的变量在栈上分配内存,而引用类型的对象通常在堆上分配内存,引用变量在栈上存储对象的引用。
例如:
class ReferenceExample {
public static void modifyObject(Person person) {
person.age = 30;
}
public static void main(String[] args) {
Person person1 = new Person();
person1.age = 20;
modifyObject(person1);
System.out.println(person1.age); // 输出 30
}
}
在上述示例中,通过引用传递修改了对象的属性。
总之,引用类型使 Java 能够更灵活地处理复杂的数据结构和对象关系,是构建大型程序的重要组成部分。