1. Java 学习笔记:从环境搭建到第一个程序
最近在系统整理Java学习路线,发现很多新手卡在环境配置和基础语法阶段。这篇笔记将从JDK安装开始,完整记录一个Java程序的诞生过程,重点分享那些官方文档里不会写的实操细节。
2. 开发环境全攻略
2.1 JDK版本选择陷阱
当前LTS版本是Java 17,但企业常用Java 8和11。建议新手直接安装Java 17:
- 下载时认准Oracle JDK或OpenJDK
- 避免使用某些修改版JDK(如某数字公司版本)
- 安装后执行
java -version验证
注意:PATH环境变量配置错误是80%新手遇到的第一个坑。Windows用户建议使用绝对路径配置,不要用JAVA_HOME变量。
2.2 开发工具选型
IntelliJ IDEA社区版完全够用:
- 比Eclipse更智能的代码提示
- 内置Maven/Gradle支持
- 调试器可视化程度高
初次使用建议关闭这些功能:
- 代码自动折叠(影响学习)
- 过度优化的代码补全
- 非必要的插件
3. 第一个Java程序解剖
3.1 Main方法深度解析
java复制public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
关键点说明:
- 类名必须与文件名完全一致(包括大小写)
- main方法的参数String[] args实际是命令行参数
- System.out.println会自动换行,print则不会
3.2 编译执行全流程
- 保存为HelloWorld.java
- 命令行执行
javac HelloWorld.java - 生成HelloWorld.class字节码文件
- 运行
java HelloWorld(不要加.class后缀)
常见报错处理:
- "找不到符号":检查类名/方法名拼写
- "无法加载主类":确认class文件生成路径
- "编码GBK的不可映射字符":添加-encoding UTF-8参数
4. 核心语法精要
4.1 变量类型选择策略
| 类型 | 内存占用 | 使用场景 | 注意事项 |
|---|---|---|---|
| int | 4字节 | 普通计算 | 注意整数溢出 |
| double | 8字节 | 小数运算 | 避免直接比较 |
| String | 变长 | 文本处理 | 不可变性影响性能 |
| boolean | 1bit | 逻辑判断 | 不能用0/1代替 |
4.2 控制语句实战技巧
if-else的优化写法:
java复制// 传统写法
if(age > 18) {
System.out.println("成年");
} else {
System.out.println("未成年");
}
// 优化写法
String result = age > 18 ? "成年" : "未成年";
System.out.println(result);
for循环避坑指南:
- 修改循环条件可能导致死循环
- 大数据量时优先使用增强for循环
- 嵌套循环注意变量命名冲突
5. 面向对象入门
5.1 类与对象的关系
java复制// 类的定义
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
public void sayHello() {
System.out.println("Hello, I'm " + name);
}
}
// 对象使用
Person p = new Person("张三");
p.sayHello();
关键理解:
- 类是模板,对象是实例
- new关键字触发构造函数
- this指代当前对象
5.2 封装性原则实践
为什么要用private + getter/setter:
- 防止外部直接修改数据
- 可以在方法中添加校验逻辑
- 方便后期修改内部实现
错误示例:
java复制public class BankAccount {
public double balance; // 应该设为private
}
6. 异常处理机制
6.1 try-catch最佳实践
java复制try {
FileInputStream fis = new FileInputStream("test.txt");
// 使用资源
} catch (FileNotFoundException e) {
System.err.println("文件未找到: " + e.getMessage());
// 记录日志或进行恢复操作
} finally {
// 确保资源释放
}
重要原则:
- 不要捕获Exception基类
- finally中不要包含return语句
- 异常信息要包含上下文
6.2 自定义异常设计
java复制class AgeOutOfRangeException extends Exception {
public AgeOutOfRangeException(String message) {
super(message);
}
}
// 使用示例
void setAge(int age) throws AgeOutOfRangeException {
if(age < 0 || age > 150) {
throw new AgeOutOfRangeException("年龄不合法");
}
this.age = age;
}
7. 开发调试技巧
7.1 断点调试进阶
IntelliJ调试功能:
- 条件断点(右键断点设置条件)
- 表达式求值(Alt+F8)
- 多线程调试(切换线程上下文)
7.2 日志输出规范
推荐使用SLF4J+Logback:
java复制private static final Logger logger = LoggerFactory.getLogger(MyClass.class);
void process() {
logger.debug("开始处理...");
try {
// 业务逻辑
logger.info("处理完成,结果:{}", result);
} catch(Exception e) {
logger.error("处理失败", e);
}
}
日志级别选择:
- DEBUG:开发环境详细日志
- INFO:生产环境关键节点
- ERROR:异常情况必须记录
8. 项目结构规范
8.1 标准Maven目录
code复制src/
main/
java/ # 源代码
resources/ # 配置文件
test/
java/ # 测试代码
pom.xml # 项目配置
8.2 包命名规则
公司域名倒序+项目名:
code复制com.company.project.module
避免使用:
- 单个单词的包名
- java/javax开头的包名
- 全部小写或全部大写
9. 常见问题解决方案
9.1 中文乱码问题
统一编码方案:
- IDE设置UTF-8编码
- 编译时添加-encoding参数
- 文件读写指定Charset
java复制new String(bytes, StandardCharsets.UTF_8);
Files.readString(path, StandardCharsets.UTF_8);
9.2 依赖冲突处理
使用Maven查看依赖树:
code复制mvn dependency:tree
解决方案:
- 排除特定依赖
- 强制指定版本
- 使用dependencyManagement统一管理
10. 学习路线建议
10.1 基础阶段重点
- 掌握基本语法(3周)
- 理解OOP思想(2周)
- 熟悉常用API(4周)
- 练习算法题(持续)
10.2 推荐学习资源
- 书籍:《Java核心技术》《Effective Java》
- 视频:尚硅谷Java基础
- 网站:LeetCode、牛客网
- 工具:Alibaba Java Coding Guidelines插件
实际编码时发现,很多语法细节只有在出错时才会真正理解。建议初学者不要过度追求速成,每个概念都要通过实际编码验证。比如字符串比较要用equals()而不是==,这个知识点我当初在面试时仍然犯过错。