一、使用Java能编写的程序
企业级后端应用
Java 在企业级开发中占据重要地位,常被用于构建大型服务器端应用,如电商平台、银行交易系统、CRM(客户关系管理)系统等。这类应用通常需要处理高并发、复杂业务逻辑和海量数据,Java 凭借稳定的性能、丰富的企业级框架(如 Spring、Spring Boot、MyBatis 等)以及强大的多线程支持,成为理想选择。例如,很多电商平台的订单处理、支付结算等核心后端服务都是用 Java 开发的。
Android 移动应用
早期 Android 应用开发的官方首选语言就是 Java,虽然现在 Kotlin 逐渐普及,但 Java 仍是 Android 开发的重要语言。开发者可以通过 Android SDK(软件开发工具包)使用 Java 编写各类手机应用,包括社交软件、工具类 APP、游戏等。例如,一些经典的 Android 应用(如早期版本的微信、支付宝部分功能模块)的核心逻辑就是用 Java 实现的。
二、Java性质:“一次编译、处处运行”
Java 的跨平台能力源于其独特的 "中间代码" 机制:
编译过程:Java 源代码(.java文件)通过编译器(javac)编译后,生成的不是针对特定操作系统的机器码,而是一种与平台无关的 "字节码"(.class文件)。
运行过程:字节码不能直接被操作系统执行,需要通过Java 虚拟机(JVM,Java Virtual Machine) 解释或编译为当前平台的机器码后再运行。
跨平台关键:不同操作系统(如 Windows、Linux、macOS)会提供对应的 JVM 实现,只要目标平台安装了合适的 JVM,同一个字节码文件就能在该平台上运行,无需重新编译
为使编译好的程序能运行,需先在操作系统安装什么?
为了让编译好的 Java 程序(字节码)能运行,需要在操作系统上安装JRE(Java Runtime Environment,Java 运行时环境)。
JRE 是运行 Java 程序的最小环境,它包含了:
JVM(Java 虚拟机):核心组件,负责执行字节码;
核心类库:Java 程序运行所需的基础类(如 java.lang 包中的类);
其他支持文件。
(注:如果需要开发 Java 程序,则需要安装 JDK(Java Development Kit),JDK 包含 JRE 以及编译器、调试工具等开发组件。)
对比c版本的HelloWorld代码
c语言
#include <stdio.h> // 引入标准输入输出库
// 程序入口:main函数(C语言没有类,直接以函数作为程序起点)
int main() {printf("Hello, World!\n"); // 输出语句,依赖stdio.h中的函数return 0; // 表示程序正常结束(C语言main函数通常返回int类型)
}
java
// 定义类(Java是纯面向对象语言,所有代码必须放在类中)
// 类名必须与文件名一致(如HelloWorld.java)
public class HelloWorld {// 程序入口:main方法(静态方法,固定语法)public static void main(String[] args) {// 输出语句,调用System类的out对象的println方法System.out.println("Hello, World!");}
}
比较两个字符串内容是否相同(用equals比较)
代码
String s1 = new String("hello");
String s2 = new String("hello");// s1和s2是不同对象(内存地址不同),==返回false
System.out.println(s1 == s2); // false// equals()比较内容,返回true
System.out.println(s1.equals(s2)); // true
为什么基本数据类型可以直接用==
基本数据类型(如 Java 的int、double,C 的int、float等)的变量在内存中直接存储实际值,而非地址。
这个运算符的作用是比较变量存储的 “实际值”,因此对基本类型直接使用==即可判断值是否相等。
int a = 10;
int b = 10;
System.out.println(a == b); // true(a和b存储的值都是10)
为什么引用数据类型不能直接用==
引用数据类型(如 Java 的String、自定义对象,C 的指针、结构体指针等)的变量在内存中存储的是对象的 “内存地址”(即引用),而非对象本身的内容。
==运算符比较的是变量存储的 “地址”,即判断两个变量是否指向同一块内存(同一个对象),而非对象的内容是否相同。
String
String=null(代码不能运行)
String x = null;
int length = x.length();
System.out.println("x.length = "+length +", content = "+x.trim());
原因
不能运行成功,运行时会抛出NullPointerException(空指针异常)。
原因是:代码中String x = null;表示x没有指向任何实际的字符串对象(null是 “空引用”,不代表任何对象)。而x.length()和x.trim()都是调用字符串对象的方法,只有实际存在的对象才能调用方法,对null调用任何方法都会触发空指针异常。
如何获得String的trim()方法的说明
查阅 Java 官方 API 文档
访问 Oracle 的 Java SE 文档(如Java 8 String 文档),搜索String类的trim()方法,文档中会说明其功能:
去除字符串前后的空白字符(包括空格、制表符\t、换行符\n等),返回一个新的字符串;如果原字符串为空或前后没有空白字符,则返回原字符串本身。
使用 IDE 的内置提示
在开发工具(如 IntelliJ IDEA、Eclipse)中,将光标放在trim()方法上,按快捷键(IDEA 用Ctrl+Q,Eclipse 用F2),会显示方法的注释说明。
查看 Java 源码注释
查看String类的源码,trim()方法的注释会直接描述其功能、参数、返回值及注意事项。
总结:这段代码因对null引用调用方法而无法运行,trim()方法的作用是去除字符串前后的空白字符,可通过官方文档或开发工具查询详细说明。
Java 的自动装箱和自动拆箱技术
Integer x = Integer.valueOf("10");
Integer y = x + 1;
int z = x + y;
问题
x是Integer类型,1是int类型,为什么他们可以相加,使用了什么技术?z是int,x与y是Integer类型,却可以直接将x + y 赋给z,使用了什么技术?
解答
- 为什么Integer x可以和int 1相加?(y = x + 1的原理)
x是Integer类型(包装类),1是int类型(基本数据类型)。两者能够直接相加,依赖于自动拆箱(Unboxing) 技术:
自动拆箱指:包装类对象会被自动转换为对应的基本数据类型。
在执行x + 1时,Java 会自动将Integer类型的x拆箱为int类型(相当于执行x.intValue()),之后才能与int类型的1进行加法运算,得到一个int类型的结果(11)。
而y是Integer类型,因此运算结果(int类型)会被自动装箱(Autoboxing) 为Integer类型(相当于执行Integer.valueOf(11)),最终赋值给y。 - 为什么x + y(Integer类型相加)可以直接赋给int z?
x和y都是Integer类型,它们的和可以直接赋给int类型的z,同样依赖于自动拆箱技术:
执行x + y时,两个Integer对象会先被自动拆箱为int类型(分别相当于x.intValue()和y.intValue()),然后进行加法运算,得到一个int类型的结果(10 + 11 = 21)。
由于z是int类型(基本数据类型),int类型的运算结果可以直接赋值给z,无需额外转换。
总结
Integer与int相加:通过自动拆箱将Integer转换为int,再进行运算;若结果赋值给Integer变量,还会触发自动装箱。
Integer相加后赋给int:通过自动拆箱将两个Integer转换为int,运算结果为int,可直接赋给int变量。
自动装箱 / 拆箱本质是 Java 编译器在编译阶段自动插入的转换代码(如Integer.valueOf()或intValue()),简化了开发者手动转换的操作。