java核心基础 第二章 怎么写java程序

内容概述

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 组合使用

修饰符可以组合使用,但需要遵循一定规则。例如:

  • 不能同时声明为 finalabstract,因为 final 表示不可继承,而 abstract 需要子类继承。
  • 方法 不能同时声明为 abstractstatic,因为静态方法不能被重写,而抽象方法要求子类实现。

示例:

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 truefalse boolean b = true;
  • 说明
    • boolean 只能表示逻辑值 truefalse
    • 常用于条件判断和循环控制。

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. 选择控制

选择控制用于根据条件决定程序的执行路径。主要有三种结构:ifif-elseswitch

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. 循环控制

循环控制用于重复执行代码块。主要有三种结构:forwhiledo-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. 跳转控制

用于在循环或选择控制中调整程序执行的流程,主要有三种:breakcontinuereturn

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 小节

  1. 选择控制ifswitch)用于条件判断。
  2. 循环控制forwhiledo-while)用于重复执行代码。
  3. 跳转控制breakcontinuereturn)用于调整流程。
  4. 嵌套结构使程序逻辑更加复杂,但也要注意简洁性和可读性。

总结

回到本章开头我们说的,java程序员写程序就干三件事,定义类、在类里面定义数据、在类里面定义方法。我们使用class关键字来定义类,使用诸如int、byte、double等去定义数据,而方法本质上就是给一个代码块定义一个名字,并且给这个代码块指定一个返回类型,也就是这个代码块的执行结果,如果没有执行结果就给他指定一个void结果,表示无返回值。

相关推荐
半夜下雨几秒前
每日十题八股-2024年12月11日
java
CVer儿2 分钟前
条件编译->enable_if和 if constexpr使用区别
java·开发语言·c++
ThetaarSofVenice2 分钟前
【Java从入门到放弃 之 HashMap 和 HashSet】
java·哈希算法·散列表
Easy_Company4 分钟前
关于Redis哨兵机制实验操作步骤
java·大数据·数据库·redis·缓存
Nijika...6 分钟前
RabbitMQ监听器在并发情况下的基本使用方法
java·spring·rabbitmq
菜鸡且互啄698 分钟前
派单调度啊
java
TsengOnce9 分钟前
Docker 安装 Jenkins:2.346.3
java·docker·jenkins
爱lv行10 分钟前
使用 rbenv 切换 Ruby 版本
开发语言·前端·ruby
怪咖码农12 分钟前
rabbitMq的rabbitmqctl status报错
java·spring boot·分布式·spring cloud·rabbitmq
小屁孩大帅-杨一凡17 分钟前
python实现将jar解压各个文件
java·开发语言·python·pycharm·jar