内容概述
java程序员写程序就干三件事,定义类、在类里面定义数据、在类里面定义方法。本章的核心目标是探讨java语言的语法、程序结构、流程控制。本章与第三章面向对象有一些互相关联的穿插,当你遇到一些面向对象的概念的时候,如果不理解可以先放一放。等阅读完了第三章你就明白了。
前置阅读
本章需要提前简单了解的概念
1.类
什么是类?在本章里,你可以把类理解为包含数据和方法的载体,java程序的一切代码都在类里面书写,当然也仅在本章你可以这么理解,目的是为了让本章的内容能进展下去,关于类的正式定义,我们将在第三章深入探讨。
2.方法
方法是执行逻辑的载体,也可以理解为它包含了一批指令。方法必须要在类中定义。在本章中,我们对方法的了解到此也足够了。方法的正式讨论也将在第三章深入探讨。
3.数据
数据是被指令操作的,可以这样理解,我们写程序就是为了加工数据。
术语说明
1. 关键字
关键字本质上就是一个字符串,比如class、public、void、static等等都是关键字,他们被java语言的规范所定义,每个关键字都被赋予的特定的功能,我们在写程序时必须按照java语言对他们的定义去使用他们,并且这些关键字不能作为变量的名称、类的名称、方法的名称等任何可以被程序员自定义的内容出现。
2. 标识符
本质上它也是一个字符串,他的作用是在java程序中唯一标识某一个元素用的,就像我们每个人都有一个身份证号一样,一个类的名字、一个方法的名字都是一个标识符。
3. 位(bit)
是数据的不可分割的最小单位,所有的数据都是由众多的bit组成。一个bit只有两种状态,0和1。
4. 字节(byte)
也是数据的单位,8个bit为一个byte。
核心概念
1.语句
语句是程序执行的基本单位,表示一条完整的指令。Java 中的语句以分号 (;
) 结束,通常包括以下几类:
1.1表达式语句
由表达式组成并以分号结束的语句,执行某种操作。例如:
java
int x = 5; // 赋值语句
x++; // 自增语句
System.out.println(x); // 方法调用语句
1.2声明语句
用于声明变量或对象。
java
int num; // 声明变量
String message = "Hi"; // 声明并初始化
2.表达式
表达式是一个由变量、常量、运算符和方法调用组成的计算式,可以计算出一个值。表达式可以作为更复杂语句的一部分。常见的表达式如下:
2.1 常见表达式
算术表达式:进行数学运算。
java
a + b * c;
布尔表达式:产生一个布尔值。
java
x > 0
方法调用表达式:调用方法。
java
"Hello".length();
每个表达式都会有一个运算结果,这个运算结果可以赋值给一个变量,如下:
java
int num = a + b * c; //将表达式 a + b * c 的运算结果赋值给变量num
boolean isPositive = (x > 0); //将表达式 x > 0 的运算结果 赋值给变量 isPositive
int length = "Hello".length(); //将表达式 "Hello".length() 的运算结果 赋值给变量 length
2.2 表达式的作用
表达式可以作为语句的一部分或用于复杂逻辑中。例如:
java
if ((a + b) > c) { // 表达式 (a + b) > c
System.out.println("Valid");
}
3.运算符
运算符是用来对变量和值执行操作的符号,Java 支持以下几类运算符:
3.1算术运算符
用于数学运算:
+
(加),-
(减),*
(乘),/
(除),%
(取模)。
例子:
java
int sum = 10 + 5; // sum 为 15
int mod = 10 % 3; // mod 为 1
3.2 赋值运算符
用于给变量赋值:
=
(赋值),+=
,-=
,*=
,/=
,%=
等。
前面带数学运算符的赋值,表示的是与变量自己进行相应的数学运算,然后把运算结果赋值给自己。
例子:
java
int x = 10;
x += 5; // x 现在是 15
3.3 比较运算符
用于比较两个值,结果为布尔值:
==
(等于),!=
(不等于),>
(大于),<
(小于),>=
(大于等于),<=
(小于等于)。
例子:
java
boolean isEqual = (x == 10); // true
3.4 逻辑运算符
用于布尔逻辑运算:
&&
(逻辑与),||
(逻辑或),!
(逻辑非)。
例子:
java
boolean result = (x > 5) && (x < 20); // true
3.5 位运算符
用于二进制运算:
&
(按位与),|
(按位或),^
(按位异或),~
(按位取反)。
位移运算符:<<
(左移),>>
(右移),>>>
(无符号右移)。
例子:
java
int result = 5 & 3; // result 为 1(0101 & 0011 = 0001)
3.6 条件运算符
三目运算符:condition ? value1 : value2
。
java
int max = (a > b) ? a : b; // 如果 a > b,max 是 a,否则是 b
4.代码块
在 Java 中,代码块 是用一对大括号 {}
括起来的一段代码。
普通代码块是最基本的代码块,直接出现在方法或逻辑中,用于划分逻辑范围。它可以嵌套使用。
java
{
int x = 5;
System.out.println("Value of x: " + x);
}
5.包(package)
在java中包由两层意义。
第一个意义它是命名空间,什么是命名空间呢?举个例子,假设我在一个java程序中写了两个名为HelloWorld的类,这样是不行的,因为这产生了二意性问题,那怎么办呢?我可以给他们分别加上不同的前缀以表示他们是两个不同的类,比如com.a.HelloWorld,com.b.HelloWorld。前面的com.a和com.b就是所谓的命名空间。
第二个意义他是一个目录,目录的结构就是用 . 分命名空间组织的,比如com.b,那这个包的目录结构就是com/b。这个目录干什么用呢?是用来存放class文件用的,比如上面说的com.a.HelloWorld这个类的class文件必须存放在以classpath为根路径下的com/a这个目录下。
package 是java中的一个关键字,在一个java源文件的最上方书写,他的作用是声明这个源文件里定义的类的命名空间。如下:
java
package com.a;
public class HelloWorld{
public static void main(String[] args){
System.out.println("HelloWorld!");
}
}
它定义了HelloWorld这个类的命名空间是com.a
6.修饰符
在 Java 中,修饰符用于定义类、方法、变量或构造器的行为和访问权限。修饰符可以分为两大类:访问控制修饰符 和非访问控制修饰符。
6.1访问控制修饰符
这些修饰符用于控制类、方法或成员的访问范围。
修饰符 | 描述 |
---|---|
public |
表示可以从任何地方访问。 |
protected |
表示只能在同一个包中访问,或者通过继承在其他包中访问。 |
默认(无修饰符) | 表示只能在同一个包中访问,称为"包访问权限"或"默认访问权限"。 |
private |
表示只能在所属类内部访问。 |
使用示例:
java
public class Example {
public int publicVar = 1; // 任何地方都可访问
protected int protectedVar = 2; // 包内或子类可访问
int defaultVar = 3; // 同包可访问
private int privateVar = 4; // 仅类内部可访问
}
6.2 非访问控制修饰符
这些修饰符用于提供特定的属性或行为,如静态、抽象或同步等。
6.3 类的非访问控制修饰符
修饰符 | 描述 |
---|---|
final |
表示类不能被继承。 |
abstract |
表示类是抽象类,不能实例化,通常包含一个或多个抽象方法。 |
6.4 方法的非访问控制修饰符
修饰符 | 描述 |
---|---|
final |
方法不能被子类重写(override)。 |
abstract |
方法没有实现,必须由子类实现。 |
static |
方法属于类本身,而不是实例。可以通过类名直接调用。 |
synchronized |
方法只能被一个线程同时访问,用于线程同步。 |
native |
方法是本地方法,用其他语言(如 C 或 C++)实现。 |
6.5 变量的非访问控制修饰符
修饰符 | 描述 |
---|---|
final |
变量是常量,值初始化后不可更改。 |
static |
变量属于类本身,而不是实例。 |
transient |
变量在序列化时会被忽略,不会保存到序列化对象中。 |
volatile |
变量在多线程中是可见的,不会被线程缓存。 |
6.6 组合使用
修饰符可以组合使用,但需要遵循一定规则。例如:
- 类 不能同时声明为
final
和abstract
,因为final
表示不可继承,而abstract
需要子类继承。 - 方法 不能同时声明为
abstract
和static
,因为静态方法不能被重写,而抽象方法要求子类实现。
示例:
java
public abstract class AbstractClass {
// 常量(static + final)
public static final String CONSTANT = "常量值";
// 抽象方法(子类必须实现)
public abstract void abstractMethod();
// 静态方法(类直接调用)
public static void staticMethod() {
System.out.println("静态方法");
}
}
final class FinalClass {
// 变量(final)
public final int finalVar = 10;
// 方法(不能被重写)
public final void finalMethod() {
System.out.println("最终方法");
}
}
7.数据类型
Java 中的基本数据类型分为四类,共八种。这些类型是 Java 的内置数据类型,能够高效地表示数值、字符和布尔值。以下是详细介绍:
7.1 整型
数据类型 | 大小(位) | 默认值 | 取值范围 | 示例 |
---|---|---|---|---|
byte |
8 | 0 | -128 到 127 | byte b = 100; |
short |
16 | 0 | -32,768 到 32,767 | short s = 3000; |
int |
32 | 0 | -2³¹ 到 2³¹-1 | int i = 100000; |
long |
64 | 0L | -2⁶³ 到 2⁶³-1 | long l = 10000000000L; |
7.2 浮点型
数据类型 | 大小(位) | 默认值 | 取值范围 | 示例 |
---|---|---|---|---|
float |
32 | 0.0f | ±1.4E-45 到 ±3.4028235E38 | float f = 3.14f; |
double |
64 | 0.0d | ±4.9E-324 到 ±1.7976931348623157E308 | double d = 3.14; |
7.3 字符类型
数据类型 | 大小(位) | 默认值 | 取值范围 | 示例 |
---|---|---|---|---|
char |
16 | '\u0000' | 0 到 65535(Unicode 编码范围) | char c = 'A'; |
- 说明 :
char
用于存储单个字符,使用单引号('
)包裹。- 也可以存储 Unicode 编码值,如
char c = '\u0041';
表示字符'A'
。
7.4 布尔类型
数据类型 | 大小 | 默认值 | 取值范围 | 示例 |
---|---|---|---|---|
boolean |
1 位 | false | true 或 false |
boolean b = true; |
- 说明 :
boolean
只能表示逻辑值true
和false
。- 常用于条件判断和循环控制。
7.5 数据类型默认值
在 Java 中,基本数据类型在未显式初始化时会有默认值(仅限成员变量)。以下是默认值汇总:
数据类型 | 默认值 |
---|---|
byte |
0 |
short |
0 |
int |
0 |
long |
0L |
float |
0.0f |
double |
0.0d |
char |
'\u0000' |
boolean |
false |
程序结构
在 Java 中,程序结构遵循严格的语法规则,通常包括以下几个层次的组成部分:包声明、导入语句、类声明、方法、语句和注释。以下是详细讲解:
1. 基本结构
java
package 包名; // 可选,声明程序所属包
import 包名.类名; // 可选,导入其他包中的类或所有类
// 主类
public class 类名 {
// 成员变量(属性)
数据类型 变量名;
// 构造方法
public 类名() {
// 初始化代码
}
// 主方法(程序入口)
public static void main(String[] args) {
// 代码逻辑
}
// 普通方法
返回类型 方法名(参数列表) {
// 方法逻辑
}
}
2. 主要组成部分详解
2.1 包声明 (package
)
- 用于组织类和接口,将它们分组到命名空间中。
- 每个 Java 文件只能有一个包声明,且必须是文件中的第一行代码(注释除外)。
- 示例:
java
package com.example.myapp;
2.2 导入语句 (import
)
- 用于导入其他包中的类或整个包。
import
语句位于包声明之后,类定义之前。- 示例:
java
import java.util.Scanner; // 导入单个类
import java.util.*; // 导入整个包
2.3 类声明
- Java 是一种面向对象语言,代码的基本组织单元是类。
- 类是属性(成员变量)和行为(方法)的集合。
- 示例
java
public class MyClass {
// 属性
int age;
// 方法
public void display() {
System.out.println("Hello, World!");
}
}
2.4 方法 (method
)
- 方法是执行操作的代码块。
main
方法是 Java 应用程序的入口,其他方法可以根据需要定义。- 方法定义包括返回类型、方法名、参数列表和方法体。
- 示例:
java
public int add(int a, int b) {
return a + b;
}
2.5 语句 (statements
)
- Java 程序由多个语句组成,这些语句在方法或代码块中执行。
- 示例:
java
int x = 10; // 声明和赋值语句
System.out.println(x); // 输出语句
2.6 注释
- Java 支持三种类型的注释:
- 单行注释 :
// 注释内容
- 多行注释 :
/* 注释内容 */
- 文档注释 :
/** 注释内容 */
,通常用于生成 API 文档。
- 单行注释 :
3. 程序入口 - 主方法
- 主方法是程序的起点,定义格式如下:
java
public static void main(String[] args) {
// 主程序代码
}
关键字解释:
public
:方法可以被任何地方访问。static
:方法属于类,而不是某个实例。void
:方法无返回值。String[] args
:参数是一个字符串数组,用于接收命令行参数。
流程控制
Java 中的流程控制用于控制程序的执行顺序,分为 顺序控制 、选择控制 和 循环控制 三种类型。以下是详细的讲解和示例:
1. 顺序控制
- 默认情况下,程序按从上到下的顺序逐行执行。
示例:
java
public class SequenceControl {
public static void main(String[] args) {
System.out.println("第一步");
System.out.println("第二步");
System.out.println("第三步");
}
}
2. 选择控制
选择控制用于根据条件决定程序的执行路径。主要有三种结构:if
、if-else
和 switch
。
2.1 if 语句
示例
java
int num = 10;
if (num > 5) {
System.out.println("数字大于5");
}
2.2 if-else 语句
java
int num = 3;
if (num % 2 == 0) {
System.out.println("偶数");
} else {
System.out.println("奇数");
}
2.3 if-else if-else 语句
java
int score = 85;
if (score >= 90) {
System.out.println("优秀");
} else if (score >= 60) {
System.out.println("及格");
} else {
System.out.println("不及格");
}
2.4 switch 语句
- 用于多分支选择,适合处理明确的值。
java
int day = 3;
switch (day) {
case 1:
System.out.println("星期一");
break;
case 2:
System.out.println("星期二");
break;
case 3:
System.out.println("星期三");
break;
default:
System.out.println("其他天");
break;
}
3. 循环控制
循环控制用于重复执行代码块。主要有三种结构:for
、while
和 do-while
。
3.1 for 循环
格式:
java
for (初始化; 条件; 更新) {
// 循环体
}
示例
java
for (int i = 1; i <= 5; i++) {
System.out.println("第" + i + "次循环");
}
while 循环
格式
java
while (条件) {
// 循环体
}
示例
java
int i = 1;
while (i <= 5) {
System.out.println("第" + i + "次循环");
i++;
}
3.2 do-while 循环
while与do-while的区别是,do-while 先执行循环体再进行条件检测,而while先进行条件检测再执行循环体。
- 格式:
java
do {
// 循环体
} while (条件);
示例
java
int i = 1;
do {
System.out.println("第" + i + "次循环");
i++;
} while (i <= 5);
4. 跳转控制
用于在循环或选择控制中调整程序执行的流程,主要有三种:break
、continue
和 return
。
4.1 break 语句
- 用于终止当前循环或
switch
语句。 - 示例:
java
for (int i = 1; i <= 5; i++) {
if (i == 3) {
break; // 跳出循环
}
System.out.println(i);
}
4.2 continue 语句
- 用于跳过当前循环的剩余部分,进入下一次循环。
- 示例:
java
for (int i = 1; i <= 5; i++) {
if (i == 3) {
continue; // 跳过本次循环
}
System.out.println(i);
}
4.3 return 语句
- 用于结束方法的执行,并返回值(如果有)。
- 示例:
java
public static int sum(int a, int b) {
return a + b; // 返回结果
}
4.4 嵌套控制
流程控制可以嵌套使用,允许在一个结构内包含另一个结构。
示例:
java
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 2; j++) {
System.out.println("i = " + i + ", j = " + j);
}
}
4.5 小节
- 选择控制 (
if
和switch
)用于条件判断。 - 循环控制 (
for
、while
和do-while
)用于重复执行代码。 - 跳转控制 (
break
、continue
和return
)用于调整流程。 - 嵌套结构使程序逻辑更加复杂,但也要注意简洁性和可读性。
总结
回到本章开头我们说的,java程序员写程序就干三件事,定义类、在类里面定义数据、在类里面定义方法。我们使用class关键字来定义类,使用诸如int、byte、double等去定义数据,而方法本质上就是给一个代码块定义一个名字,并且给这个代码块指定一个返回类型,也就是这个代码块的执行结果,如果没有执行结果就给他指定一个void结果,表示无返回值。