第3章 Java的基本程序设计结构

第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 整型

类型存储需求(与机器无关)范围(有符号数)
int4字节-231~231-1(刚超过20亿)
short2字节-215~215-1
long8字节-263~263-1
byte1字节-27~27-1
类型前后缀
long240l或240L
16进制0xCAFE或0XCAFE
8进制010
2进制0b1010或0B1010

3.3.2 浮点类型

类型存储需求(与机器无关)范围(有符号数)后缀(默认为double)
float4字节有效位数为6~7位F或f
double8字节有效位数为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];
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值