《Java程序设计基础》 第3章手记
《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@从流域到海域
- 聚类之dbscan算法
- ubuntu 使用sudo apt-get update 出现 被配置多次导致无法升级错误解决方法
- morestack与goroutine pool
- 关于python使用threadpool中的函数单个参数和多个参数用法举例
- python科学计算之numpy
- 关于python使用cv画矩形并填充颜色同时填充文字
- Go语言入门基础
- 【前端编程】加载第三方JS的各种姿势
- ubuntu16中遇到libgstreamer-0.10.so.0缺失解决方案
- 关于文件的压缩与解压
- Storm读取Kafka数据是如何实现的
- faster-rcnn在编译时遇到的一些问题
- 使用感知机训练加法模型
- 让你真正理解什么是SparkContext, SQLContext 和HiveContext
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 一天一大 leet(无重复字符的最长子串)难度:中等-more-001
- 一天一大 leet(交错字符串)难度:困难-Day20200718
- 我把公司 10 年老系统改造 Maven,真香!!
- 一天一大 leet(恢复空格)难度:中等-Day20200709
- 一天一大 leet(旋转数组的最小数字)难度:简单-Day20200721
- 一天一大 leet(最佳买卖股票时机含冷冻期)难度:中等-Day20200710
- 一天一大 leet(戳气球)难度:困难-Day20200719
- 一天一大 leet(不同的二叉搜索树 II)难度:中等-Day20200721
- 组合游戏系列5: 井字棋、五子棋AlphaGo Zero 算法实战
- 一天一大 leet(最小路径和)难度:中等-Day20200723
- 一天一大 leet(二叉树的最大深度)难度:简单-Day20200728
- 生产者消费者模式的三种实现方式
- java中的阻塞队列
- java虚拟机
- 重构:保持Dockerfile整洁的5个技巧