“学Java就像吃火锅,刚开始烫嘴,越吃越上瘾!” —— 某位头发日渐稀疏的程序员
一、Java为什么这么香?🌶️
1.1 祖师爷的馈赠
1995年James Gosling团队搞出Java时,绝对没想到这玩意能火到今天!(现在连咖啡机都跑Java了你敢信?)三大核心特性必须刻烟吸肺:
- 跨平台运行:一次编写到处报错?不!是到处运行!靠的是JVM虚拟机(后面细聊)
- 面向对象:万物皆对象!连你的相亲对象都是
new
出来的(扎心了) - 自动内存管理:再也不用像C++那样手动
delete
了,GC垃圾回收机制真香!
1.2 JDK/JRE/JVM 的关系
这三个字母经常把人绕晕,其实就像包子铺:
- JVM:蒸笼(能装包子)
- JRE:蒸笼+包子(能运行)
- JDK:蒸笼+包子+面粉+擀面杖(能开发)
二、手把手搭环境 🔧
2.1 JDK安装(超详细版)
- 官网下载最新JDK(认准
oracle.com
,别下到葫芦娃!) - 双击安装,路径建议
C:\Java\jdk-21\
(别装C盘根目录!系统炸了别找我) - 配置环境变量(超级重点!!!)
JAVA_HOME = C:\Java\jdk-21 Path += %JAVA_HOME%\bin
- 验证安装:命令行输入
java -version
,看到版本号就算成功!
2.2 IDE选哪个?
- IntelliJ IDEA:公认最强,社区版免费(学生党狂喜)
- Eclipse:老牌经典,插件多但有点卡
- VS Code:轻量级选手,适合小项目
个人建议:新手直接用IDEA,别折腾!等你会
HelloWorld
了再研究其他
三、语法基础(手把手环节)✍️
3.1 第一个程序
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello 秃头世界!");
}
}
运行结果:
Hello 秃头世界!
重点解析:
class
名必须和文件名一致!(不然直接报错)main
方法是程序入口,格式固定System.out.println
是最常用的输出语句(后面还会教printf
格式化输出)
3.2 数据类型八股文
类型 | 内存 | 范围 |
---|---|---|
byte | 1字节 | -128 ~ 127 |
short | 2字节 | -32768 ~ 32767 |
int | 4字节 | -21亿 ~ 21亿(最常用) |
long | 8字节 | 超大数(要加L后缀) |
float | 4字节 | 小数(要加f后缀) |
double | 8字节 | 常规小数(默认) |
char | 2字节 | Unicode字符 |
boolean | 1位 | true/false |
易错点:
long bigNum = 10000000000L; // 必须加L!
float pi = 3.14f; // 必须加f!
四、面向对象(OOP)三大特征 🧱
4.1 封装(Encapsulation)
把数据和方法包在类里,就像把钱包装进保险箱:
public class Person {
private String name; // 私有字段
// 对外暴露的get/set方法
public String getName() {
return name + "先生"; // 还能加点骚操作
}
public void setName(String name) {
if(name.length() > 10) {
throw new IllegalArgumentException("名字太长了!");
}
this.name = name;
}
}
4.2 继承(Inheritance)
子类自动获得父类的属性和方法:
class Animal {
void eat() {
System.out.println("干饭中...");
}
}
class Cat extends Animal {
void meow() {
System.out.println("喵~");
}
}
// 使用
Cat kitty = new Cat();
kitty.eat(); // 来自父类
kitty.meow(); // 自己的方法
4.3 多态(Polymorphism)
同一个方法在不同子类中有不同实现:
Animal[] animals = new Animal[]{new Cat(), new Dog()};
for (Animal a : animals) {
a.eat(); // 自动调用具体子类的方法
}
多态是设计模式的基础,理解后看框架源码会轻松很多!
五、异常处理(救命指南)🚑
5.1 try-catch-finally
try {
FileInputStream fis = new FileInputStream("test.txt");
} catch (FileNotFoundException e) {
System.out.println("文件没找到啊哥!");
e.printStackTrace();
} finally {
System.out.println("无论是否异常,这里都会执行");
}
5.2 常见异常类型
NullPointerException
:空指针(新人杀手No.1)ArrayIndexOutOfBoundsException
:数组越界ClassCastException
:类型转换错误IOException
:IO操作异常
最佳实践:
- 不要用
try-catch
包裹正常逻辑! - 早抛出,晚捕获
- 自定义异常继承
Exception
六、小项目实战:坦克大战 🎮
6.1 核心类设计
class Tank {
private int x, y; // 坐标
private int direction; // 方向
private int speed = 2; // 移动速度
public void move() {
switch(direction) {
case 0: y -= speed; break; // 上
case 1: x += speed; break; // 右
case 2: y += speed; break; // 下
case 3: x -= speed; break; // 左
}
}
public void fire() {
Bullet bullet = new Bullet(x, y, direction);
bullets.add(bullet);
}
}
6.2 碰撞检测
boolean isCollided(Tank t1, Tank t2) {
return Math.abs(t1.x - t2.x) < 40 &&
Math.abs(t1.y - t2.y) < 40;
}
这个项目虽然小,但涵盖了面向对象、集合操作、事件处理等核心知识!
七、面试高频题解析 💼
7.1 String vs StringBuilder
- String:不可变,每次修改都生成新对象(适合少量操作)
- StringBuilder:可变,线程不安全但高效(适合频繁拼接)
String s = "";
for(int i=0; i<10000; i++) {
s += i; // 疯狂创建新对象!性能杀手!
}
// 改用
StringBuilder sb = new StringBuilder();
for(int i=0; i<10000; i++) {
sb.append(i);
}
7.2 HashMap原理
- 数组+链表/红黑树结构
- 初始容量16,负载因子0.75
- 哈希冲突用链表法解决
- JDK8后链表长度>8转红黑树
经典问题:为什么重写equals必须重写hashCode?
- 保证相同对象哈希值相同
- 防止HashMap等集合出现逻辑错误
看到这里的都是勇士!Java基础就像盖房子的地基,虽然枯燥但决定了你能建多高。遇到问题多敲代码少空想,记住:
“代码不会骗人,bug总是你的!” —— 某位调试了6小时的程序员