文章目录
第3章 Java的基本程序设计结构
3.1 一个简单的Java应用程序
class:Java应用程序全部内容都必须放在类中。
类名:驼峰命名法,每个单词第一个字母大写(CamelCase),文件名必须与公共类名相同。
Java虚拟机从指定类中的main(public)函数开始执行;main方法正常退出,Java程序返回退出码0,若要返回其他退出码:System.exti 。
3.2 注释
// 单行注释
/*
* 多行注释,不能嵌套使用
*/
/**
* 自动生成文档
*/
3.3 数据类型
Java是强类型语言,每个变量必须声明类型,8种基本类型(primitive type):整型(4)、浮点(2)、字符(1)、boolean(1)。
3.3.1 整型
类型 | 存储需求(与机器无关) | 范围(有符号数) |
---|---|---|
int | 4字节 | -231~231-1(刚超过20亿) |
short | 2字节 | -215~215-1 |
long | 8字节 | -263~263-1 |
byte | 1字节 | -27~27-1 |
类型 | 前后缀 |
---|---|
long | 240l或240L |
16进制 | 0xCAFE或0XCAFE |
8进制 | 010 |
2进制 | 0b1010或0B1010 |
3.3.2 浮点类型
类型 | 存储需求(与机器无关) | 范围(有符号数) | 后缀(默认为double) |
---|---|---|---|
float | 4字节 | 有效位数为6~7位 | F或f |
double | 8字节 | 有效位数为15位 | D或d |
System.out.println(2.0-1.1);
// 打印结果为:0.899999999999,而不是0.9
// 原因:浮点数值采用二进制系统表示,无法精确表示分数1/10
// 若不允许有舍入误差,采用BigDecimal类
3.3.3 char类型
char:‘A’ ,与 “A” 不同,后者是字符串,前者是字符。
\u : \u0008 ;Ubicode转义在解析代码之前得到处理(Java采用Unicode编码)。
“\u0022+\u0022” = “”+“” 也就是一个空串。
3.3.4 Unicode和char类型
码点:一个编码表中某个字符对应的代码值。
?疑惑:代码平面、代码单元、辅助字符编码(一对代码单元)、替代区域
强烈建议不使用char 类型
3.3.5 boolean类型
整型值与布尔值(false、true)之间不能相互转换,C++中可以。
3.4 变量与常量
大小写敏感
Java变量需初始化在使用,不会随机分配一个值,不然报错
Java不区分声明与定义
// 局部变量,若从其初始值可以推断出它的类型,可以使用var,不在需要声明类型
var num = 12; // int
var str = "hello"; // string
// final: 常量,只能赋值一次,名字全大写
final double CM_PER_INCH = 2.54;
// static final: 类常量,一个类的多个方法中使用,定义于main方法外部
public static final double CM_PER_INCH = 2.54;
// 枚举类型 enum
enum Size {SMALL, MEDIUM, LARGE, EXTRA_LARGE};
Size s = Size.MEDIUM;
3.5 运算符
import static java.lang.Math.*
// Math类:各种数学函数(sqrt、pow、cos、exp、PI)
数值类型之间转换
(实线:无信息丢失转换;虚线:有精度损失转换)
// 强制类型转换 高精度->低精度 需要
int x = (int) 9.9; // 截断小数部分: x = 9
// 自动发生强制类型转换
x += 3.5; // x = (int) (x + 3.5);
// 四舍五入 Math.round() 返回long类型
int x = (int) Math.round(9.9); // x = 10
// 逻辑运算
&& || ! // 短路运算
// 位运算
& | ^ ~ << >> // 符号位填充高位
>>> // 0填充高位
3.6 字符串
// 字符串 String类 不可变,不能修改,只能变量重新指向一个字符串
"string".substring(begin, end);
str1 = String.join(",", "1", "2", "3"); // str1 = "1,2,3"
str2 repeated = "Java".repeat(3); // str2 = "JavaJavaJava"
// 不能使用==检测字符串是否相等,只能确定两个字符串是否在同一位置
// 可能内容相同的字符串副本放在不同位置上
str1.equals(str2); // equalsIgnoreCase()
联机API文档:http://docs.oracle.com/javase/18/docs/api
// StringBuilder: 避免构建多个新的String对象
StringBuilder builder = new StringBuilder();
builder.append("hello");
builder.append(" world!");
String str = builder.toString();
3.7 输入与输出
import java.util.*;
// 用给定的输入流创建一个Scanner对象
Scanner in = new Scanner(System.in);
System.out.print("What is your name?");
String name = in.nextLine(); // 读取一行输入,可以包含空格
// next nextInt nextdouble hasNext hasNextInt hasNextDouble
因为Scanner输入是可见的,不适用于输入密码,Console类可实现密码输入。
// Console 只能每次读取一行输入
Console cons = System.console();
String name = cons.readLine("user name: ");
char[] passwd = cons.readPassword("Password: ");
格式化输出 printf
// 打印8个字符(会打印前导空格填充位数),小数点后2位
System.out.printf("%8.2f", 10000/3.0);
System.out.printf("Hello, %s. Next year, you'll be %d", name, age); // f:浮点数; s:字符串; d:十进制整数
// String.format 创建格式化字符串,不打印输出
String str = String.format("Hello, %s. Next year, you'll be %d", name, age);
文件输入与输出
Scanner in = new Scanner(Path.of("c:\\zxy\\myfile.txt"), StandardCharsets.UTF_8);
PrintWriter out = new PrintWriter("myfile.txt", StandardCharsets.UTF_8);
3.8 控制流程
Java 不能在嵌套的两个块中声明同名变量,C++可以(内层覆盖外层定义的变量)。
// for while if else
Size sz = {...}
switch(sc)
{
// char、byte、short、int、枚举常量、字符串字面量
case SMALL:
......
break;
......
default:
......
break;
}
标签
// break+标签名:跳出指定块
label:
{
while(1)
{
while(1)
{
break label; // 跳出label
}
}
}
3.9 大数
BigInteger 和 BigDecimal : 可处理任意长度、任意精度的整数、浮点数运算
// 将普通数转换为大数
BigInteger a = BigInteger.valueOf(1000);
// 构造大数
BigInteger b = new BigInteger("23423423434242452452345245245245");
// 不能用 + - * / 处理大数 add subtract multiply divide mod sqrt compareTo valueOf
BigInteger c = a.add(b);
// Java不支持重载运算符
3.10 数组
// 声明与初始化,初始化后不能更改长度(array list可以扩展);存在长度为0的数组
int[] a = new int[100]; // 所有元素初始化为0 false null
int[] b = {1, 2, 3};
String[] c = {"a", "b", "c"};
a = new int[]{4, 5, 6}; // 不用创建新变量
int len = a.length; // 数组长度没有(), string有 .length()
System.out.println(Arrays.toString(a)); // 打印a中所有值
for (variable: collection) // 直接遍历元素,而不是下标
{
statement
}
// a 与 b 引用同一数组,一起变化
int[] a = ...;
int[] b = a;
// 拷贝指定长度数组
Arrays.copyOf(array, length);
// 排序 快速排序
Arrays.sort(a);
// toString copyOf copyOfRange sort binarySearch fill equals
// 命令行参数, 不存储程序名
java Hello -p name zxy
int[][] a = new int[2][3];
int[][] b = {{1, 2, 3}, {4, 5, 6}};
for(double[] row: b)
for(double value: row)
......
System.out.println(Arrays.deepToString(b));
// 列数可以不同
int[][] a = new int[10][];
for (int i = 0; i < 10; i++)
a[i] = new int [i + 1];