《Java程序设计基础》 第3章手记
本章主要内容:
1. 数据类型
2. 变量
3. 基本类型变量
4. 数据类型的转换规则
5. 从键盘上输入数据的语句格式
6. 运算符
Java语言中的数据类型分为两大类:基本数据类型和引用数据类型。
Java语言采用Unicode字符集编码方案(在使用中文时由于编码可能会出现问题,我们后面会讲到)
其余的知识请参阅原书。我们有C语言的基础,重点记忆与C语言不同的和新增的内容,你可以拿一本C语言的书在手边,一样的就按C语言来记,不一样的和新增的从现在开始记忆。
如果类,对象这些概念你弄不懂的话,百度一下面向对象编程吧。
我们的重点在于从键盘上输入数据的语句格式,这部分内容涉及代码,而且由于类的使用令人蛮纠结的。原书介绍了两种方法,很不幸,两种方法你都要掌握,虽然第二种确实比第一种要简单得多。Java算是时间比较长的语言了,SE5之后才开始支持Scanner方法,不排除你遇到的代码使用了第一种方法。
3.6从键盘输入数据
数据输入方式一:
1)字符输入:
import java.io.*; //加载Java.io类库中的所有类
public class input1 //定义类,input1是类名称
{
public static void main(String[] args) throws IOException //throws方法可能出现异常声明
{
String str; //声明str为String类型
BufferedReader buf; //声明buf为BufferedReader类的变量,该类在java.io类库中
buf = new BufferedReader(new InputStreamReader(System.in));//创建buff对象这是一种简略的写法
str = buf.readLine(); //使用readLine方法将字符串读入并存入str中,且需处理IOException异常
}
}
①throws IOException表示此方法有抛出IOException异常的可能性。只要此方法的某些代码可能抛出异常,你就必须显式的处理他,要么抓住(try…catch),要么抛出。具体处理方式以后会涉及到。
②buf = new BufferedReader(new InputStreamReader(System.in))//创建buff对象
括号里实际上创建了一个InputStreamReader的对象,该对象用System.in创建,创建之后直接用来创建BufferedReader对象,所以说是简略的写法,原书34页上方是完整版的例子。
③*(核心内容)*看不懂没关系,不要头疼,这是原理,下面有简单的介绍。
java.io.BufferedReader和java.io.BufferedWriter类各拥有8192字符的缓冲区。当BufferedReader在读取文本文件时,会先尽量从文件中读入字符数据并置入缓冲区,而之后若使用read()方法,会先从缓冲区中进行读取。如果缓冲区数据不足,才会再从文件中读取,使用BufferedWriter时,写入的数据并不会先输出到目的地,而是先存储至缓冲区中。如果缓冲区中的数据满了,才会一次对目的地进行写出。
从标准输入流System.in中直接读取使用者输入时,使用者每输入一个字符,System.in就读取一个字符。为了能一次读取一行使用者的输入,使用了BufferedReader来对使用者输入的字符进行缓冲。readLine()方法会在读取到使用者的换行字符时,再一次将整行字符串传入。
System.in是一个位流,为了转换为字符流,可使用InputStreamReader为其进行字符转换,然后再使用BufferedReader为其增加缓冲功能。
简单地讲这种输入方式,就是用System.in读取一位一位的数据,再使用InputStreamReader转换为字符流(这种转换是通过创建对象进行的),再用BufferedReader创建一个对象,目的是增加缓冲功能来读取字符串而不是单个字符,这样操作之后才能使用readLine方法读入并存储用户输入的字符串。
2)数值输入
Java和C#中,从键盘输入的数据均被实为字符串,因此数值输入都是先输入字符串,再转换成数值。转换方法参见33页表3.7,具体的例子在35页例3.4。
数据输入方式二:
从Java SE 5版本之后,专门在java.util类库中增加了类Scanner来简化输入操作。
import java.util.*; //加载java.util类库中的所有类
public class in1 //类声明,in1是类名称,可自定义
{
public static void main(String[] args) //类中主方法(函数)声明
{
Scanner reader = new Scanner(System.in); //创建一个Scanner类,名为reader
double num; //定义一个double类型变量,名为num
num = reader.nextDouble(); //用reader对象调用nextDouble方法来读取用户输入的double型数据
}
}
可以看出,这种输入方式可以用reader对象以“next数据类型()”这种形式的方法读取用户输入的相应数据类型的数据。(如本例的nextDouble()和下一个例子的nextInt()等)
这里没有探讨多个数据输入和打印,我相信你能够理解那部分内容。多个数据只是增加了数量,打印的话,print和println的差别是println输出内容之后会自动换行。
编译Java文件可能出现的错误
1)编码错误
如果你使用的是记事本,不会因为编码问题出现错误,因为记事本的默认编码方式是ANSI。
但如果你使用notepad++、VS Code等其他文本编辑器则可能如下报错:
错误:编码GBK的不可映射字符
表示你的文本编辑器没有采用Java能够读取的编码(默认采用utf8编码),解决方法如下:
1.编译时在命令行输入 javac -encoding UTF-8 test.java
2.使用记事本打开你的java文件,然后另存为ANSI编码格式的文件,就可以正常编译了。
3.(推荐方法)在使用你的文本编辑器写好代码要保存的时候,设置保存为ANSI编码格式或者Unicode或者GBK2312编码格式(中国官方简体中文标准编码),这是一劳永逸的方法。
各种编码的区别:
http://blog.csdn.net/xiongxiao/article/details/3741731
2)其他错误
仔细看编译时cmd或者PwoerShell里的报错信息,他们都是中文的,你应该可以看懂,然后对症下药。能告诉你的是,它会有一个^符号来指明哪个位置出现错误。
例:
错误:需要‘)’
你漏了右括号
Solo | weibo@从流域到海域