java核心技术读书笔记(3)
更新日期:
一个简单的java应用程序
- 编译源代码之后就会得到包含这个类字节码的文件。
- main方法必须声明为public,而且必须有一个外壳类。
- object.method(parameters) 这等价于函数调用。
注释
- //
- 以/*开始,以/结尾。这种注释可以自动生成文档。
- / / 注意这种注释不能嵌套。
数据类型
java是一种强类型语言。一共有8种基本数据类型:int(4字节),short(2字节),long(8字节),byte(1字节),float,double,char,boolean。但java有一个能够表示任意精度的算术包—big number。在java中,整型范围与运行java代码的机器无关。java没有任何无符号类型!!!
表示溢出和出错情况的三种浮点数值:
- 正无穷大 Double.POSITIVE_INFINITY
- 负无穷大 Double.NEGATIVE_INFINITY
- NaN(不是一个数字) Double.NaN
变量
声明一个变量之后,必须用赋值语句对变量进行显示初始化,千万不要使用未初始化的变量。在java中,不区分变量的声明与定义。
关键字final指示常量,关键字static final 指示一个类常量。
运算符
整数被0除将会产生一个异常那个,而浮点数被0除将会得到无穷大或NaN结果。
&&和||是按照短路方式求值的。可以避免一些错误发生:
x!=0&&1/x>x+y //no division by 0
&和|应用于布尔值,得到的结果也是布尔值。
<<和>>运算符求值简单算法:
8<<1 8*2^1=16
8<<n 8*2^n
8>>1 8/2^1=4
8>>n 8/2^n 取商 余数不要
注意:若n为int类型,则要先进行模32处理(n%32) 若n为long类型,则要先进行模64处理(n%64)
输入输出
先来看一个简单的例子:
import java.io.Console;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;
import java.util.Scanner;
public class Test {
public static void main(String[] args) throws IOException{
Scanner in=new Scanner(System.in);
System.out.println("what's your name?");
String name=in.next();
System.out.println(name);
}
}
想要通过控制台进行输入,首先需要构造一个Scanner对象,并与标准输入流System.in相关联。
因为输入可见,所以Scanner不适合用于密码输入,这里可以使用Console类来实现。
import java.io.Console;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;
public class Test {
public static void main(String[] args) throws IOException{
Console con=System.console();
if (con != null) { // 判断是否有控制台的使用权
String user = new String(con.readLine("Enter username:")); // 读取整行字符
String pwd = new String(con.readPassword("Enter passowrd:")); // 读取密码,输入时不显示
con.printf("Username is: " + user + " "); // 显示用户名
con.printf("Password is: " + pwd + " "); // 显示密码
} else {
System.out.println("Console is unavailable."); // 提示无控制台使用权限
}
}
}
java.io.Console 只能用在标准输入、输出流未被重定向的原始控制台中使用,在 Eclipse 或者其他 IDE 的控制台是用不了的。
java程序无法获得Console实例是因为JVM不是在命令行中被调用的或者输入输出被重定向了。
Scanner还可以直接扫描文件。
import java.io.Console;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;
public class Test {
public static void main(String[] args) throws IOException{
double sum=0.0;
int count=0;
FileWriter fout=new FileWriter("text.txt");
fout.write("2 2.2 3 3.3 4 4.5 done");//往文件里写入这一字符串
fout.close();
FileReader fin=new FileReader("text.txt");
Scanner scanner=new Scanner(fin);//注意这里的参数是FileReader类型的fin
while(scanner.hasNext()){//如果有内容
if(scanner.hasNextDouble()){//如果是数字
sum=sum+scanner.nextDouble();
count++;
}else{
String str=scanner.next();
if(str.equals("done")){
break;
}else{
System.out.println("文件格式错误!");
return;
}
}
}
fin.close();
System.out.println("文件中数据的平均数是:"+sum/count);
}
}
结果输出文件中数据的平均数是:3.1666666666666665
这段程序的功能是将”2 2.2 3 3.3 4 4.5 done”写入文件scanner读取文件中的数直到done结束。并求出数字的平均值,比较有意思的是scanner会自动一空格作为分割符区分不同数字。当然也可以通过scanner.useDelimiter(Pattern pattern)来设置不同的分割符,比如 scanner.useDelimiter(“,*”);