【Java】深入理解Java语言的重要概念

一、Java语言及其特性

1.1 Java语言是什么

Java是一门面向对象的编程语言,由Sun公司于1995年正式发布,其设计理念源于对C语言的改进,摒弃了多继承和指针等复杂概念,实现了功能强大与简单易用的结合。

作为静态面向对象编程语言的代表,秉承着 "Once write, Run anywhere(一次编译,到处运行)" 的理念,Java通过JVM(Java虚拟机)实现跨平台运行,具备分布式、健壮性、安全性、多线程等特性,支持桌面应用、Web应用和嵌入式系统开发。

TIOBE 编程语言社区排行榜是编程语言流行趋势的一个指标,每月更新,这份排行榜排名基于互联网上有经验的程序员、课程和第三方厂商的数量。排名使用著名的搜索引擎(诸如 Google、MSN、Yahoo!、Wikipedia、YouTube 以及 Baidu 等)进行计算。

Java语言在编程语言社区排行榜中一直位居前五,可见其重要性。

此外,Java语言可以在以下领域中使用:

  • 企业级系统

    比如大型复杂的企业级软件系统。Java语言所具有的安全机制以及跨平台性的优势,使其在分布式系统领域开发中有广泛应用,涉及到金融、电信、交通、电子商务、ERP系统等。

  • Web开发领域

    Java语言在设计初期,赶上了互联网发展的风口,当时就瞄准了互联网开发。凭借稳定的性能表现和较好的扩展性,Java语言一直是大型互联网平台的重要解决方案。

  • Android平台应用

    Android是一种智能手机操作系统,其中的应用程序大多是用Java语言编写的。Android的SDK大部分也是直接将Java SDK翻译过来的。因此具有Java基础,也可以快速上手Android开发。

  • 大数据平台开发

    大数据相关的各类框架,比如:Hadoop、spark、storm、flink等,以及各种中间件flume、kafka、sqoop等,这些框架以及工具等大多数是用Java语言开发的。随着大数据技术的落地应用,Java语言在大数据领域的应用前景也是比较广阔的。

1.2 Java语言的特性

  • 简单性

    Java语法比C++语法简洁不少,让开发者使用起来更加方便快捷。例如,Java不支持goto语句,代之以提供break和continue语句以及异常处理。Java还剔除了C++的操作符过载(overload)和多继承特征,并且不使用主文件,免去了预处理程序。因为Java没有结构,数组和串都是对象,所以不需要指针。

  • 平台无关性

    由于Java语言具有 "一次编译,到处运行" 特性,在Java编译器将源代码编译成字节码(bytecode)之后,该字节码可以在任意装有JVM(Java虚拟机)的平台上运行。

  • 面向对象

    在Java语言的世界中,一切皆是对象。正是因为面向对象编程(OOP)这个特性,使得Java代码更易于维护和重用,包括类(class)、对象(object)、继承(inheritance)、多态(polymorphism)、抽象(abstraction)和封装(encapsulation)。

  • 自动管理内存

    Java语言具有自己的垃圾回收机制,可以自动管理内存和回收不再使用的对象,从而减少内存泄漏和其他内存相关问题。这样一来,开发者不用手动地管理内存和不再使用的对象。

  • 分布式(微服务)

    Java语言专为网络应用设计,具备原生分布式特性。其丰富的API类库支持多层级网络连接:既可处理HTTP、FFTP等应用层TCP/IP协议,又通过Socket类实现可靠的流式网络通信,从而高效构建分布式客户端与服务器系统。同时,Java应用程序可通过URL透明访问网络对象,其便捷性等同于操作本地文件。

  • 健壮性

    Java语言通过以下操作提升健壮性:

    1.强类型检查(强制执行变量类型声明,减少运行时类型错误,提升代码可靠性)、2.垃圾回收(自动管理内存,防止内存泄漏和野指针问题,增强系统稳定性)、3.异常处理机制(提供结构化错误处理,确保在故障时系统仍能稳定恢复或优雅降级)、4.JVM平台无关性(字节码在Java虚拟机(JVM)上运行,确保跨平台一致性和安全性)。

  • 安全性

    Java的安全性建立于其多层次的防御机制:语言层面通过取消指针和自动垃圾回收防止内存越界与泄漏,运行时则依靠严格的字节码验证和沙箱隔离机制限制代码权限避免恶意操作;同时主流Java框架采用参数化查询有效防御SQL注入等漏洞,而灰度发布等部署策略确保生产环境的稳定安全。

  • 可移植性

    Java与C/C的一个关键区别是,其规范详尽定义了基本数据类型的大小和运算行为,不涉及任何依赖具体实现的模糊地带。例如,Java中的int类型始终为32位整数,而在C/C中,int的宽度(如16位或32位)通常由编译器厂商自由指定。这种数据类型的固定大小有效消除了代码跨平台移植的主要障碍。此外,Java环境本身具备优异的新硬件和操作系统移植能力:编译程序(如javac)采用Java语言编写,而运行系统(如JVM)则基于ANSIC实现。

  • 高性能

    Java是一种先编译后解释的语言,所以它不如全编译性语言快。但是有些情况下性能是很要紧的,为了支持这些情况,Java设计者制作了"及时"编译程序,它能在运行时把Java字节码翻译成特定CPU(中央处理器)的机器代码,也就是实现全编译了。Java字节码格式设计时考虑到这些"及时"编译程序的需要,所以生成机器代码的过程相当简单,它能产生相当好的代码。

  • 解释性

    Java编译程序生成字节码(非机器码),字节码平台中性,可通过Java虚拟机(JVM)在任意系统运行。开发中的链接阶段被简化为增量式加载新类,实现轻量高效开发,支持快速原型和迭代;运行时,JVM解释器动态将字节码翻译成本地CPU指令。

  • 多线程

    Java是多线程语言,支持并发执行。通过java.lang.Thread类管理线程操作,并利用synchronized关键字等同步机制确保方法线程安全,维护共享变量的一致性。

  • 动态性

    Java语言设计成适应于变化的环境,它是一个动态的语言。例如,Java中的类是根据需要载入的,甚至有些是通过网络获取的。

面试题:说一下Java的特点?


  • 平台无关性:Java具有"一次编译,到处运行"的特性,这使得Java经过编译的字节码可以在任何安装有JVM的平台上运行。
  • 面向对象:Java语言具有面向对象编程(OOP)这个特性,使得Java代码更易于维护和重用,包括类(class)、对象(object)、继承(inheritance)、多态(polymorphism)、抽象(abstraction)和封装(encapsulation)。
  • 自动管理内存:Java语言具有自己的垃圾回收机制,可以自动管理内存和回收不再使用的对象,从而减少内存泄漏和其他内存相关问题。

二、Java程序

2.1 Java编程环境

Java系统家庭大合照~

JDK(Java Development Kit)

JDK称为Java开发包或Java开发工具,是一个编写Java的程序开发环境,可以用于编写Java的Applet小程序和应用程序。

JDK是整个Java的核心,包括了Java运行环境(Java Runtime Environment),一些Java工具和Java的核心类库(Java API)。不论什么Java应用服务器实质都是内置了某个版本的JDK。主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了自己的JDK,例如,IBM公司开发的JDK,BEA公司的Jrocket,还有GNU组织开发的JDK。

JRE(Java Runtime Environment)

JRE包括了Java API类库中的Java SE API子集和Java虚拟机这两部分,是支持Java程序运行的标准环境。

JRE是个运行环境,JDK是个开发环境。因此写Java程序的时候需要JDK,而运行Java程序的时候就需要JRE。而JDK里面已经包含了JRE,因此只要安装了JDK,就可以编辑Java程序,也可以正常运行Java程序。但由于JDK包含了许多与运行无关的内容,占用的空间较大,因此运行普通的Java程序无须安装JDK,而只需要安装JRE即可。

JVM(Java Virtual Machine)

JVM是用于运行Java字节码的虚拟机,包括一套字节码指令集、一组程序寄存器、一个虚拟机栈、一个虚拟机堆、一个方法区和一个垃圾回收器。JVM运行在操作系统之上,不与硬件设备直接交互。

Java源文件在通过编译器之后被编译成相应的 .Class文件(字节码文件),.Class文件又被JVM中的解释器编译成机器码在不同的操作系统(Windows、Linux、Mac)上运行。每种操作系统的解释器都是不同的,但基于解释器实现的虚拟机是相同的,这也是Java能够跨平台的原因。在一个Java进程开始运行后,虚拟机就开始实例化了,有多个进程启动就会实例化多个虚拟机实例。进程退出或者关闭,则虚拟机实例消亡,在多个虚拟机实例之间不能共享数据。

面试题1:JVM和Java有什么区别?


  • Java是语言,JVM是平台,一个是写代码的工具,一个是运行代码的平台,两者分工不同但是相互配合。Java用于写代码,但是不能直接运行程序,得先通过编译器将源代码编译成字节码,再通过解释器将字节码翻译成机器语言才能执行程序。Java程序之所以能够实现跨平台,就是因为JVM能够在不同平台上将字节码翻译成对应平台的机器码,Java程序得以执行。
  • 再说说和JDK以及JRE的关系。JDK是Java开发工具包,包含了编译器、调试器、各种开发工具和JRE。JRE是Java运行环境,其中包含了Java核心类库和JVM。总的来说,JDK⊃JRE⊃JVMJDK \supset JRE \supset JVMJDK⊃JRE⊃JVM。
  • JVM不止能执行Java程序。由于JVM执行的是字节码,其他编译后生成的是字节码的编程语言也可以在JVM上运行。
    面试题2:Java为什么是跨平台的?

  • Java能够实现跨平台,主要依赖JVM。JVM是一个能够运行Java字节码的软件。简单来说,Java源代码经过编译之后生成的 .Class文件(字节码文件)必须经过JVM内部的解释器翻译成当前平台的机器码才能被运行。任何平台只要安装了JVM,就可以运行Java程序。
    面试题3:JDK、JRE和JVM之间的关系是什么?

  • JDK是Java开发工具包,是开发Java工具所需的工具集合,包含了编译器(javac)、调试器(jdb)、一系列类库(Java标准库和开发工具库)、JRE和JVM。JDK提供了开发、编译、调试和运行Java程序所需的所有工具和环境。
  • JRE是Java运行环境,是Java程序运行所需的最小环境,包含了Java核心类库和JVM,用于支持Java程序的执行,不包含开发工具只提供运行环境。
  • JVM是Java虚拟机,是Java程序得以运行的重要组成部分,负责将字节码通过解释器翻译成机器语言并执行程序,提供了内存管理、垃圾回收和安全性等功能,是Java程序能够跨平台的原因。
  • 总结三者的关系:JDK⊃JRE⊃JVMJDK \supset JRE \supset JVMJDK⊃JRE⊃JVM
    面试题4:为什么Java解释、编译都有?

  • Java源代码先被编译成字节码,JVM解释器需要逐行读取解释字节码并转换成本地机器指令执行,虽然这种方式牺牲了部分性能,但无需为多个平台编译多个版本,从根本上解决了跨平台兼容性问题
  • 为了提升性能,JVM引入了即时编译器(JIT Compiler),JVM在运行时监控代码执行频率,将频繁执行的"热点代码"(如循环体)动态编译成本地机器码。编译后的代码直接由CPU执行跳过解释步骤,大幅提升性能。
  • 因此,Java实际上是 "编译+解释+JIT" 的混合模式。
    面试题5:Java的优势和劣势分别是什么?

  • 优势跨平台是Java的一大优势,依靠JVM实现了 "一次编译,到处运行";面向对象应该也是一个优势,这个特性使得Java代码更加易维护和重用;强大的生态系统也是,比如Spring框架、Hibernate,各种库和工具,社区支持大,企业应用广泛;自动垃圾回收机制减少了内存泄漏的问题,对开发者友好;多线程设计使得并发编程方便很多;Java的安全模型如沙箱机制,适合网络环境;稳定性能够保证企业级应用长期使用,版本更新也比较注重向后兼容。
  • 劣势性能应该是一个劣势,虽然JVM优化了很多,但是相比于C++和Rust这种原生编译语言,还是有一定的开销,特别是启动时间,若在微服务环境下可能不如Go之类的快;语法较繁琐,比如样板代码多,有了lambda之后虽然简洁了些,但是相比Python还是有点繁琐;内存消耗较大,JVM本身就比较占内存,再加上IDE如IDEA就更占内存了,对于资源有限的环境不太友好 ; 面向对象过于严格有时候写较简单的程序反而比较麻烦,虽然Java8引入了函数式编程,但是不如其他语言自然;开发效率相比于Python这种动态语言需要更多的代码,编译过程也可能拖慢开发节奏。

2.2 第一个Java程序

main函数
java 复制代码
public class Main {
	public static void main(String[] args) {
		System.out.println("Hello World!");
	}
}

显然Java的main函数比其他编程语言要更麻烦一些,接下来将介绍它的涵义。

在Java的世界里,一切皆是对象。上面的代码中,有一个主类Main,它被public关键字所修饰(一个Java文件中只能有一个类被该关键字修饰,并且主类的名字必须和文件名相同)。

安装好JDK和IDE后,就可以运行了,以下是运行结果:

复制代码
Hello World!

2.3 注释

注释是为了让开发者读懂代码的,不管是给合作伙伴或是自己(隔一段时间后自己也会忘了的),都应该养成写上注释的习惯

Java语言的注释有以下三种:

复制代码
1. // 单行注释
2. /*
    多行注释
    */
3. /*
    * @Description  文档注释
    * @author  木井巳
    */

相关推荐
yangminlei2 小时前
MyBatis插件开发-实现SQL执行耗时监控
java·开发语言·tomcat
what丶k2 小时前
Java连接人大金仓数据库(KingbaseES)全指南:从环境搭建到实战优化
java·开发语言·数据库
JSON_L2 小时前
PHP 获取国内ip归属地
开发语言·php·fastadmin
杜子不疼.2 小时前
【Linux】基础IO(一):C 接口文件讲解
linux·c语言·开发语言·人工智能
沛沛老爹2 小时前
从Web到AI:多模态Agent Skills开发实战——JavaScript+Python全栈赋能视觉/语音能力
java·开发语言·javascript·人工智能·python·安全架构
0x532 小时前
JAVA|智能仿真并发项目-进程与线程
java·开发语言·jvm
xiaolyuh1232 小时前
Spring Boot 深度解析
java·spring boot·后端
黎雁·泠崖2 小时前
Java静态方法:用法+工具类设计+ArrayUtil实战
java·开发语言
CC.GG2 小时前
【C++】C++11(二)可变模板参数模板、新的类功能、包装器(function、bind)
开发语言·c++