Java 编程入门(上)

语法基础 | 数据类型 | 流程控制

Posted by Paradise on March 28, 2021

教材链接:https://book.douban.com/subject/11534743/

示例代码:https://pan.baidu.com/s/1EQW8Ijyqvak0vxscaMfjtg | 提取码:k3q4

第一章 初识Java

Java特点:

跨平台 | 面向对象 | 分布性 | 解释性(编译为二进制文件)

安全性 | 多线程 | 高性能

  • 1.Java语言概述
    • 1.1 历史:James Gosling 基于C++编写了新的语言Oak,后改名为Java
    • 1.2 现状:应用广泛
    • 1.3 面向对象:Java中最外部的数据类型是对象,所有元素都通过类和对象访问
  • 2.JDK的下载和安装
  • 3.第一个Java程序
    • 编写文本源代码、编译源代码:javac filename.java
    • 运行:java classname。

第二章 熟悉Eclipse开发工具

  • 略,具体在 Eclipse 实操。Eclipse 对新手不太友好,汉化了
  • 在 eclipse 创建了第一个项目HelloJava,工作路径默认为C:\Java\java_workspace
  • 给 eclipse 安装了color theme插件

第三章 Java语言基础

1.Java程序基本结构

结构包括:包、类、main主方法、标识符、关键字、语句、注释,等;示例:

1
2
3
4
5
6
7
8
9
package Mr;                                     //定义包
public class Example{                           //创建类
    static int ONE = 1;                         //定义类的成员变量
    public static void main(String[] args){     //定义主方法
        String var = "Hello";                   //定义局部变量
        System.out.println(ONE);                //输出成员变量
        System.out.println(avr);                //输出局部变量
    }
}
  • Mr、Example、ONE、var等为标识符,由程序员自定义,也就是命名;
  • package为定义包的关键字;
  • public为Java程序的关键字,这里用于修饰类;class为定义类的关键字;
  • static为Java程序的关键字,这里用于修饰成员变量;int为数据类型关键字;
  • main是类的主方法,是Java程序的入口,main这个名称不可修改;
  • String是一个类,用于创建字符串对象,这里修饰main的形参,加上[]表明是字符串数组;
  • args是一个标识符,是主方法的形参数组;
  • System是一个系统类,out是该类提供的一个标准输出流,println是out提供的方法;

2.标识符和关键字

  • 2.1 标识符的命名规则
    • 由字母、数字、下划线和 $ 符号组成,第一个字符不能为数字;
    • Java语言使用Unicode标准字符集,最多可识别65535个字符。上述的字母可以是Unicode字符集中的任意字母,如拉丁字母,汉字,日文等;
  • 2.2 关键字:
    • int, public, this, finally, boolean, abstract, continue, float,long, short, throw, throws …
    • 共四十多个

3.基本数据类型

6种数值型(byte、short、long、int、float、double),和字符型、布尔型

  • 3.1 整数类型
    • byte, short, int, long分别占1、2、4、8个字节的内存空间;
    • 定义byte型:取值在[-128, 127]之间,否则溢出;如:byte x = 127
    • int型应用最广泛,空间不多不少;
    • 示例:创建Number类,在主方法中创建不同整数类型,并输出相加结果。
  • 3.2 浮点类型
    • 单精度float和双精度double浮点型分别占内存空间32位和64位;
    • 示例:创建SumFloatNumber类。
  • 3.3 字符类型
    • 使用char关键字进行声明,注意是储存单个字符,多个是字符串类型;
    • 字符使用单引号,字符串使用双引号;
    • 示例:创建Export类。
  • 3.4 布尔类型
    • 只有true和false两个取值,如:boolean b1 = true, b2 = false

4.变量和常量

  • 4.1 声明变量
    • 使用数据类型关键字声明变量,变量名尽可能有意义,尽量不使用中文;
  • 4.2 声明常量
    • 常量也成为final变量,使用关键字final声明;常量只能赋值一次;
    • 示例:创建类VarNConstant。
  • 4.3 变量的有效范围
    • 类似命名空间的概念,分为成员变量和局部变量;
    • 在类中定义的变量称为成员变量,在整个类中有效;成员变量又分为实例变量和静态变量(类变量);
    • 静态变量需要使用关键字static声明,静态变量可以跨类使用,引用方式为:class_name.static_var
    • 局部变量在方法中定义,只在该方法代码块中有效;方法调用结束后销毁;
    • 局部变量的声明周期取决于方法(何时调用何时结束);
    • 示例:创建类Val。

5.运算符

  • 5.1 赋值运算符
    • =,可以连着赋值:x = y = 1,但是不建议使用;
  • 5.2 算术运算符
    • +-*/ ,求余:%+-还可以当作正负号使用;
  • 5.3 自增、自减运算符
    • 使用变量a之前,将a加1或减1:++a/--a
    • 使用变量a之后,将a加1或减1:a++/a--
  • 5.4 比较运算符
    • > < == >= <= !=
    • 示例:创建Compare类。
  • 5.5 逻辑运算符
    • 与或非:& | !;与、或的短路形式:&&||
    • 示例:创建Calculation类。
  • 5.6 位运算符
    • 位运算符处理整型或字符型的操作数(转换成二进制数再进行位操作)
    • 按位取反 ~ 、按位与 & 、按位或 | 、按位异或 ^ 、左移 << 、右移 >>、无符号右移 >>>
    • ·示例:创建BitOperation类。
  • 5.7 三元运算符
    • 示例:boolean b = 20 < 45 ? true : false;结果b=true;
  • 5.8 运算符优先级
    • 大致顺序:括号、正负号、一元运算符、乘除、加减、移位、比较大小、比较是否相等、位运算、三元、赋值;
    • 示例:创建VarExchange类。
    • 示例:创建ParityCheck类。

6.类型转换

Java对数据类型转换有严格的规定。数据从占用内存空间小的类型转换到大的类型时,做自动类型转换(隐式);反之做强制类型转换(显式)。

  • 6.1 自动类型转换
    • Java中8种基本类型可以混合运算,运算前首先自动转换类型,遵循小内存转为大内存的规则。
    • 示例:创建Conver类。
  • 6.2 强制类型转换
    • 如果把占用内存大的类型转换为小内存类型,必须显式转换:int a = (int)45.0
    • 需要注意不能超过该类型的取值范围,否则数据溢出(不会报错,但会丢失数据)。
    • 示例:创建TypeConvertion类。

7.代码注释和编码规范

  • 7.1 代码注释
    • 单行注释://... ;多行注释:/*...*/ ;文档注释:/**...*/
  • 7.2 编码规范
    • 每条语句单独一行;
    • 声明变量单独一行(即使是同类型变量);
    • Java中多个空格看作一个;

第四章 流程控制

1.复合语句

  • 同C语言类似,Java的复合语句是以整个区块为单位的语句,又称块语句。由大括号作为开始和结束的标记。
  • 使用复合语句时,为局部变量创建了一个作用域,内部的变量只能在内部使用。

2.条件语句

  • 2.1 if 条件语句
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//基本结构
/* 简单 if 条件语句 */
if(布尔表达式){
    语句序列
}
//如果语句序列只有一条语句,可以省略大括号;

/* if-else 语句 */
if(布尔表达式){
    语句序列
}else{
    语句序列
}

/* if-else if 多分支语句 */
if(布尔表达式 1){
    语句序列
}else if(布尔表达式 2){
    语句序列
}else if ...
//当省略任意一组语句序列时,可以保留对应的大括号,也可以将大括号替换为‘;’;

//·示例:创建GetTerm类。
  • 2.2 switch 多分支语句
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/* if 语句检查多个条件的时候显得臃肿,可以使用switch多分支语句 */
//基本结构:
switch(表达式){
case 取值1:     //注意必须是常量表达式,
    语句块1
    [break;]    //可以不加break,那么会一直检查完n个分支再退出
case 取值2:
    语句块2
    [break;]
...
defult:         // 如果找不到匹配的case,采用default语句块
    语句块n+1   // 如果没有default,也没有匹配,那么switch语句什么都不做
    [break;]    // 如果前面的case不加break,default必然被执行
}
// 注意:case后的值可以不能是浮点数,不可以是字符串(可以是字符)。

// 示例:创建GetSwitch类。
  • 2.3 示例:创建CheckLogin类。
  • 2.4 示例:创建Example类。

3.循环语句

  • 3.1 while循环语句
1
2
3
4
5
6
/* 基本结构 */
while(条件表达式){
    语句块
}
// 注意不能用分号代替大括号,否则进入无限循环
// 示例:创建GetSum类。
  • 3.2 do - while循环
1
2
3
4
5
6
7
8
9
/* while循环先判断条件再执行 */ 
/* do - while循环先无条件执行一次,再进行类似while循环的过程 */
do
{
    语句块
}
while(条件表达式);  //里面是结束循环的条件

// ·示例:创建Cycle类。
  • 3.3 for 循环
1
2
3
4
5
6
7
8
9
/* for循环用来重复执行某语句块,直到某个条件满足为止 */
for(表达式1; 表达式2; 表达式3){
    语句块
}
//表达式1:初始化表达式,负责完成变量的初始化
//表达式2:循环条件表达式,为布尔型表达式,指定继续循环的条件
//表达式3:循环后的操作,负责再循环中改变变量

// 示例:创建Circulate类。
  • 3.4 foreach 循环
1
2
3
4
5
6
7
8
/* Java5新增了foreach语句,用法类似python的for循环,对对象进行循环 */
/* 基本结构 */
for(元素变量x : 遍历对象obj){
    引用了x的语句块
}
// 注意还是用for关键字

// ·示例:创建Repetition类。
  • 3.5 示例:九九乘法表,创建MultiplicationTable类。

4.跳转语句

  • 4.1 break 语句:强行跳出循环;
  • 4.2 continue 语句:终止当前语句块,进入下一次循环;
  • 4.3 return 语句:从一个方法返回对象,并将控制权交给调用它的语句。
  • 4.4 示例:略。

5.经典范例

  • 使用for循环输出杨辉三角,创建YanghuiTriangle类。

第五章 数组

数组是最常用的一种数据结构,是将一系列相同类型的数据,用同一个标识符封装到一起。实质上数组是一个线性序列,因此数组访问起来很快。

1.数组概述

  • 就是Numpy里面的ndarray的低配版

2.一维数组

  • 2.1 创建一维数组
    • 两种形式:以声明整型数组为例:
      • int arr[];
      • int[] arr; //arr为该数组的标识符
    • 给数组分配内存空间(使用new关键字)
      • arr = new int[10]; //长度为10的整型数组
    • 在声明的同时分配内存空间
      • int arr[] = new int[10];
  • 2.2 初始化一维数组
    • 两种形式:
      • int arr[] = new int[5]{1,2,3,4,5};
      • int arr[] = {1,2,3,4,5}; //即,可以省略new运算符和长度
  • 2.3 示例:遍历数组,略。(见上一章循环语句)

3.多维数组

  • 3.1 二维数组
    • 创建二维数组:
      • float arr[][];
      • float[][] arr;
    • 分配内存:
      • arr = new float[3][3];
      • arr = new float[3][]; //只给一个维度分配内存
    • 二维数组初始化:
      • int arr[][] = {{1,2,3}, {4,5,6}, {7,8,9}};
      • arr[0][0] = 100; //索引从0开始,初始化之后可以直接赋值
  • 3.2 三维数组
    • 示例:创建三维数组并打印,创建Ransack类。
  • 3.3 示例:对数组进行转置运算,创建ArraySwap类。

4.数组的基本操作

java.util包的Arrays类包含用于操作数组的各种方法

  • 4.1 遍历数组
    • 遍历一维数组;示例:GetDay;
    • 遍历二维数组;示例:Trap、Tautog;
  • 4.2 填充替换数组元素
    • 通过Arrays类的静态方法fill来进行填充;
    • fill(int[] a, int value) //将value赋值给a的每个元素;
    • fill(int[] a, fromidx, toidx, int value) //赋值给一定范围的每个元素,从fromidx到toidx(不包含);
    • //如果fromidx == toidx,则填充范围为空;
    • 示例:5_4_2.java
  • 4.3 对数组进行排序
    • 通过Arrays类的静态方法sort对数组进行排序;
    • 示例:5_4_3.java
  • 4.4 复制数组
    • 通过Arrays类的copyOf方法和copyOfRange方法进行复制数组
    • copyOf(arr, int newlength);
    • 其中newlength指新数组的长度,如果新数组的长度大于arr的长度,则用0填充(如果是char型数组则用null填充);;反之则截取原数组的一部分,从左往右截取;
    • copyOfRange(arr, int fromidx, int toidx);
    • 其中toidx不包含在内,fromidx只能取值 0 - arr.length ;
    • 示例:5_4_4.java
  • 4.5 范例5:对比一维、二维数组所占内存;
  • 4.6 范例6:使用直接插入排序法进行排序;

5.经典范例

  • 冒泡排序法,创建BubbleSort类。

第六章 字符串

字符串不是Java的一个基本类型,但是可以像基本类型一样使用。

6.1 创建字符串

  • 使用String方法新建字符串对象;
    • String s = new String();
  • 使用char数组创建字符串:
    • char a[] = {'g', 'o', 'o', 'd'}; String s = new String(a);
    • 等价于:String s = new String("good");
  • 使用offset表示开始截取字符串的位置,length表示截取的长度:
    • String(char a[], int offset, int length);
  • 示例:
    • char a[] = {'a', 'b', 'c', 'g', 'o', 'o', 'd', 'x', 'y', 'z'};
    • String s = new String(s, 3, 4);

6.2 字符串操作

  • 6.2.1 字符串连接
    • 直接相加就可以连接;
    • 与其他数值型连接时,返回的是字符串;
  • 6.2.2 获取字符串信息
    • 获取长度:str.length();
    • 获取指定字符索引位置:
      • str.IndexOf('char'); //返回首次检索到的字符索引,如不存在返回-1;
    • 返回最后出现的位置:
      • str.lastIndexOf('char');
    • 获取指定位置的字符:
      • str.charAt(int index);
  • 6.2.3 去除字符串的空格
    • 去除前后空格:str.trim();
    • 去除所有空格:StringTokenizer(str, delim); //其中delim为要去掉的字符串;
    • str.replaceAll(String regex, String replacement); //其中regex为要替换的字符串的正则表达式,replacement为替换的字符串
  • 6.2.4 字符串替换
    • replace方法:str.replace(String regex, String replacement); //好像跟replaceAll没有区别
    • replaceFirst方法:str.replaceFirst(regx, replacement);
  • 6.2.5 判断字符串
    • 判断字符串是否相等:str.equals(other_str);
    • 忽略大小写判断:str.equalsIgnoreCase(other_str);
    • 判断字符串的开头:str.startsWith(prefix); //其中prefix为前缀
    • 判断字符串的结尾:str.endsWith(suffix);
    • 上述判断均返回true或false;
  • 6.2.6 大小写替换
    • str.toLowerCase(); str.toUpperCase(); //返回修改后的字符串
  • 6.2.7 字符串分割
    • str.split(String sign); //其中sign为分隔符,可以为正则表达式
    • str.split(sign, int limit); //limit为指定分割的份数
  • 6.2.8 范例1,Division类;
  • 6.2.9 范例2,CheckNumber类;

6.3 格式化字符串

  • 6.3.1 格式化方法
    • str.format(String format, Objetc...args);
    • str.format(Local I, String format, Object...args); //加入本地化
  • 6.3.2 日期格式化。详见示例:创建Example类;
  • 6.3.3 时间格式化。详见示例:创建GetTime类。
  • 6.3.4 日期时间组合格式化。详见示例:创建DateAndTime类。
  • 6.3.5 常规类型格式化。详见示例:创建General类。
  • 6.3.7 范例;将数字格式化为货币格式。创建FormatNumber类。

6.4 正则表达式

  • 6.4.1 判断是否符合正则表达式
    • boolean matches(String regex); //regex:正则表达式;boolean:返回布尔型;
  • 6.4.2 正则表达式的元字符
    • 元字符:
      • . 表示任意一个字符;
      • \d 表示0-9的任意一个数字;
      • \D 任意非数字字符;
      • \s 空白字符,如 \t, \n
      • \S 任意非空白字符;
      • \w 可用作标识符的字符,但不包括 $
      • \W 前者取反;
      • \p{type} 格式:type 取值如下:
        • Lower:小写字母 | Upper:大写字母 | Alpha:字母字符;
        • Digit:十进制数字 | Alnum:数字或字母;
        • ASCII:ASCII字符集 | Print:可打印字符 | Graph:可见字符;
        • Punct:标点符号 | Blank:空格或制表符 | Cntrl:控制字符;
    • 示例:创建Decision类。
  • 6.4.3 正则表达式的限定符
    • 限定符用于指定某种元字符的重复次数:
      • ? 0次或1次;
      • * 0次或多次;
      • + 1次或多次;
      • {n} 正好n次;
      • {n,} 至少n次;
      • {n, m} n~m次;
    • 示例:创建Judge类。
  • 6.4.4 中括号中元字符的含义
    • 元字符:
      • [abc] a或b或c;
      • [^abc] 除了abc的所有字符;
      • [a-zA-Z] a-z或A-Z;
      • [a-d[m-p]] a-b或m-p;
      • [a-z&&[^abc]] a-z之间除了abc的所有字符;
      • [a-z$$[^m-p]] a-z之间加上除了m-p的所有字符;
    • 示例创建CheckHandSetNum类。
  • 6.4.5 范例:创建CheckIPAddress类。
  • 6.4.6 范例:创建ChineseAmount类。

6.5 字符串生成器

  • 6.5.1 StringBuilder类
    • 新创建的StringBuilder对象初始容量是16字符,可以自定义初始长度。创建后可以动态地执行添加、删除和插入等字符串操作,提高频繁操作字符串的效率。
    • 示例:创建Jerque类。
  • 6.5.2 StringBuilder类常用方法
    • StringBuilder builder = new StringBuilder("");
    • builder.append(String str); //追加到字符串生成器
    • builder.append(StringBuffer sb); //其中sb为缓存中的值
    • builder.insert(int offset, String str); //插值
    • builder.delete(int start, int end); //删除某段字符串
    • builder.toString(); //StringBuilder转换为字符串
    • 示例:创建allMethod类。
  • 6.5.3 范例:将汉字和字母转换为Unicode编码,创建CharacterUnicode类。
  • 6.5.4 范例:去除字符串中的重复字符,创建SBDelete类。

6.6 经典范例

  • 实现字符串加密,创建EncryptUncrypt类。