Java 学习笔记:变量、字面值与类型转换

这是一篇 Java 入门笔记,主要整理变量相关的基础知识:基本数据类型、字面值、类型转换、变量命名规则以及作用域。

Java 的类型系统比较严格。理解这些基础规则之后,再看方法、类、对象和集合时会轻松很多。

1. Java 的 8 种基本数据类型

Java 中有 8 种基本数据类型,可以分成 4 类:

1. 整型: byte、short、int、long
2. 字符型: char
3. 浮点型: float、double
4. 布尔型: boolean

变量的类型决定了它能保存什么样的数据,也决定了它的取值范围。

2. 整型

整型变量用于保存整数。byteshortintlong 的区别主要在于占用空间和取值范围不同。

byte  : 8 位,  1 字节,范围 -128 ~ 127
short : 16 位, 2 字节,范围 -32768 ~ 32767
int   : 32 位, 4 字节,范围 -2147483648 ~ 2147483647
long  : 64 位, 8 字节,范围 -9223372036854775808 ~ 9223372036854775807

示例:

public class HelloWorld {
    public static void main(String[] args) {
        byte b = 1;
        short s = 200;
        int i = 300;
        long l = 400L;

        // byte 的最大值是 127,下面这一行会编译报错
        // byte b2 = 128;
    }
}

如果给变量赋的值超出了类型范围,编译器会直接报错。必要时可以做类型转换,但需要注意溢出风险。

3. 字符型 char

char 用来保存一个字符,值需要放在单引号里。

public class HelloWorld {
    public static void main(String[] args) {
        char c = '中';

        // char 只能保存一个字符,下面两行都会编译报错
        // char c2 = '中国';
        // char c3 = 'ab';
    }
}

注意:单引号表示字符,双引号表示字符串。

char c = 'A';      // 字符
String s = "ABC";  // 字符串

4. 浮点型

浮点数用于保存小数,Java 中有两种浮点类型:

float  : 32 位,赋值时通常需要在数字后加 f 或 F
double : 64 位,小数字面值默认就是 double

示例:

public class HelloWorld {
    public static void main(String[] args) {
        double d = 123.45;

        // 54.321 默认是 double,不能直接赋给 float
        // float f = 54.321;

        float f2 = 54.321F;
    }
}

如果一个小数没有额外标记,Java 默认把它当成 double。要声明 float,需要在数字后加 fF

5. 布尔型 boolean

boolean 用来表示真假,只有两个值:

true
false

示例:

public class HelloWorld {
    public static void main(String[] args) {
        boolean b1 = true;
        boolean b2 = false;

        // Java 不能直接用 0 或 1 给 boolean 赋值
        // boolean b3 = 1;
    }
}

虽然在很多语言或底层实现里真假可以和 01 联系起来,但 Java 语法层面不允许这样赋值。

6. String 不是基本类型

String 使用非常频繁,所以容易被误以为是基本类型。实际上它是一个类,不属于 8 种基本数据类型。

public class HelloWorld {
    public static void main(String[] args) {
        String str = "Hello Java";
    }
}

另外,String 是不可变对象。字符串一旦创建,其内容本身不会被修改;看似修改字符串,通常是创建了新的字符串对象。

7. 整数字面值

整数字面值默认是 int 类型。如果以 Ll 结尾,则表示 long 类型。实际写代码时建议用大写 L,因为小写 l 容易和数字 1 混淆。

Java 支持多种进制写法:

十进制: 26
十六进制: 0x1a
八进制: 032
二进制: 0b11010

示例:

public class HelloWorld {
    public static void main(String[] args) {
        long val = 26L;       // long 类型
        int decVal = 26;      // 十进制
        int hexVal = 0x1a;    // 十六进制
        int octVal = 032;     // 八进制
        int binVal = 0b11010; // 二进制,Java 7 开始支持

        System.out.println(decVal);
        System.out.println(hexVal);
        System.out.println(octVal);
        System.out.println(binVal);
    }
}

8. 浮点数字面值

浮点数字面值默认是 double。如果以 Ff 结尾,就表示 float

浮点数也可以使用科学计数法:

1.234e2 = 1.234 x 10^2 = 123.4

示例:

public class HelloWorld {
    public static void main(String[] args) {
        float f1 = 123.4F;
        double d1 = 123.4;
        double d2 = 1.234e2;

        System.out.println(f1);
        System.out.println(d1);
        System.out.println(d2);
    }
}

9. 字符与字符串字面值

字符使用单引号,字符串使用双引号。

如果需要表示制表符、换行、引号、反斜杠等特殊字符,需要用转义符 \

public class HelloWorld {
    public static void main(String[] args) {
        String name = "SF";
        char a = 'c';

        char tab = '\t';          // 制表符
        char carriageReturn = '\r'; // 回车
        char newLine = '\n';      // 换行
        char doubleQuote = '\"';  // 双引号
        char singleQuote = '\'';  // 单引号
        char backslash = '\\';    // 反斜杠
    }
}

10. 类型转换

Java 的类型转换可以简单记成一句话:

从小到大,自动转换;从大到小,强制转换。

可以把低精度类型理解成小杯子,高精度类型理解成大杯子。小杯子里的水倒进大杯子,通常没问题;大杯子倒进小杯子,就可能装不下。

常见转换方向:

byte -> short -> int -> long -> float -> double
char -> int -> long -> float -> double

需要注意:charshort 虽然都是 16 位,但它们之间不能直接互相赋值,仍然需要强制转换。

10.1 char 和 short 的转换

public class HelloWorld {
    public static void main(String[] args) {
        char c = 'A';
        short s = 80;

        c = (char) s;

        // short 和 char 不能直接互相赋值
        // s = c;
        s = (short) c;
    }
}

10.2 低精度向高精度转换

低精度类型赋值给高精度类型时,通常可以自动转换。

public class HelloWorld {
    public static void main(String[] args) {
        int i = 50;
        long l = i;

        System.out.println(l);
    }
}

这里 int 是 32 位,long 是 64 位,int 放进 long 没有问题。

10.3 高精度向低精度转换

高精度类型赋值给低精度类型时,需要强制转换。

public class HelloWorld {
    public static void main(String[] args) {
        byte b;
        int i1 = 10;
        int i2 = 300;

        b = (byte) i1;
        System.out.println(b); // 10

        b = (byte) i2;
        System.out.println(b); // 44

        System.out.println(Integer.toBinaryString(i2));
    }
}

i2 的值是 300,已经超过了 byte 的范围。强制转换后会发生截断,结果不再是原来的 300,所以强制转换要谨慎使用。

11. 变量命名规则

Java 变量命名需要遵守这些规则:

1. 只能使用字母、数字、$、_
2. 第一个字符不能是数字
3. 不能直接使用 Java 关键字
4. 可以包含关键字,例如 className 可以,但 class 不可以
5. 中文也可以作为变量名,但实际项目中不建议这样写

示例:

int age = 18;
int userAge = 20;
int _count = 1;
int $value = 2;

// int 1name = 1; // 错误:不能以数字开头
// int class = 5; // 错误:class 是关键字
int class5 = 5;   // 可以,但不推荐这样命名

实际写代码时,建议使用有意义的英文单词,并遵循驼峰命名法:

int userAge = 18;
String userName = "Tom";

12. 变量作用域

变量能在哪些地方被访问,取决于它声明的位置。

12.1 成员变量

声明在类中、方法外的变量,叫成员变量,也可以叫字段、属性或 Field。

public class HelloWorld {
    int i = 1;
    int j = i;

    public void method1() {
        System.out.println(i);
    }

    public void method2() {
        System.out.println(i);
    }
}

成员变量从声明位置开始,在当前对象的各个方法中都可以访问。

12.2 参数

声明在方法括号里的变量叫参数。参数只能在当前方法内部使用。

public class HelloWorld {
    public void method1(int i) {
        System.out.println(i);
    }

    public void method2() {
        // method2 不能访问 method1 的参数 i
        // System.out.println(i);
    }
}

12.3 局部变量

声明在方法内部的变量叫局部变量。它的作用域从声明位置开始,到所在代码块结束。

public class HelloWorld {
    public void method() {
        int i = 5;
        System.out.println(i);

        {
            System.out.println(i);
            int j = 6;
            System.out.println(j);
        }

        // j 的作用域只在上面的子代码块内
        // System.out.println(j);
    }
}

小结

这篇笔记主要记录了 Java 变量相关的基础知识:

基本数据类型 -> 字面值 -> 类型转换 -> 命名规则 -> 作用域

这些规则看起来细碎,但都是后续学习 Java 语法、面向对象和集合框架的基础。入门阶段不需要死记所有取值范围,先理解“类型限制”和“转换风险”会更重要。