Java基础语法

Java基础语法全面解析

目录

一、数据类型

        1.1. 基本数据类型

        1.2. 引用类型

        1.3. 区别

二、运算符

        2.1. 算数运算符

        2.2. 关系运算符

        2.3. 布尔逻辑运算符

        2.4. 位逻辑运算符

        2.5. 条件运算符

        2.6. 赋值运算符

        2.7. 其他运算符

        2.8. 运算符的优先级

三、类型转换

        3.1. 基本数据类型的类型转换

        3.2. 引用数据类型的类型转换

        3.3. 基本类型和包装类的转换

        3.4. 字符串与其他类型的转换

四、常量和变量

        4.1. 常量

        4.2. 变量

五、条件语句

        5.1. if 语句

        5.2. if - else 语句

        5.3. if - else if - else 语句

        5.4. switch 语句

六、循环语句

        6.1. for 循环

        6.2. while 循环

        6.3. do…while 循环

        6.4. 增强型for循环(foreach) 

七、跳转语句

        7.1. break语句

        7.2. continue语句

        7.3. return语句

        7.4. 带标签的break和continue


一、数据类型

        1.1. 基本数据类型

  • 存储实际值:直接存储数据的二进制值。

  • 固定大小:每种类型占用的内存大小由 Java 语言规范明确定义。

  • 性能高效:操作速度快,内存占用小。

基本数据类型数据长度最大数据存储量数值范围默认值
整型byte 8位(1字节)255-128 ~ 1270
short  16(2字节)65536-32768 ~ 327670
int32(4字节) 2^{32}-1-2^{31} ~ 2^{31}-10
long64(8字节)2^{64}-1-2^{63} ~ 2^{63}-10
浮点型float32(4字节)3.4e-45 ~ 1.4e380.0f
double64(8字节)4.9e-324 ~ 18e3080.0d
布尔型boolean只有 ture 和 false 两个取值false
字符型char16位(2字节)存储Unicode码,用单引号赋值'\u0000'
  • 基本类型没有面向对象的特性(如方法调用),但可以通过包装类(如 IntegerDouble)转换为对象。

  • 默认值仅适用于类的成员变量,局部变量必须显式初始化后才能使用。

        1.2. 引用类型

  • 存储引用(地址):变量存储的是对象在堆内存中的地址,而非实际数据。

  • 动态内存分配:可动态创建和销毁对象。通过 new 关键字在堆内存中创建对象,对象实例存储在堆内存中,由 JVM 自动管理(垃圾回收)。

  • 支持面向对象:可以调用对象的方法和访问字段,支持继承、多态、封装等特性(如类、接口)。

  • 默认值为 null:未初始化的引用变量值为 null,访问会抛出 NullPointerException

核心引用类型

类型

定义方式

特点

类(Class)

class 关键字定义

实例化对象,支持继承、多态等特性。

接口(Interface)

interface 关键字定义

不能被直接实例化,需通过实现类创建对象,支持多实现。

数组(Array)

类型[] 语法声明

存储固定大小的同类型元素,本质是对象。

枚举(Enum)

enum 关键字定义

表示一组固定常量,全局唯一,可定义方法和字段。

注解(Annotation)

@interface 关键字定义

为代码添加元数据(如配置、检查),通过反射读取。

记录类(Record)

record 关键字(Java 16+)

简化不可变数据类的定义,自动生成常用方法。

特殊引用类型
类型说明
Lambda 表达式实现函数式接口的匿名方法,本质是接口的实例。
方法引用简化 Lambda 表达式的语法,指向已有方法。
null 引用所有引用类型的默认值,表示未指向任何对象。
// 1. 类
class Student {
    String name;
    int age;
}
Student stu = new Student();

// 2. 接口
interface Flyable {
    void fly();
}
Flyable bird = new Flyable() {
    public void fly() {
        System.out.println("Bird flying");
    }
};

// 3. 数组
int[] scores = {90, 85, 95};

// 4. 枚举
enum Weekday { MONDAY, TUESDAY }
Weekday day = Weekday.MONDAY;

// 5. 注解
@Deprecated
class OldClass { }

// 6. 记录类(Java 16+)
record User(String name, int id) { }
User user = new User("Alice", 1001);

// 7. Lambda 表达式(函数式接口)
Runnable task = () -> System.out.println("Task running");

// 8. 方法引用
Consumer<String> printer = System.out::println;

        1.3. 区别

特性基本数据类型引用类型
存储内容直接存储二进制值内存地址(指向对象)
内存分配位置栈内存堆内存(对象) + 栈内存(引用变量)
默认值有默认值默认 null
操作方式直接操作数值通过引用调用方法或访问字段
性能高效(内存小,操作快)相对较低(涉及堆内存和对象管理)
是否可调用方法

在 Java 中区分基本数据类型和引用类型是为了在性能效率、内存管理和面向对象特性之间取得平衡。

  • 基本数据类型直接存储值,操作时直接在栈内存中进行,且内存占用更小。引用类型存储需要通过对象引用访问堆内存中的数据,涉及额外的内存寻址,性能相对较低,并且需要额外存储对象头、字段对齐等信息,内存开销大。

  • 基本类型的值直接存储在栈内存中,生命周期与方法调用绑定,自动销毁,分配和回收效率高,适合频繁操作的简单数据。引用类型的对象存储在堆内存中,由垃圾回收器管理,生命周期不可控。堆内存支持动态内存分配。适合存储大型或复杂对象。

  • 基本类型没有方法、无法继承、不支持多态。引用类型支持继承、多态等特性,可以实现复杂业务逻辑和抽象建模。

二、运算符

        2.1. 算数运算符

运算符说明
+
-
*
/
%取模(取余)
++自增
--自减
  • 用于基本数学计算,适用于数值类型(intdouble 等)

  • ++a(前置自增)先加后用,a++(后置自增)先用后加。

  • 字符串拼接也使用 +(如 "Hello" + "World")。

        2.2. 关系运算符

运算符说明
==等于
!=不等于
>大于
<小于
>=大于等于
<=小于等于

        2.3. 布尔逻辑运算符

运算符说明
&&与(AND)
||或(OR)
!非(NOT)
&简化非
|简化或
^异或(XOR)
  • 短路运算符&& 和 || 若左侧已能确定结果,右侧不再执行。

  • 非短路运算符 & 和 | 会执行所有操作。

        2.4. 位逻辑运算符

运算符说明
~按位取反
&按位与
|按位或
^按位异或
>>右移
>>>右移并用0填充
<<左移
  • 直接操作二进制位,适用于整数类型(intlong 等)。

        2.5. 条件运算符

// 条件运算符示例
int max = (a > b) ? a : b;

        2.6. 赋值运算符

运算符说明
=赋值
+=加后赋值
-=减后赋值
*=乘后赋值
/=除后赋值
%=取模后赋值
&=位与后赋值
|=位或后赋值
^=位异或后赋值

        2.7. 其他运算符

// 1. () :改变运算的优先级或调用方法
int result = (5 + 3) * 2; // 16

// 2. instanceof :检查对象是否为某个类的实例
String s = "Hello";
boolean isString = s instanceof String; // true


// 3. 成员访问符. :访问对象的属性或方法
String s = "Java";
int length = s.length(); // 4

// 4. new :创建对象实例
Object obj = new Object();

        2.8. 运算符的优先级

    运算符按优先级从高到低执行(部分常见优先级):

  1. ()[].

  2. !~++--(单目运算符)

  3. */%

  4. +-

  5. <<>>>>>

  6. <<=>>=

  7. ==!=

  8. &^|

  9. &&||

  10. ?:

  11. =+=-= 等赋值运算符

三、类型转换

        3.1. 基本数据类型的类型转换

自动类型转换(隐式转换)当小范围类型的值赋给大范围类型的变量时,Java 会自动完成转换,无需显式操作。

  • 支持的类型范围顺序:
    byte → short → int → long → float → double
    char → int → long → float → double

强制类型转换(显式转换):当大范围类型的值赋给小范围类型的变量时,需要显式强制转换,可能丢失精度。

  • 强制转换可能导致数据丢失(如浮点数转整数)或溢出(如大整数转小范围整数)。

  • 编译时不会报错,但需开发者自行确保转换逻辑正确。

// 隐式转换示例
int a = 10;
long b = a;         // int → long(自动转换)

float c = 3.14f;
double d = c;       // float → double(自动转换)

char ch = 'A';
int code = ch;      // char → int(自动转换,'A' 的 ASCII 码为 65)


// 显式转换示例
double x = 3.14;
int y = (int) x;    // double → int(强制转换,结果为 3,丢失小数部分)

long num = 1000L;
short s = (short) num; // long → short(若 num 超出 short 范围,结果会溢出)

        3.2. 引用数据类型的类型转换

向上转型:将子类对象赋给父类引用,自动完成,安全且无需强制转换。

  • 父类引用只能访问父类中定义的属性和方法。

  • 若子类重写了父类方法,实际调用的是子类的方法(多态)

向下转型:将父类引用转回子类引用,需显式强制转换,存在风险。
前提:父类引用实际指向的是目标子类对象,否则会抛出 ClassCastException

// 示例
class Animal {
    void eat() { System.out.println("Animal eats"); }
}

class Dog extends Animal {
    void bark() { System.out.println("Dog barks"); }
}


// 向上转型示例
Animal animal = new Dog(); // 向上转型(Dog → Animal)
animal.eat();             // 输出 "Animal eats"
// animal.bark();         编译错误:Animal 类没有 bark() 方法

// 向下转型示例
Animal animal = new Dog();  // 向上转型
Dog dog = (Dog) animal;     // 向下转型(Animal → Dog)
dog.bark();                 // 输出 "Dog barks"

// 错误示例
Animal wrongAnimal = new Animal();
// Dog wrongDog = (Dog) wrongAnimal;  运行时抛出 ClassCastException

// 可用instanceof避免异常
if (animal instanceof Dog) {
    Dog dog = (Dog) animal; // 安全转换
}

        3.3. 基本类型和包装类的转换

自动装箱:基本类型自动转换为对应的包装类对象(Java 5+ 支持)。

自动拆箱:包装类对象自动转换为对应的基本类型。

// 自动装箱示例
Integer num = 10;     // 自动装箱:int → Integer(等价于 Integer.valueOf(10))
Double d = 3.14;      // 自动装箱:double → Double

// 自动拆箱示例
Integer numObj = 100;
int num = numObj;     // 自动拆箱:Integer → int(等价于 numObj.intValue())
  • 自动装箱和拆箱由编译器在编译阶段完成。

  • 频繁装箱/拆箱可能影响性能(如循环中大量使用包装类)。

  • null 拆箱会抛出 NullPointerException

        3.4. 字符串与其他类型的转换

// 1. 基本类型 → 字符串
// 方法1:String.valueOf()
String s1 = String.valueOf(100);    // "100"
String s2 = String.valueOf(3.14);   // "3.14"
// 方法2:拼接空字符串
String s3 = 100 + "";               // "100"

// 2. 字符串 → 基本类型
// 方法:使用包装类的 parseXxx() 方法(字符串内容必须符合目标类型的格式)
int num = Integer.parseInt("123");         // 123
double d = Double.parseDouble("3.14");     // 3.14
boolean flag = Boolean.parseBoolean("true"); // true

// 3. 对象 → 字符串
// 方法1:toString()
Integer num = 100;
String s = num.toString(); // "100"
// 方法2:格式化输出
String s = String.format("%d", 100); // "100"

四、常量和变量

        4.1. 常量

  • 使用 final 关键字声明,且必须初始化。

  • 命名规范:全大写字母,单词间用下划线分隔(如 MAX_SIZE

public class ConstantsDemo {
    // 静态常量(类)
    public static final double PI = 3.14159;

    // 实例常量(对象)
    private final String DEFAULT_NAME = "Unknown";

    public void printInfo() {
        // 局部常量(方法内)
        final int MAX_ATTEMPTS = 3;
        System.out.println(DEFAULT_NAME + " attempts: " + MAX_ATTEMPTS);
    }
}

        4.2. 变量

public class VariableDemo {
    // 静态常量
    public static final String APP_NAME = "MyApp";

    // 实例变量
    private int instanceVar = 3;

    // 静态变量
    private static int staticVar = 33;

    public void method() {
        // 局部变量
        int localVar = 333;
        System.out.println(localVar);

        // 局部常量
        final int LOCAL_CONST = 3333;
        System.out.println(LOCAL_CONST);
    }

    public static void main(String[] args) {
        VariableDemo demo = new VariableDemo();
        demo.method();
        System.out.println(APP_NAME);
        System.out.println(demo.instanceVar);
        System.out.println(staticVar);
    }
}

五、条件语句

        5.1. if 语句

// 语法
if(条件){
    // 条件为 ture 时执行
}

// 示例
int score = 80;
if (score >= 60) {
    System.out.println("及格");
}

        5.2. if - else 语句

// 语法
if (条件) {
    // 条件为 true 时执行
} else {
    // 条件为 false 时执行
}

// 示例
int age = 18;
if (age >= 18) {
    System.out.println("成年人");
} else {
    System.out.println("未成年人");
}

        5.3. if - else if - else 语句

// 语法
if (条件1) {
    // 条件1为 true 时执行
} else if (条件2) {
    // 条件2为 true 时执行
} else {
    // 所有条件均为 false 时执行
}

// 示例
int score = 85;
if (score >= 90) {
    System.out.println("优秀");
} else if (score >= 80) {
    System.out.println("良好");
} else {
    System.out.println("需努力");
}

        5.4. switch 语句

// 语法
switch (表达式) {
    case 值1:
        // 匹配值1时执行
        break;
    case 值2:
        // 匹配值2时执行
        break;
    default:
        // 无匹配时执行
}
 
// 示例
int day = 3;
switch (day) {
    case 1:
        System.out.println("周一");
        break;
    case 2:
        System.out.println("周二");
        break;
    default:
        System.out.println("其他日期");
}

// Java 12+ 支持箭头语法(->)和 yield 返回值
int day = 3;
switch (day) {
    case 1 -> System.out.println("周一");
    case 2 -> System.out.println("周二");
    default -> System.out.println("其他日期");
}
  • case 值必须是常量,且类型与 switch 表达式兼容。

  • 如果不写 break,会继续执行后续 case 的代码。

六、循环语句

        6.1. for 循环

// 语法
for (初始化; 循环条件; 迭代操作) {
    // 循环体
}

// 示例
for (int i = 0; i < 6; i++) {
    System.out.println(i); // 输出 0~5
}

        6.2. while 循环

// 语法
while (循环条件) {
    // 循环体
}

// 示例
int i = 0;
while (i < 6) {
    System.out.println(i); // 输出 0~5
    i++;
}

        6.3. do…while 循环

// 语法
do {
    // 循环体(至少执行一次)
} while (循环条件);

// 示例
int i = 0;
do {
    System.out.println(i); // 输出 0~5
    i++;
} while (i < 6);

        6.4. 增强型for循环(foreach) 

// 语法
for (元素类型 变量名 : 集合或数组) {
    // 遍历元素
}

// 示例
int[] nums = {0, 1, 2, 3, 4, 5};
for (int num : nums) {
    System.out.println(num); // 输出 0, 1, 2, 3, 4, 5
}

七、跳转语句

        7.1. break语句

作用:立即退出当前循环或 switch 语句。

// 示例
for (int i = 0; i < 10; i++) {
    if (i == 6) {
        break; // 当 i=6 时退出循环
    }
    System.out.println(i); // 输出 0~5
}

        7.2. continue语句

作用:跳过当前循环的剩余代码,进入下一次循环。

// 示例
for (int i = 0; i < 6; i++) {
    if (i == 3) {
        continue; // 跳过 i=3 的循环
    }
    System.out.println(i); // 输出 0,1,2,4,5
}

        7.3. return语句

作用:结束当前方法的执行,并可返回一个值。

// 示例
public int add(int a, int b) {
    return a + b; // 返回结果并退出方法
}

        7.4. 带标签的break和continue

作用:用于跳出多层循环。

// 示例
outerLoop:
for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
        if (i == 1 && j == 1) {
            break outerLoop; // 直接退出外层循环
        }
        System.out.println(i + "," + j);
    }
}
// 输出:0,0; 0,1; 0,2; 1,0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值