Java:从一颗橡树到移动帝国

1991年冬天,硅谷的一家办公室里,几个年轻人正围着一台笨重的电脑发愁。他们叫Green项目,是Sun Microsystems内部一个不起眼的小组。他们的目标是——让家用电器也能聪明起来。冰箱能推荐食谱吗?烤箱能根据你的饮食计划自动调节温度吗?听起来像是科幻,但在90年代初,这就是”智能设备”的梦想。

橡树的种子:从TV到”Oak”

这个小组的带头人叫James Gosling,后来人们称他为”Java之父”。起初,他们用的语言叫Oak——美国常见的橡树。为什么叫这个?因为Gosling办公室窗外就有一棵橡树。

// 这是1995年之前,Oak语言的早期代码雏形
// 看起来和现在的Java几乎一样,对吗?
class SetTopBox {
    void watchTV() {
        if (weather.isRainy()) {
            turnOnTV();
        } else {
            goOutside();
        }
    }
}

但很快,他们就发现了一个尴尬的问题:Oak这个名字已经被一家做咖啡的公司的名字占了——Oak Coffee。这就像是有人给自家孩子起名”可口可乐”,你懂的。他们不得不再找一个名字。

1995:Java这个名字的诞生

1995年5月23日,Java在Sun的Java Technology Conference上首次亮相。这个名字的来源其实挺有意思——据说是在一家咖啡店,团队人员喝着爪哇岛产的咖啡时想到的。爪哇(Java)是印度尼西亚的一个岛屿,以咖啡闻名。

// 这是Java 1.0时代的经典代码
// 运行一次,到处运行(Write Once, Run Anywhere)
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
        // 就这一行,改变了整个IT行业
    }
}

当时的Java有一个口号:“一次编写,到处运行”。在1995年,这句话就像魔法一样。想象一下,你写了一个程序,可以在Windows上跑,也可以在不换代码的情况下在Unix上跑。在那个年代,这几乎是不可想象的。

跨平台的秘密:JVM是怎么做到的

Java之所以能跨平台,靠的不是魔法,而是一个叫JVM(Java虚拟机)的东西。你可以把它想象成一个翻译官:

Java源代码 (.java)
      ↓  编译
字节码 (.class)
      ↓  交给每个平台的JVM
Windows JVM → Windows程序 ✓
Linux JVM   → Linux程序 ✓
Mac JVM     → Mac程序 ✓

同样的字节码,不同的JVM去解释执行。这就是为什么Java能在90年代末和21世纪初席卷企业级应用市场。银行、保险公司、大型企业的系统,几乎都在用Java。

企业界的王者时代

2000年前后,Java在企业级应用市场上几乎无敌手。EJB(Enterprise JavaBeans)、Spring框架、Java EE……这些技术构建了一个庞大的生态系统。

说实话,那时候学习Java就像在镀金。简历上写着”精通Java”,找工作基本畅通无阻。很多程序员为了进入这个领域,会花几个月甚至一年时间去学习。

// 这是一个典型的Java Web应用中的代码
// 看起来繁琐,但在那个年代,这就是"高性能"的代名词
public class UserManager extends HttpServlet {
    
    private UserService userService;
    private DatabaseConnectionPool connectionPool;
    
    // 每一个对象都要手动管理,每一个异常都要捕获
    // 这就是Java企业开发的真实写照
    protected void doGet(HttpServletRequest request, 
                         HttpServletResponse response) 
                         throws ServletException, IOException {
        
        String userId = request.getParameter("userId");
        
        try {
            User user = userService.findById(userId);
            
            response.setContentType("application/json");
            response.getWriter().write(
                new ObjectMapper()
                    .writeValueAsString(user)
            );
            
        } catch (Exception e) {
            logger.error("Error fetching user", e);
            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        }
    }
}

这段代码读起来确实有点冗长,但如果你回到2005年,这几乎就是标准写法。后来的Spring Boot等框架,才慢慢把这些模板代码给简化掉了。

Android:Java的”第二春”

2008年,Google发布了Android 1.0。当时很多人惊讶地发现,Android应用是用Java写的。

// 这是Android应用的典型代码
// 和Java SE的语法几乎一模一样
public class MainActivity extends AppCompatActivity {
    
    private TextView textView;
    private Button button;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        textView = findViewById(R.id.text_view);
        button = findViewById(R.id.button);
        
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                textView.setText("你好,Android世界!");
            }
        });
    }
}

很多人可能不知道,Android最初并不是用Java的。Google的创始人Larry Page和Sergey Brin最初考虑过用.NET平台,但微软狮子大开口,要价太高。于是Google转向了Java,并和Sun公司达成协议,获得了Java技术的授权。

这里有一个细节值得注意:Android并不是直接使用标准的Java虚拟机(JVM)。它用的是ART(Android Runtime)和之前的Dalvik虚拟机。这是因为标准的JVM对于移动设备来说太重了——内存占用大、启动慢。Dalvik和ART是专门为移动设备优化的虚拟机。

传统JVM:  Java字节码 → JVM解释执行 → 硬件
Android:  Java字节码 → Dalvik/ART → 硬件(针对移动优化)

所以严格来说,Android并不是”运行Java程序”,而是运行了一种和Java字节码兼容的格式(.dex文件)。但这不影响Java程序员直接上手Android开发。

Java在海外的尴尬:Android的”背叛”

2014年,Google宣布将Android开发从Java转向Kotlin。这被很多人解读为Google和Oracle之间Java专利诉讼的一种妥协。2010年,Oracle收购了Sun Microsystems,随即起诉Google侵犯Java专利,这场官司持续了十年,直到2021年Google胜诉。

// Kotlin的代码看起来更简洁
// 但本质上是和Java字节码兼容的
class MainActivity : AppCompatActivity() {
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        button.setOnClickListener {
            textView.text = "你好,Android世界!"
        }
    }
}

Kotlin现在确实是Android开发的首选语言,但Java依然在Android生态中占据重要地位。很多老项目用Java写的,新的项目也开始用Kotlin,但底层依然和Java无缝互操作。

Java的今天:从桌面到云端,无处不在

如果你在2024年或2025年想进入编程行业,Java依然是绕不开的一门语言。原因很简单:

后端服务:全球大部分的大型互联网公司,其后端服务都用Java编写。Spring Boot、Spring Cloud这些框架让Java后端开发变得相对简单。

// 现代Spring Boot的简洁写法
@RestController
@RequestMapping("/api/users")
public class UserController {
    
    @Autowired
    private UserService userService;
    
    @GetMapping("/{id}")
    public ResponseEntity<User> getUser(@PathVariable String id) {
        User user = userService.findById(id);
        return ResponseEntity.ok(user);
    }
    
    // 比2005年的写法简洁多了,对吧?
}

大数据:Hadoop、Spark、Kafka这些大数据基础设施,基本都是Java或Scala(运行在JVM上)写的。

云计算:AWS、Azure、Google Cloud的很多底层服务,也都是Java。

嵌入式:虽然Android用Kotlin更流行,但很多物联网设备、智能家居设备依然用Java开发。

Java为什么能活这么久?

说实话,Java能活三十多年,不是没有原因的:

  1. 生态成熟:几乎所有你能想到的功能,都有现成的Java库可用。Maven/Gradle的依赖管理让集成第三方库变得简单。

  2. 跨平台:JVM的存在让Java程序可以在任何有JVM的机器上运行,这在分布式系统中非常重要。

  3. 性能不错:JIT(即时编译)技术让Java的运行效率接近C++,同时保持了跨平台的便利性。

  4. 稳定性:Java的向后兼容性做得非常好。2010年写的代码,在今天大概率还能运行。

  5. 社区庞大:Stack Overflow上Java相关的问题最多,GitHub上Java项目最多,培训资料最多。

// 这是Java的一个特性:类型安全
// 编译时就能发现错误,减少运行时崩溃
List<String> names = new ArrayList<>();
names.add("张三");
// names.add(123);  // 编译错误!类型不匹配

// 这种"严格"在大型项目中是好事
// 它能避免很多运行时崩溃

给想学Java的人一点建议

如果你是想了解Java历史的,那这篇文章已经足够了。但如果你是打算学习Java的,这里有几个小建议:

  • 不要只学语法:语法只是一部分,框架、设计模式、性能优化才是核心。
  • 动手写代码:看一百篇文章不如写一百行代码。
  • 理解JVM:知道JVM是怎么工作的,你才能写出高性能的Java程序。
  • 关注现代Java:Java 8的Lambda、Java 11的模块化、Java 17的Records……现代Java已经比十年前优雅多了。
// Java 8引入的Lambda表达式
// 让代码简洁了很多
List<String> names = Arrays.asList("张三", "李四", "王五");

// 旧写法
for (String name : names) {
    System.out.println(name);
}

// 新写法
names.forEach(name -> System.out.println(name));

// 或者更简洁
names.forEach(System.out::println);

结语:Java的未来

从1991年的Green项目,到1995年的Java发布,再到2008年的Android崛起,Java走过了一条不平凡的路。它曾经是跨平台的王者,现在是移动开发的基石,未来依然是企业级开发的主力。

有人说Java老了,有人说Java要死了。但现实是,Java依然在进化,依然在更新,依然在无数系统中运行。或许这就是Java最了不起的地方——它不追求最炫的技术,但它追求稳定、可靠、实用。

在这个技术更新换代比翻书还快的时代,能活三十年的编程语言,本身就是一个奇迹。