第3章:Java基础速通(上)

各位同学,欢迎来到Java基础速通的上半场。说实话,很多零基础转行的朋友,一听到「面向对象」、「集合框架」这些词就头大。我当年刚学的时候也一样,感觉像在看天书。但别怕,这一章我会用最接地气的方式,带你把这些硬骨头啃下来。

3.1 Java开发环境搭建

工欲善其事,必先利其器。咱们先搞定环境。

3.1.1 JDK安装与配置

JDK是Java的开发工具包。说白了,没有它,你的代码就是一堆文本。

  1. 下载JDK:去Oracle官网下载,或者用OpenJDK。我个人习惯用JDK 8或11,这两个版本最稳定,企业里用得最多。
  2. 安装:一路默认路径就行。但我建议你记一下安装路径,比如 C:\Program Files\Java\jdk1.8.0_291
  3. 配置环境变量
    • 新建 JAVA_HOME,值填你的JDK安装路径。
    • Path 变量里加上 %JAVA_HOME%\bin
⚠️ 避坑指南:我曾经遇到过一位学员,配置完环境变量后,在命令行输入 java -version 还是报错。折腾了半天,发现是Path里多了一个分号。记住,路径之间用英文分号隔开,别用中文的!

3.1.2 IDE选择

写代码总不能用记事本吧?我推荐两个:

  • IntelliJ IDEA:目前最流行的Java IDE,社区版免费。我个人强烈推荐。
  • Eclipse:老牌IDE,免费开源。如果你公司用这个,也别排斥。

安装好IDE后,新建一个项目,写个Hello World试试:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, 大数据世界!");
    }
}

能跑通,说明环境没问题了。

3.2 基本语法

Java的语法,其实和C/C++很像。如果你学过其中一门,上手会很快。如果没学过,也别慌,咱们一步步来。

3.2.1 变量与数据类型

Java是强类型语言。什么意思?就是每个变量在声明时,必须指定类型。你不能像Python那样,随便写个 x = 10 就完事。

数据类型 占用空间 示例
int 4字节 int age = 25;
double 8字节 double price = 19.99;
boolean 1位 boolean isOk = true;
String 引用类型 String name = "张三";
💡 小技巧:在项目中,我习惯用 long 类型来存时间戳,比如 long timestamp = System.currentTimeMillis();。别用 int,因为 int 最大只能存到21亿左右,时间戳早就超了。

3.2.2 运算符与流程控制

运算符没什么好说的,加减乘除、取模、自增自减,和数学一样。流程控制里,if-elsefor 循环是最常用的。

// 判断成绩等级
int score = 85;
if (score >= 90) {
    System.out.println("优秀");
} else if (score >= 80) {
    System.out.println("良好");
} else {
    System.out.println("继续努力");
}

// 循环打印1到5
for (int i = 1; i <= 5; i++) {
    System.out.println(i);
}

嗯,这里要注意:for 循环里的 i++,很多人写成 i+1,这是不对的。 i++ 是自增,i+1 只是计算,不会改变 i 的值。

3.3 面向对象

面向对象是Java的核心。你想想看,现实世界里的任何东西,都可以抽象成一个「对象」。比如一辆车,它有颜色、品牌(属性),它能跑、能停(方法)。

3.3.1 类与对象

类是模板,对象是实例。就像一张汽车设计图(类),和根据这张图造出来的真车(对象)。

// 定义一个类
public class Car {
    // 属性
    String brand;
    String color;
    
    // 方法
    public void run() {
        System.out.println(brand + " 正在行驶...");
    }
}

// 创建对象
public class Main {
    public static void main(String[] args) {
        Car myCar = new Car();
        myCar.brand = "特斯拉";
        myCar.color = "红色";
        myCar.run();  // 输出:特斯拉 正在行驶...
    }
}

我在项目中遇到过很多新手,喜欢把所有的代码都写在 main 方法里。千万别这样!面向对象的核心思想就是「分而治之」,把不同的功能封装到不同的类里。

3.3.2 继承

继承,说白了就是「儿子可以继承老子的东西」。比如,电动车是车的一种,它继承了车的所有属性和方法,同时还可以有自己的新特性。

// 父类
public class Vehicle {
    String brand;
    public void honk() {
        System.out.println("滴滴!");
    }
}

// 子类
public class ElectricCar extends Vehicle {
    int batteryLevel;
    
    public void charge() {
        System.out.println("正在充电...");
    }
}

// 使用
ElectricCar tesla = new ElectricCar();
tesla.brand = "特斯拉";
tesla.honk();    // 继承来的方法
tesla.charge();  // 自己的方法
🔑 关键点:Java只支持单继承,一个子类只能有一个父类。但可以通过接口实现多继承的效果,这个后面会讲。

3.3.3 多态

多态,就是「同一个行为,不同的表现形式」。比如,同样是「叫」这个动作,狗是汪汪,猫是喵喵。

// 父类
public class Animal {
    public void sound() {
        System.out.println("动物发出声音");
    }
}

// 子类
public class Dog extends Animal {
    @Override
    public void sound() {
        System.out.println("汪汪!");
    }
}

public class Cat extends Animal {
    @Override
    public void sound() {
        System.out.println("喵喵!");
    }
}

// 多态
public class Test {
    public static void main(String[] args) {
        Animal myAnimal = new Dog();
        myAnimal.sound();  // 输出:汪汪!
        
        myAnimal = new Cat();
        myAnimal.sound();  // 输出:喵喵!
    }
}

为什么会这样?因为 myAnimal 虽然是 Animal 类型的引用,但它实际指向的是 DogCat 的对象。这就是多态的魅力——写代码时面向父类编程,运行时却执行子类的方法。

3.4 集合框架

集合,就是用来存数据的容器。数组也能存数据,但数组长度固定,不够灵活。集合就灵活多了。

3.4.1 List

List是有序的、可重复的集合。最常用的是 ArrayListLinkedList

import java.util.ArrayList;
import java.util.List;

public class ListExample {
    public static void main(String[] args) {
        // 创建一个List
        List<String> names = new ArrayList<>();
        
        // 添加元素
        names.add("张三");
        names.add("李四");
        names.add("王五");
        
        // 遍历
        for (String name : names) {
            System.out.println(name);
        }
        
        // 获取指定位置的元素
        String second = names.get(1);  // 李四
    }
}
💡 经验之谈:在项目中,我习惯用 ArrayList 作为默认选择。因为它基于数组实现,随机访问速度快。只有在频繁插入和删除的场景下,我才会考虑 LinkedList

3.4.2 Map

Map是键值对集合,就像一本字典,通过「键」来查找「值」。最常用的是 HashMap

import java.util.HashMap;
import java.util.Map;

public class MapExample {
    public static void main(String[] args) {
        // 创建一个Map
        Map<String, Integer> scores = new HashMap<>();
        
        // 添加键值对
        scores.put("张三", 90);
        scores.put("李四", 85);
        scores.put("王五", 95);
        
        // 获取值
        int zhangsanScore = scores.get("张三");  // 90
        
        // 遍历
        for (Map.Entry<String, Integer> entry : scores.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}

我曾经在做一个用户画像系统时,需要根据用户ID快速查找其标签。用 HashMap 存储,查询速度是毫秒级的。如果用List遍历查找,数据量一大,性能就崩了。

⚠️ 注意HashMap 的键不能重复。如果你 put 了相同的键,后面的值会覆盖前面的值。另外,HashMap 不是线程安全的,多线程环境下要用 ConcurrentHashMap

本章小结

这一章我们覆盖了Java最基础、最核心的内容。环境搭建、基本语法、面向对象、集合框架,这些都是你后续学习大数据框架(比如Hadoop、Spark)的基石。别指望一次全记住,多写代码,多踩坑,自然就熟了。

下一章,我们会继续深入Java基础,讲异常处理、IO流、多线程这些更进阶的内容。准备好了吗?咱们下章见。