20165214 第五周学习任务
20165214 2017-2018-2 《Java程序设计》第五周学习总结
教材学习内容总结
- 第七章:内部类与异常类
- 7.1内部类:内部类就是在一个类中再定义一个类,这个在类中定义的类就叫做内部类,而包含内部类的类叫做外嵌类。
- 外嵌类的成员变量、方法可以在内部类中调用;内部类不能声明类变量和类方法(
static
);外嵌类的类体可以用内部类声明类对象;内部类仅供外嵌类使用,其他类不可以用某个类的内部类声明对象。 - 由下图,内部类编译得到的字节码名字格式为
[外嵌类名]$[内嵌类名].class
- 内部类也可以用static来修饰。这样的内部类可以用来在其他类中创建对象,但是这样的内部类不能够操作外嵌类的实例变量。
- 外嵌类的成员变量、方法可以在内部类中调用;内部类不能声明类变量和类方法(
- 7.2匿名类:匿名类是子类的一种,它没有名字,所以不能声明对象,但是可以直接创建对象:
new [父类名]() {匿名类类体};
- 匿名类的几个特点:①匿名类可以继承、重写父类的方法;②匿名类是内部类,所以匿名类的使用要遵守内部类的规则;③匿名类没有类名,所以在创建时直接使用父类的构造方法。
- 可以用接口名和类体来创建一个匿名的对象:
new [接口名]() {匿名类类体};
这个类体也叫做匿名类。此时,类体必须重写接口中的所有方法。
- 7.3异常类:在这里先介绍一个在java.lang包中的类Integer中的一个方法public static int parseInt(String s)可以把数字格式的字符串转化为int类型。
try-catch
语句:用来处理出现的异常操作。语句格式为try {可能发生异常的语句} catch(ExceptionSubclass1 e) {...} catch(ExceptionSubclass2 e) {...}
实现的功能是一旦在try部分出现异常,马上结束try的执行,然后在下面的语句中寻找相应的catch部分执行(catch关键字就是用来捕获被抛出的异常对象)。- throw关键字:当运行出现异常时,能够使用throw关键字来抛出异常的对象;而throws关键字用来声明要产生的若干个异常。要注意区分两者的区别
- 我们能够通过扩展Exception类定义自己的异常类。
- 7.4断言
- 断言语句通过关键字assert来声明。有两种形式:①
assert booleanExpression
,当程序运行到这一句时,如果被修饰的表达式为true,程序接着运行,否则程序停止运行。②assert booleanExpression:messageException
,当程序运行到这一句时,如果被修饰的表达式为true,程序接着运行,否则程序停止运行并输出“:”后的值。 - 使用java解释器直接运行程序,默认关闭断言语句;但在程序调试中可以使用-ea启用断言语句:
java -ea [主类名]
- 断言语句通过关键字assert来声明。有两种形式:①
- 7.5小节中出现了一个新的关键字finally,它的执行机制是,无论在运行程序的时候出现什么情况,finally子语句一定会被执行,除了如果在finally子语句前出现了程序对出代码
System.exit(0);
- 7.1内部类:内部类就是在一个类中再定义一个类,这个在类中定义的类就叫做内部类,而包含内部类的类叫做外嵌类。
- 第十章:输入、输出流
- 输入、输出流的作用是读入外部数据、向外部输出数据。所有输入流都是
InputStream
或Reader
的子类,所有的输出流都是OutputStream
或Writer
的子类。 - 10.1 File类
- File类的对象主要用来获取文件本身的一些信息,不涉及对文件的读写操作。创建一个File对象的构造方法:①
File(String filename);
②File(String directoryPath,String filename);
③File(File dir,String filename);
。文件的属性:
- 使用File对象调用方法
public boolean mkdir()
来创建一个目录,创建成功返回true,失败或者目录已经存在则返回false; - 当File对象是目录时,可以利用
public String [] list(FilenameFilter obj)
来返回目录下指定类型的所有文件,public File [] listFiles()
来用File对象形式返回目录下的指定类型的文件。 - 当使用File类创建一个文件对象后,若在指定的目录下没有指定名字的文件,则可以使用
public boolean createNewFile()
来在这个目录中创建一个该名的文件。对象调用方法public boolean delete()
可以用来删除当前文件。 - 要执行一个本地机器上的可执行文件时,可以使用Runtime类:
Runtime [对象名]=Runtime.getRuntime();
,然后借助这个对象调用exec([命令字符串]
来进行打开可执行文件或者执行操作。
- File类的对象主要用来获取文件本身的一些信息,不涉及对文件的读写操作。创建一个File对象的构造方法:①
- 10.2文件字节输入流:使用输入流的4个步骤:①设定输入流的源;②创建指向源的输入流;③让输入流读取源中的数据;④关闭输入流。
- 可以使用InputStream*的子类FileInputStream来读取对需求比较简单的文件。可以使用
FileInputStream(String name);
来设定名字为name**的文件为输入流的源,用 FileInputStream(File file);```来设定file指定的文件为输入流的源。 - 创建输入流时可能会出现错误,比如指向的文件不存在。这时候会出现IO异常(IOException),因此可以使用
try-catch
语句来处理这个异常。 - 输入流是读取源中数据的“通道”。文件字节流(FileInputStream)可以调用继承的read方法来顺序地读取文件(以字节为单位),而且只要不关闭流,每次调用read方法就能读取其余的内容,直至源的末尾或流被关闭。①
int read()
可以从源中读取单个字节的数据,返回0~255的一个整数,未读出字节返回-1。②int read(byte b[])
可以从源中读取b.length个字节到字节数组b中,返回读取的字节数目。到达文件末尾返回-1。③int read(byte b[],int off,int len)
可以用来读取源文件中从off开始共len个字节到数组b中,返回读取的字节数目。到达文件末尾返回-1。 - 可以调用输入流的方法
close();
来关闭流。程序结束时会自动关闭所有打开的流,但是要学会显式地关闭打开的流。
- 可以使用InputStream*的子类FileInputStream来读取对需求比较简单的文件。可以使用
- 10.3文件字节输出流(通过学习可以知道,输出流与输入流的一些方面是类似的):使用输出流的4个步骤:①设定输出流的目的地;②创建指向目的地的输出流;③让输出流把数据写入到目的地;④关闭流;
- 可以使用OutputStream*的子类FileOutputStream来读取对需求比较简单的文件。可以使用
FileOutputStream(String name);
来设定名字为name**的文件为输入流的源,用 FileOutputStream(File file);```来设定file指定的文件为输入流的源。 - 如果输出流指向的文件不存在,Java就会创建该文件,如果指向已存在的文件,会刷新这个文件(长度变为0)。创建输出流时可能会出现错误,比如指向的文件权限不够。这时候会出现IO异常(IOException),因此可以使用
try-catch
语句来处理这个异常。 FileOutputStream(String name,boolean append);和FileOutputStream(File file,boolean append)
来判断是否对文件进行刷新:append取true不刷新,取false刷新。0- 输出流是通往目的地的“通道”。文件字节流可以调用write方法顺序地写入文件,只要不关闭流,每次调用就顺序写入,直到流被关闭。①
void write(int n)
可以用来向目的地写入单个字节。②void write(byte b[])
可以用来向目的地写入一个字节数组。③void write(byte b[],int off , int len);
可以用来向目的地写入数组b从off开始共len长度的字节。 void close()
关闭输入流,同时可以保证冲洗掉缓冲区的内容。
- 可以使用OutputStream*的子类FileOutputStream来读取对需求比较简单的文件。可以使用
- 10.4 文件字符输入、输出流。
- 一个汉字在文件中占两个字节。与字节流对应的是
FileReader
和FileWriter
字符流。其构造方法也与10.3的内容相似。
- 一个汉字在文件中占两个字节。与字节流对应的是
- 10.5 缓冲流:BufferedReader类和BufferedWriter类创建的对象叫做缓冲输入、输出流。构造方法分别为
BufferedReader(Reader in);
和BufferedWriter(Writer out)
缓冲流增强了读写文件的能力。- BufferedWriter能够读取文本行,方法是readLine();也可以向文件写入一个回行符,方法是newLine()
- 关闭输出流首先要关闭上层流。
- 10.6 随机流:随机流可以读、写文件。构造方法
RandomAccessFile([文件名],[文件权限])
和RandomAccessFile([File对象名],[文件权限])
,其中权限为r(只读)或rw(可读写)。当指向文件时不会刷新文件。- 可以使用
seek(long a)
和getFilePointer()```来获取流的读写位置。
- 可以使用
- 10.7 数组流:字节数组输入、输出流:ByteArrayInputStream();ByteArrayOutputStream(),相关用法与之前的流相似。
- 10.8 数据流:数据输入、输出流:DateInputStream和DateOutputStream,它们允许程序按着与机器无关的风格读取Java原始数据。
- 10.9 对象流:对象输入、输出流:ObjectInputStream和ObjectOutputStream,使用对象流时要保证对象时序列化的。
- 10.10 序列化与对象克隆:使用对象流较容易得到一个序列化对象的克隆:把一个对象写入输出流目的地,再把这个目的地作为输入流的源。
- 10.11 使用Scanner解析文件。与8.3类似,只不过这里是解析文件中的数据。
- 10.12 文件对话框:创建文件对话框有两步:①使用
JFileChooser()
创建初始不可见的有模式对话框;②使用showSaveDialog(Component a);
或者showOpenDialog(Component a);
使对话框可见。 - 10.13 带进度条的输入流。可以使用
ProgressMonitorInputStream(Component c,String s,InputStream);
来在读取文件时弹出进度条。 - 10.14 文件锁的使用步骤:①使用RandomAccessFile流创建流对象(读写属性为rw)②input流调用方法getChannel()获取一个连接到底层文件的FileChannel对象;③信道借用tryLock或lock方法获得一个FileLock(文件锁)对象。
- 输入、输出流的作用是读入外部数据、向外部输出数据。所有输入流都是
教材学习中的问题和解决过程
- 问题1:一个内部类A的内部是否还能再定义一个以A为外嵌类的内部类B?(即大农场——养殖场——养牛场的关系)
- 问题1解决方案:自己尝试了一下,还真的可以。我只在一个内部类中再建了一个内部类,相当于总共有三层。由此我猜测,可以不断在新的内部类中创建内部类。不过过多层内部类也有一个很明显的缺点就是,很容易把人弄晕。。在写第三层的时候我就已经出现了很多次的错误。由此我断定,内部类的这种使用方式在现实中肯定用得很少。
- 问题2:在书本P286的代码中出现了这样一句
String s = new String (a,0,n);
不知道这是什么用法。 - 问题2解决方案:通过代码上下段还有输出结果来看,这是将数组a从开头开始算共n个复制到字符串s中。
代码调试中的问题和解决过程
-
问题1:在调试课本Example7_2的时候,编译可以通过,但是运行却出现了这样的情况:
-
问题1解决方案:把错误的原因翻译了一下,发现是输出的类型有所不对。接着看了一下主函数,发现原始是我把输出的格式c写成了d。改过来后问题解决了。
其他问题都是自己输入的错误,就不列举了。
代码托管
上周考试错题总结
-
错题1:“面向对象语言中的“类”相当于C语言中的函数”这是错的。应该是“面向对象语言中的“方法”相当于C语言中的函数”。
-
错题2:UML类图中一个类的属性能显示它的名字、类型、初始化值。方法的属性用+表示public,用-表示private,做题的时候不小心记反了。
-
错题3:
String="ab"+"cd"
,只创建了一个对象。
结对及互评
点评过的同学博客和代码
- 本周结对学习情况
-
结对学习内容
共同安装IDEA,学习IDEA的调试
其他
这周的学习感觉比较艰难,因为涉及到了文件的内容,而且内容还很多,需要记下来的一些流的用法也不少。但是在学习的时候,还是蛮有兴趣的,因为可以学到如何编写一个文件对话框。以前我们学语言的时候,都只是在一个编译器上面运行,并没有出现图形界面。现在开始接触到了这一块,令人感觉还是蛮酷的,想把这块学好然后编写出自己的软件出来。相信自己一定能做到!
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | |
---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 |
第一周 | 36/36 | 1/1 | 8/8 |
第二周 | 432/468 | 2/3 | 15/23 |
第三周 | 964/1432 | 1/4 | 16/39 |
第四周 | 725/2157 | 1/5 | 14/53 |
第五周 | 1428/3585 | 3/8 | 18/71 |
-
计划学习时间:15小时
-
实际学习时间:18小时