Java学习笔记(一)
Java学习笔记(一)
依据《写给大忙人看的Java核心技术》所记笔记
【美】Cay S.Horstmann 著
杨谦 王巍 高伟斌 谢志强 译
转载请注明出处,勿用于商业用途
第一章 基本的编程结构
一、第一个程序
-
在Java中,所有代码都必须在类中定义
-
main方法是程序运行时调用的第一个方法,它被声明为静态的,表面该方法不是依赖于对象运行的。
-
包(package)是一组相关类的集合,每个类都放入一个包中
-
三种注释方法:
//我是行注释 /* 我是多行注释 */ /** 我是文档注释 */
-
javac 命令将Java源代码编译为中间代码,也称字节码,并将它们保存到类文件中(即.class文件)
-
System.out是对象,是PrintStream的实例
-
使用点符号调用对象上的实例方法
-
字符串是String类的实例,可以调用length方法返回字符串的长度,即:
"Hello World".length()
-
Random类的对象可以产生随机数,可以使用new操作符构建一个Random对象
new Random();
类名之后是构造函数的参数列表
Random.nextInt()方法可以提供一个整数,Random类声明在java.util包中,使用需导入,即:
import java.util.Random
二、基本类型
-
整型(没有小数,允许为负)
int(4字节)long(8字节)short(2字节)byte(1字节)
如果long类型还不够用时,使用BigInteger类
-
使用long类型时带上L后缀,byte和short型采用强制转换
-
十六进制使用0x前缀,二进制使用0b前缀,八进制使用0前缀
-
可以给数字添加下划线方便阅读,Java编译器会自动删除它们。如:1_000_000表示100万
-
浮点类型
float(4字节) double(8字节)
float类型有F后缀,没有F默认为double类型,也可使用D作为Double类型后缀
-
十六进制指数使用p
-
Double.POSITIVE_INFINITY
代表正无穷Double.NEGATIVE_INFINITY
代表负无穷Double.NaN
代表“非数值”,如0.0/0.0或负数平方根 -
所有的“非数值”都彼此不同,不能使用
x==Double.NaN
检查可以调用
Double.isNaN
和Double.isInfinite
进行检查,Double.isFinite
可以检查既不是无穷也不是NaN -
浮点数不适合金融计算,因为存在误差,若要准确无误差的数学计算可以使用
BigDecimal
类 -
布尔型
有两种数值,false
和true
,Java中布尔类型不是数字类型,与0和1没有关系
三、变量
-
Java是强类型语言,变量值只能是某个具体类型的值
-
Java对字母大小写敏感
变量和方法的名称以小写字母开始,类的名称的第一个字母大写
驼峰式大小写:当名称由多个单词组成时,单词首字母大写,如:countOfInvalidInputs
-
在使用变量前必须初始化变量
-
允许在方法中的任何地方声明变量,尽可能晚地声明变量,刚好在首次需要变量的前一刻声明
变量声明在它的初始值刚有了的那一刻
-
final关键字表示一个值,一旦赋值后就不能改变了(常量)
常量的名称使用大写字母,如:
final int DAYS_PER_WEEK=7;
可以在方法外,使用static关键字声明常量,如:
public static final int DAYS=7;
-
在类内部可以直接使用常量,在其他类中使用需要在前面加上类名
-
System类中声明了一个常量:
public static final PrintStream out;
-
延迟final变量的初始化也可以,只要在首次使用前只初始化一次就好。
final变量一旦被赋值,就是最终的值,永远无法改变
四、算术操作
-
基本运算
- /操作符,如两个操作数都是整型,代表整除;如有小数会产生小数
- 整数除以零会导致异常,如果没有捕获异常,程序会终止
- 浮点数除以零会产生无限值或NaN,不会导致异常
- 当n为奇数时,若n为正,n%2的结果为1,若n为负,n%2的结果为-1
-
数学方法
- 静态方法不用在对象上调用,如静态常量一样,只需要在前面加上静态常量的类名即可
-
Math.pow(x,y)
产生x的y次方,Math.sqrt(x)
计算x的平方根 - 计算两个值哪个小或大,
Math.min
和Math.max
-
Math
类提供三角函数和对数方法,以及常量Math.PI
和Math.E
-
数字类型转换
- 合法转换
- byte-->short\int\long\double
- short\char-->int\long\double
- int-->long\double
- 合法但损失信息
- int-->float
- long-->float\double
- 合法转换
-
大数
java.math
中的BigInteger
和BigDecimal
类可实现任意精度计算Java不允许对象使用操作符,操作大数时必须使用方法调用
五、字符串
-
字符串连接
使用操作符+可以将两个字符串连接起来,将一个字符串和另外一个值连接起来时转换为字符串
-
子字符串
要将字符串分开,使用substring方法
substring方法的第一个参数是提取子字符串中的起始位置,第二个参数是子字符串不包含的终止位置
split方法分割由字符串分割的所有字符串
分隔符也可以是正则表达式
-
字符串比较
检查字符串是否相等,使用equals方法
string变量可以是null,表明该变量根本没有引用任何对象
在null上调用任何方法都会导致空指针异常
不考虑大小写比较两个字符串,可使用
equalsIgnorelase()
-
数字字符串转换
整数转换为字符串可调用静态的
Integer.toString()
字符串转整数,使用
Integer.parseInt()
对于浮点数,使用
Double.toString
和Double.parseDouble
-
String类API
在Java中,String类是不变的(immutable),即任何String方法不能修改自己的字符串
六、输入与输出
-
读取输入
要读取字符串和数字,构造一个依附到
System.in
的Scanner
Scanner in = new Scanner(System.in);
Scanner
对象的nextLine方法从输入读取一行nextInt()
读取整数,nextDouble()
读取浮点数Scanner类位于java.util包中
-
格式化输出
print方法不会在输出中新起一行,常用来提示输入
使用printf和%来格式化输出
使用
String.format
方法创建不打印输出的格式化字符串
七、控制流
-
分支:
if、else、else if、switch case
-
循环
while、do while、for
-
跳出循环
break、continue
break+标签可以跳出多个循环
-
局部变量作用域
八、数组和数组列表
-
使用数组
新建数组:
int[] nums
数组初始化:
nums =new int[10];
或nums = int[] {1,2,3,4};
y -
构造数组
也可以直接构造数组:
int [] nums = {1,2,3,4};
数组长度为0和空指针null不同
-
数组列表
构造数组时,必须指定长度,一旦构造好,数组的长度不能再变
使用java.util包中的ArrayList类来管理数组
声明变量:
ArrayList<String> friends =new ArrayList<>();
声明之后结果为一个大小为0的数组列表,可以用add方法给末尾加元素
访问元素要使用get方法,不能用[]直接访问
size方法可返回当前列表大小
-
基本类型包装类
泛型类不能使用基本类型作为类型参数,可以使用包装类
每一种基本类型都有对应的包装类
Integer、Byte、Short、Long、Character、Float、Double和Boolean
==和!=操作符比较引用对象而不是对象的内容
-
增强的for循环
for(int n:numbers){}
其中的n不是索引值,而是被赋值为numbers[0]、numbers[1]等
-
数组与数组列表的复制
数组直接等于的复制是引用直接指向同一个数组
若真正复制数组需要使用静态方法
Array.copyOf
int[] copiedPrimes = Arrays.copyOf(primes,primes.length);
该方法构造一个期望长度的新数组,并将原数组的元素复制进去
-
数组算法
Arrays(数组)类 Collections(集合)类
对数组或数组列表排序,使用sort方法
Arrays.sort(names)
、Collections.sort(friends)
toString()
产生一个数组的字符串表示 -
命令行参数
当用命令行执行程序时,命令行中的指定参数就赋值给main函数中的args
-
多维数组
Java中的多维数组是通过数组的数组来实现
int[][] square =new int[4][4];
九、功能分解
静态方法,即static修饰的方法可在main中直接调用
变长参数必须是方法中的最后一个参数,用修饰符...
修饰
public static double max(double first,double ... rest);