Java语言基础:从特性到运行时环境

一、Java语言特性

1. 面向对象编程

Java是一门纯粹的面向对象语言,其核心特性包括:

  • 封装:通过访问修饰符(private/protected/public)控制属性和方法的可见性

    public class BankAccount {
      private double balance;  // 私有属性
      
      public void deposit(double amount) {  // 公开方法
          balance += amount;
      }
    }
  • 继承:使用extends关键字实现代码复用

    class Animal {
      void eat() { System.out.println("Eating..."); }
    }
    
    class Dog extends Animal {
      void bark() { System.out.println("Barking..."); }
    }
  • 多态:同一方法在不同子类中有不同实现

    Animal myDog = new Dog();  // 父类引用指向子类对象
    myDog.eat();  // 运行时确定实际调用的方法

实践建议:优先使用组合而非继承,避免过深的继承层次(建议不超过3层)

2. 平台无关性与JVM

Java的"一次编写,到处运行"特性依赖于JVM:

图1

关键点

  • 字节码是JVM的指令集,与具体平台无关
  • 不同平台需要安装对应的JVM实现
  • JIT(即时编译)将热点代码编译为本地机器码提升性能

3. 自动内存管理

Java通过垃圾回收器(GC)自动管理堆内存,主要算法:

  1. 标记-清除:标记不再使用的对象并清除
  2. 复制算法:将存活对象复制到新空间
  3. 分代收集:根据对象生命周期使用不同策略

实践建议

  • 避免创建过多短命对象(尤其在循环中)
  • 对于大对象,考虑使用SoftReferenceWeakReference
  • 使用-Xms-Xmx合理设置堆大小

4. 强类型系统

Java要求所有变量必须先声明类型,主要分为:

  • 基本类型:直接存储值

    int num = 10;         // 4字节
    double price = 19.99; // 8字节
    boolean flag = true;  // 1位
  • 引用类型:存储对象地址

    String name = "Java";  // 引用类型
    int[] arr = new int[5]; // 数组也是引用类型

类型转换规则

  • 小类型到大类型自动转换(intlong)
  • 大类型到小类型需要显式强制转换(doublefloat)

二、JVM架构深度解析

1. JVM核心组件

图2

2. 类加载过程

  1. 加载:查找并加载.class文件
  2. 验证:确保字节码符合规范
  3. 准备:为静态变量分配内存
  4. 解析:将符号引用转为直接引用
  5. 初始化:执行静态代码块和赋值

双亲委派模型

  • 自底向上检查类是否已加载
  • 自顶向下尝试加载类
  • 防止核心类被篡改

3. 运行时数据区

区域线程共享存储内容异常类型
方法区(Metaspace)类信息、常量、静态变量OutOfMemoryError
对象实例OutOfMemoryError
虚拟机栈栈帧(局部变量、操作数栈等)StackOverflowError
本地方法栈Native方法调用StackOverflowError
程序计数器当前线程执行的字节码行号

三、基础语法精要

1. 变量与数据类型

变量声明规范

// 推荐使用驼峰命名法
int studentCount = 30;  
final double PI = 3.14159;  // 常量使用全大写

类型默认值

  • 数值类型:0
  • boolean:false
  • 引用类型:null

2. 运算符优先级

优先级运算符
[] . () (方法调用)
! ~ ++ -- +(一元) -(一元) (强制转换)
* / %
+ -
<< >> >>>
< <= > >= instanceof
== !=
&
^
&&

3. 控制流最佳实践

switch表达式(Java 14+)

String dayType = switch (day) {
    case "Mon", "Tue", "Wed", "Thu", "Fri" -> "Weekday";
    case "Sat", "Sun" -> "Weekend";
    default -> throw new IllegalArgumentException("Invalid day: " + day);
};

循环优化建议

  • 遍历集合优先使用增强for循环
  • 需要索引时使用传统for循环
  • 避免在循环内创建对象
// 好于传统for循环
for (String item : items) {
    System.out.println(item);
}

四、性能与调试基础

1. 常用JVM参数

参数说明推荐设置
-Xms初始堆大小物理内存1/4
-Xmx最大堆大小物理内存1/2
-XX:+UseG1GC使用G1垃圾收集器生产环境推荐
-XX:+HeapDumpOnOutOfMemoryErrorOOM时生成堆转储必开启

2. 基础诊断命令

# 查看Java进程
jps -l

# 查看堆内存使用
jstat -gcutil <pid> 1000 5

# 生成线程快照
jstack <pid> > thread_dump.log

实践建议:开发环境可添加-XX:+PrintGCDetails参数记录GC日志

总结

Java语言的核心优势在于其平衡了开发效率与运行性能。理解这些基础概念是成为Java专家的第一步。建议初学者:

  1. 先掌握语言特性再学习框架
  2. 定期使用jcmd、VisualVM等工具观察程序运行状态
  3. 阅读JDK重要类(如String、ArrayList)的源代码
  4. 保持对新版本特性的关注(如Java 17的密封类)

记住:扎实的基础知识是解决复杂问题的前提条件。

添加新评论