发布于2026-07-10 阅读(0)
扫一扫,手机访问
先来梳理一下入门Ja va必须要掌握的核心知识框架。
1. 基本常识
软件,说到底就是按照特定顺序组织起来的一组计算机数据和指令。常见的系统软件比如Linux,应用软件比如Google Chrome。软件存在的意义,就是让人和计算机之间能更好地“对话”。这种交互方式主要有两种:图形化界面和命令行。
说到命令行,DOS命令是绕不开的基本功:
需要注意,在DOS里删除文件夹,前提是文件夹里必须是空的。
实际上,玩转DOS命令行之后你会发现,操作计算机就像跟它说话——你告诉它做什么,它就做什么。当然,前提是你说的话它得能听懂,这就是计算机语言的核心意义。
2. Ja va的跨平台性
跨平台性,简单说就是:用Ja va写的应用程序,在Windows上能跑,在Linux上也能跑。原理其实不复杂——只要在需要运行Ja va程序的操作系统上,提前装好一个Ja va虚拟机(JVM)就行了。JVM负责在对应的系统里把Ja va程序跑起来,至于底层是啥系统,它全包了。
3. Ja va编程环境搭建
两个关键概念得先分清:
一句话总结:你用JDK写程序,交给JRE去跑。
还有个小细节:JDK里自带JRE和开发工具,而JRE里才包含虚拟机。当你敲下运行命令ja va时,系统会自动去找JRE里的虚拟机,让它去执行对应的字节码文件(.class)。
4. 环境变量
在DOS下敲命令时,操作系统会先在当前目录找有没有这个命令。找不到?它就会去环境变量里找那些配置好的路径,看里面有没有。所以,配置环境变量的目的很单纯——让Ja va开发工具用起来更方便。
配置时注意一点:文件必须是可执行文件。
常用配置如下:
这里有几个要点值得注意:
set PATH=C:\Ja va\jdk1.7.0_17\bin;5. 第一个Ja va程序
主函数的作用是确保这个类能独立运行。当你敲下ja va命令,系统会去调用JVM,JVM再去调用Windows底层,然后运行你指定的类。而在运行之前,JVM会先检查这个类里有没有public static void main(String[] args)——这就是程序的入口,没有它,一切免谈。

1. 基础语法
(1)关键字
关键字,就是计算机语言里被赋予了特殊含义的单词。Ja va里的关键字有个共同特点:全是英文小写。
(2)标识符
标识符就是你在程序里起的各种名字。成分包括:0-9、A-Z、a-z、下划线_、美元符号$。注意两条铁律:数字不能开头,不能和关键字重名。
(3)注释
注释有三种:
注释既可以用来解释说明代码,也可以用来临时屏蔽代码做调试。不过有一个坑要记住:多行注释里不能再嵌套多行注释。
(4)Ja va关键字一览
数据类型:class、interface、byte、short、int、long、float、double、char、boolean、void
数据值:true、false、null
流程控制:if、else、switch、case、default、while、do、for、break、continue、return
访问权限:private、protected、public
类/函数/变量修饰:abstract、final、static、synchronized
类关系:extends、implements
实例相关:new、this、super、instanceof
异常处理:try、catch、finally、throw、throws
包操作:package、import
其他:native、strictfp、transient、volatile、assert
(5)Ja va名称规范
2. 进制
任何数据在计算机底层都是以二进制形式存在的。二进制说到底就是开关的演变,但一连串的0和1实在不方便阅读。于是人们想到把三位二进制缩成一位表示——三位最大是7,超过就进位,这就是八进制。后来又觉得不够,干脆用四位二进制表示一位,这就是十六进制。
计算机里,8位二进制数组成一个最小的存储单位——字节。
为了把文字也塞进计算机,人们用0和1的不同排列来对应A、B、C……这就形成了编码表。最基础的是ASCII表,美国人用的。中文词太多,对应的编码表自然也更复杂。
负数在二进制里怎么表示?举个例子:6在32位二进制里是00000000 00000000 00000000 00000110。先取反得11111111 11111111 11111111 11111001,再加1,得到11111111 11111111 11111111 11111010,这就是-6。负数的最高位总是1,这个特征很明显。
1. 变量的概念
变量就是内存里的一块存储区域,有自己的名字(变量名)和类型(数据类型)。这块区域里的数据可以在同一类型范围内不断变化。
2. 为什么要定义变量
说白了,就是为了反复存放同一类型的常量数据,并且能重复使用。
3. 使用变量要注意的两件事
4. 什么时候定义变量
数据不确定、需要存储的时候,就定义一个变量。本质上,程序里要用一些内存单元来暂存数据。为了方便访问,我们用标识符(也就是变量名)给这些内存单元取个名字,而不是记它那一长串唯一地址。命名同时还要指定数据类型,这样才能存入和读取正确类型的数据。因为程序运行时这些数据会变化(常量除外),所以叫变量。
这里顺便扯一句C语言的类比:类型本身(比如int)是不占内存的,但用它们定义的变量和数组是占内存的。结构体类型也不占内存,它只是告诉编译器:将来定义这种类型的对象由哪些成员构成、各占多少字节。一旦定义变量,内存就分配好了,而且是连续的。
经典示例:类型转换
short s = 3;
s = s + 2; // 编译失败!s被自动转成int,运算结果也是int,没法赋值给short
s += 2; // 编译通过!+=运算符在赋值时自动完成了强制类型转换
位运算示例:
60 >> 4 = 3
// 00000000 00000000 00000000 00111100 >> 4 = 00000000 00000000 00000000 00000011
注意一个规律:左移相当于乘以2的移动位数次幂,右移相当于除以2的移动位数次幂。
1. switch语句的特点
2. 循环语句
需要多次执行某些语句时,就用循环。另外要留意变量的作用域:如果把增量定义在for语句里,这个变量只在for循环内有效,循环结束后它就在内存里被释放了。这一点其实很实用——如果循环结束后还要用到这个变量,就得用while循环;否则,用for更省内存。
for与while的对比:
for(int i = 0; i < 3; i++) {
System.out.println("i=" + i);
}
// System.out.println("i=" + i); // 编译出错,找不到符号i
int j = 0;
while(j < 3) {
System.out.println("j=" + j);
j++;
}
System.out.println("j=" + j); // 编译正确,输出j=3
嵌套循环示例:
for(int i = 1; i <= 5; i++) { // 控制行
for(int j = 1; j <= i; j++) { // 控制列
System.out.print(j);
}
System.out.println();
}
// 运行结果:
// 1
// 12
// 123
// 1234
// 12345
函数是定义在类中的、具有特定功能的一段独立小程序。它的基本格式如下:
修饰符 返回值类型 函数名(参数类型 形式参数1, 参数类型 形式参数2, ...) {
执行语句;
return 返回值;
}
定义函数的思路:
有两个原则必须记住:函数里只能调用函数,不能在函数内部再定义函数;函数的结果应该返回给调用者,让调用者自己决定怎么处理。主函数的作用,就是调用其他函数来做测试。
错误案例:
public static void getAdd(int a, int b) {
System.out.println((a+b)); // 问题很大!打印操作应该是调用者的事
return;
}
另一个常见错误:
class Demo {
// 错误:找不到程序入口
for(int i = 0; i < 5; i++) {
System.out.println(i);
}
}
函数重载
重载指的是在同一个类中,允许存在多个同名函数,只要参数个数或参数类型不同即可。重载和返回值类型无关,只看参数列表。它的好处是方便阅读,优化设计。什么时候用?功能相同,但参与运算的未知内容不同时,就用同一个函数名来统一语义,靠参数列表来区分。
1. 数组的概念
数组就是同一种类型数据的集合,本质上就是一个容器。好处是:数组会自动给每个元素从0开始编号,方便操作。
2. C语言中的数组(拓展理解)
C语言里,数组定义后,数组和它的每个元素在内存中都有明确的地址。数组起始地址就是数组的指针,可以用数组名或取地址符来给指针变量赋值——数组名本身代表数组首地址,并且永远是常量。
3. Ja va内存结构
Ja va程序运行时,内存被划分为不同区域,每个区域有特定的数据处理和管理方式:
4. 数组常见操作
(1)遍历
public static void print(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.println("arr[" + i + "]=" + arr[i]);
}
}
(2)最值
public static int max(int[] arr) {
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
(3)排序
选择排序:
public static void sort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
for (int j = i + 1; j < arr.length; j++) {
if (arr[i] > arr[j]) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
}
冒泡排序:
public static void sort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
(4)查找
折半查找:效率很高,但前提是数组必须有序。
public static int search(int[] arr, int key) {
int min = 0;
int max = arr.length - 1;
int mid;
while (min <= max) {
mid = (min + max) / 2;
if (key > arr[mid]) {
min = mid + 1;
} else if (key < arr[mid]) {
max = mid - 1;
} else {
return mid;
}
}
return -1;
}
向有序数组插入元素(保持有序):
public static int insert(int[] arr, int key) {
int min = 0;
int max = arr.length - 1;
int mid;
while (min <= max) {
mid = (min + max) / 2;
if (key > arr[mid]) {
min = mid + 1;
} else if (key < arr[mid]) {
max = mid - 1;
} else {
return mid;
}
}
return min;
}
5. 进制转换
十进制 → 十六进制:
public static void toHex(int num) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < (32 / 4); i++) {
int temp = num & 15;
if (temp > 9) {
sb.append((char) (temp - 10 + 'A'));
} else {
sb.append(temp);
}
num = num >>> 4;
}
System.out.println(sb.reverse());
}
十进制 → 任意进制:
public static void toBinary(int num) {
transform(num, 1, 1);
}
public static void toOctal(int num) {
transform(num, 7, 3);
}
public static void toHex(int num) {
transform(num, 15, 4);
}
public static void transform(int num, int base, int offset) {
char[] chs = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8',
'9', 'A', 'B', 'C', 'D', 'E', 'F' };
char[] arr = new char[32];
int pos = arr.length - 1;
while (num != 0) {
int temp = num & base;
arr[pos] = chs[temp];
pos--;
num = num >>> offset;
}
for (int i = pos + 1; i < arr.length; i++) {
System.out.print(arr[i]);
}
}
6. 二维数组
int[][] arr = new int[3][];
arr[0] = new int[3];
arr[1] = new int[2];
arr[2] = new int[1];
System.out.println(arr.length); // 二维数组的长度
System.out.println(arr[0].length); // 第一个一维数组的长度
System.out.println(arr[1].length); // 第二个一维数组的长度
System.out.println(arr[2].length); // 第三个一维数组的长度
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.println(arr[i][j]);
}
}
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8