Java核心技术学习--第二天
第三章 Java的基本程序设计结构
输入输出
读取输入
构造Scanner对象,与“标准输入流”System.in关联。
Scanner in = new Scanner(System.in);
输入中有可能包含空格时, 使用nextLine方法
String name = in.nextLine();
读取一个单词
String firstName = in.next();
读取一个整数
int age = in.nextInt();
读取一个浮点数
double age = in.nextDouble();
若想读取密码,则使用Console类。
java.util.Scanner
- Scanner(InputStream in) 用给定的输入流创建一个Scanner对象
- String nextLine() 读取输入的下一行内容
- String next() 读取输入的下一行单词
- int nextInt() 读取并转换下一个表示整数的字符序列
- double nextDouble() 读取并转换下一个表示浮点数的字符序列
- boolean hasNext() 检测输入中是否还有其他单词
- boolean hasNextInt() 检测输入中是否还有表示整数的下一个字符序列
- boolean hasNextDouble() 检测输入中是否还有表示浮点数的下一个字符序列
格式化输出
使用System.out.print(x)会将x对应的数据类型所允许的最大非0数字位数打印输出。
使用System.out.printf()可以使用多个参数,每一个以%字符开始的格式说明符都用相应的参数替换。
使用标志控制格式化输出。
文件输入与输出
对文件进行读取,需要用一个File对象构造一个Scanner对象
Scanner in = new Scanner(Path.get("myfile.txt"), "UTF-8");
如果文件名中包含反斜杠符号,就要记住在每个反斜杠之前再加一个额外的反斜杠。
构造PrintWriter对象,写入文件。
PrintWriter out = new PrintWriter("myfile.txt", "UTF-8");
如果文件不存在则创建文件,可以使用print\println\printf。
java.util.Scanner
- Scanner(File f) 构造一个从给定文件读取数据的Scanner
- Scanner(String data) 构造一个从给定字符串读取数据的Scanner
java.io.PrintWriter
- PrintWriter(String fileName) 构造一个将数据写入文件的PrintWriter
控制流程
使用条件语句和循环结构确定控制流程。
块作用域
块是指由一对大括号括起来的若干条简单的Java语句。
不能在嵌套的两个块中声明同名的变量。
条件语句
循环
for语句的第1部分通常用于对计数器初始化,第2部分给出每次新一轮循环执行前要检测的循环条件,第3部分指示如何更新计数器。
循环中,检验浮点数是否相等需要小心,因为可能无法精确用二进制表示。
带标签的break语句,可用于跳出多重嵌套循环。通过执行带标签的break跳转到带标签的语句块末尾。
大数值
BigInteger和BigDecimal处理包含任意长度数字序列的数值。
BigInteger实现了任意精度的整数运算,BigDecimal实现了任意精度的浮点运算。
使用静态的valueOf方法将普通的数值转换为大数值。
BigInteger a = BigInteger.valueOf(100);
不能使用算术运算符,需要使用add和multiply方法。
BigInteger c = a.add(b);
BigInteger d = c.multiply(b);
数组
声明变量并初始化数组
int [] a = new int[100];
数字数组所有元素都初始化为0。boolean数组的元素初始化为false。对象数组初始化为null。
获取数组元素个数,使用array.length。数组一旦创建,就不能改变其大小。
for each循环
不必指定下标值。
for(variable : collection)
statement
定义一个变量用于暂存集合的每一个元素,并执行相应语句。collection必须是一个个数组或者一个实现了Iterable接口的类对象。
for(int element : a)
System.out.println(element);
数组初始化以及匿名数组
创建数组对象并同时赋予初始值的简化书写形式。
int [] smallPrices = {2, 3, 5, 7, 11, 13};
初始化匿名数组
new int [] {17, 19, 23};
数组拷贝
将一个数组变量拷贝给另一个数组变量,两个变量将引用同一个数组。
将一个数组的所有值拷贝到一个新的数组中去。
luckyNumbers = Arrays.copyOf(luckyNumbers, 2 * luckyNumbers.length);
第2个参数是新数组的长度,多余的元素将被赋值为0,或false。
命令行参数
每一个Java应用程序都有一个带String [] args参数的main方法。
数组排序
使用Arrays类中的sort方法,该方法使用了优化的快速排序算反。
int [] a = new int[1000];
···
Arrays.sort(a);
java.util.Arrays
- static String toString(type[] a) 返回包含a中数据元素的字符串,这些数据元素被放在括号内,并用逗号分隔。
- static type copyOf(type[] a, int length)
- static type copyOfRange(type[] a, int start, int end) 返回与a类型相同的一个数组
- static void sort(type[] a) 采用优化的快速排序算法对数组进行排序
- static int binarySearch(type[] a, type v)
- static int binarySearch(type[] a, int start, int end, type v) 采用二分搜索算法查找值v
- static void fill(type[] a, type v) 将数组的所有数据元素设置为v
- boolean equals(type[] a, type[] b)
多维数组
不规则数组
第4章 对象与类
面向对象程序设计概述
类
封装将数据和行为组合在一个包中,并对对象的使用者隐藏了数据的实现方式。
对象
识别类
识别类的简单规则是在分析问题的过程中寻找名词,而方法对应着动词。
类之间的关系
- 依赖。如果一个类的方法操纵着另一个类的对象,那么一个类依赖于另一个类。
- 聚合。类A的对象包含类B的对象。
- 继承。表示特殊与一般关系。
使用预定义类
对象与对象变量
使用对象前,必须构造对象,并指定其初始状态,然后对对象应用方法。
用户自定义类
文件名必须与public类的名字相匹配。在一个源文件中,只能有一个公共类。
构造器总是伴随着new操作符的执行被调用,不能对一个已经存在的对象调用构造器。
不要在构造器中定义与实例域重名的局部变量。
所有方法都必须在类的内部定义。
不要编写返回引用可变对象的访问器方法。如果需要返回一个可变对象的引用,首先对它进行克隆。
方法可以访问所属类的私有特性。
静态域与静态方法
静态方法不能访问实例域,不能操作对象。
方法参数
Java程序设计语言对对象采用的不是引用调用,对象引用是按值传递的。
Java中方法参数的使用情况:
- 一个方法不能修改一个基本数据类型的参数
- 一个方法可以改变一个对象参数的状态
- 一个方法不能让对象参数引用一个新的对象