类名规范:以大写字母开头的名词 若由多个单词组成 每个单词的第一个字母应大写(驼峰命名法) 与.java文件名相同
运行程序:java ClassName(dos命令)
打印语句:System.out,println() 打印完语句换行 System.out,print() 打印完不换行
注释:1. // 2. /* */ 3. 以/**开始 以*/结束 可用来自动生成文档
数据类型:1. 整形: int 4字节 short 2字节 long 8字节 byte 1字节
长整型数值后面有一个后缀L或l 如4000000000L
十六进制数值有一个前缀0x或0X 如0XCAFE
八进制有一个前缀0 如010 (八进制前缀易与十进制混淆 所以一般避免使用八进制)
从java7开始 加上前缀0b或0B就可以写二进制数 如0b1001就是9 也可以在数字间加下划线 如1_000_000
2. 浮点类型:float 4字节 double 8字节
float类型有一个后缀F或f 没有后缀的浮点数默认为double型
可以使用16进制表示浮点数值 如0.125=2e-3可表示为0x1.0p-3 在16进制中 使用p表示指数
正无穷大:Double.POSITIVE_INFINITY
负无穷大:Double.NEGATIVE_INFINITY
NaN(不是一个数字):Double.NaN 注意:不能if(x==Double.NaN) 但可以if(Double.isNaN(x))
3.char类型:原本用于表示单个字符 现在有些unicode字符可以用一个char值描述 另外一些需要两个char值
要用' '括起来 如'A'是编码值为65的字符常量 与"A"不同 "A"是一个包含字符A的字符串
特殊字符的转义序列
\b 退格 \u0008 \t 制表 \u0009 \n 换行 \u000a \r 回车 \u000d
\" 双引号 \u0022 \' 单引号 \u0027 \\ 反斜杠 \u005c
4.boolean型:即布尔类型 包括 false 和 true
在java中 boolean值只能是true和false 而不能用0和1代替 并且一定要小写
变量与常量:1.变量:变量名中不能包含空格 不提倡int i,j这种声明风格 最好声明完后直接初始化
从java10开始 对于局部变量 如果可以从变量初始值推断出类型 可使用var关键字而无需指定类型
如var greeting = "Hello" var i = 2
2.常量:用final关键字指示常量 如 final double PI = 3.14
final表示该变量只能被赋值一次 赋值后不可修改 习惯上 常量名使用全大写
类常量:若希望某个常量可以在一个类的多个方法中使用 可使用类常量
如public static final double PI = 3.14 在类的开头定义
3.枚举类型:可自定义枚举类型 如 enum Size{SMALL, MEDIUM, LARGE}; 然后可声明这种类型的变量
如 Size s = Size.MEDIUM
运算符:1.算数运算符:+ - * / % 注意 当参与/的两个数都是整数时 则为整数除法 否则为浮点除法 如15.0 / 2 = 7.5
注意 整数被0除会产生一个异常 浮点数被0除将会得到无穷大或NaN结果
2.数学函数与常量:在Math类中 包含了许多数学函数 如pow() sqrt() floorMod() 三角函数 指数函数及反函数 以及PI E 等等
导入Math库 import static java.lang.Math.* 不过java已经自动导入lang包 所以不用在去特殊导入Math
Math库中提供了一些方法提醒计算溢出等问题 可调用Math.multiplyExact() 若溢出则会生成一个异常
你可以选择捕获或者让程序终止 而不是允许它给出一个错误结果而继续运行
另外还有addExact() subtractExact() incrementExact() decrementExact() negateExact()等
3.强制类型转换:可能丢失信息的转换需要通过强转来完成 格式如下
double x = 9.997; int nx = (int)x;
若想进行舍入运算 可使用Math.round()方法 用法为round(x, n) x为数值 n为精度
4.自增与自减:在表达式中 前缀形式会先完成加一 后缀形式会使用变量原来的值 建议不要在表达式中使用 会使我感到困惑
5.关系与boolean运算符:== && || < > <= >=
java支持三元操作符?: 用法为x < y ? x : y 会返回x y中较小的一个
6.位运算符:处理整数类型时 可以直接对组成整数的各个位完成操作 这意味着可以使用掩码技术得到整数中的各个位
位运算符包括:& :and | :or ^ :xor ~ :not 具体咋用自己查 我也不会
<< 与 >> 运算符可将位模式左移或右移 >>>运算符会用0填充高位
7.运算符级别:a += b += c 等价于 a += (b += c) 因为+=是右结合运算符
字符串:java没有内置的字符串类型 而是提供了一个预定义类String 每个用双引号括起来的字符串都是String的一个实例
1.子串:String中的substring方法而可以从一个较大的字符串中提取出一个子串 如String s = greeting.substring(0, 3) 即提取前3个字符
2.拼接:java允许使用+号来连接两个字符串 当一个字符串或" "与一个非字符串的值连接时 后者会转换为字符串
这种特性通常出现在输出语句中 如 System.out.println(" " + age) 或 System.out.println("The age is " + age)
如果需要把多个字符串放在一起 用一个界定符分隔 可使用静态join方法 如
String all = String.join(" / ", "S", "M", "L", "XL"); // all is the string "S / M / L / XL"
在java11中还提供了一个repeat方法:String i = "Java".repeat(3); // i is "JavaJavaJava"
3.不可变字符串:String类没有提供修改字符串中某个字符的方法 即String类对象是不可变的
若想修改字符串 可提取想要保留的子串(substring) 再与希望替换的字符拼接(+)
4.检测字符串是否相等:可以使用equals方法检测 如s.equals(t) 若字符串s与t相等 则返回true 否则返回false
s与t可为字符串变量 也可以是字面量 如 "Hello".equals(greeting)
若要检测两个字符串是否相等而不区分大小写 可使用equalsIgnoreCase 如"Hello".equalsIgnoreCase("hello")
注意:一定不要使用==检测两个字符串是否相等 这个运算符只能确定两个字符串是否存放在同一个位置上
什么叫是否存放在同一个位置上呢?
String类型有基本的两种构造 一种是String a = "hello" 另一种是String a = new String()
第一种构造的字符串存储于公共池中,对于同一个字符串,String a 与 b指向的是同一个字符串,所以a == b为true
第二种构造的是String类的一个对象,相当于对字符串的一个引用,a与b是两个不同的实例引用 所以a == b为false
这里一定要注意 + 和 substring等String库中的函数创造的字符串均为String的一个实例 为第二种情况
所以,在检测两个字符串内容是否相等的时候 一定要用equals,千万不能用==!
5.码点与代码单元:具体见p48页 我也看不懂
6.String.API:具体见书P49页 介绍了许多String类的常用方法
7.构建字符串:有些时候需要由较短的字符串构建字符串 若用+效率会很低 既浪费时间又浪费空间 可使用StringBuilder类来构建
StringBuilder builder = new StringBuilder();
每次若添加一部分内容时 就调用append()方法
builder.append(str);
字符串构建完成后就调用toString()方法 就可以得到一个String对象
String a = builder.toString();
具体常用API见书P54页
输入与输出:import java.util.*
1.读取输入:若想通过控制台进行输入 需要构造一个与标注输入流System.in关联的Scanner对象 如
Scanner input = new Scanner(System.in);
然后就可以使用Scanner类的方法来读取输入了
input.nextline() 读取一行 .next() 读取一个单词 .nextInt() 读取一个整数 .nextDouble() 读取一个浮点数
注意:因为输入是可见的 所以Scanner类不适合读取密码 java6引入了Console类来实现这个目的 可使用如下代码
Console cons = System.console();
String username = cons.readLIne("User name: ");
char[] passwd = cons.readPassword("Password: ");
为安全起见 返回的密码应该放在一个字符数组中 在对密码处理完成之后 应该马上用一个填充值覆盖数组元素
采用Console对象处理输入不如Scanner方便 必须每次读取一行输入 而没有读取单个单词或数值的方法