20175314 《Java程序设计》第六周学习总结
教材学习内容总结
第七章:内部类与异常类
- 内部类:内部类就是在一个类中再定义一个类,这个在类中定义的类就叫做内部类,而包含内部类的类叫做外嵌类。
外嵌类的成员变量、方法可以在内部类中调用;内部类不能声明类变量和类方法(static);外嵌类的类体可以用内部类声明类对象;内部类仅供外嵌类使用,其他类不可以用某个类的内部类声明对象。
内部类也可以用static来修饰。这样的内部类可以用来在其他类中创建对象,但是这样的内部类不能够操作外嵌类的实例变量。
- 匿名类:匿名类是子类的一种,它没有名字,所以不能声明对象,但是可以直接创建对象:new [父类名]() {匿名类类体};
匿名类的几个特点:
①匿名类可以继承、重写父类的方法;
②匿名类是内部类,所以匿名类的使用要遵守内部类的规则;
③匿名类没有类名,所以在创建时直接使用父类的构造方法。
可以用接口名和类体来创建一个匿名的对象:new [接口名]() {匿名类类体};这个类体也叫做匿名类。此时,类体必须重写接口中的所有方法。
- 异常类:在java.lang包中的类Integer中的一个方法public static int parseInt(String s)可以把数字格式的字符串转化为int类型。
try-catch语句:用来处理出现的异常操作。
throw关键字:当运行出现异常时,能够使用throw关键字来抛出异常的对象;而throws关键字用来声明要产生的若干个异常。
- 断言
断言语句通过关键字assert来声明。有两种形式:
①assert booleanExpression,当程序运行到这一句时,如果被修饰的表达式为true,程序接着运行,否则程序停止运行。
②assert booleanExpression:messageException,当程序运行到这一句时,如果被修饰的表达式为true,程序接着运行,否则程序停止运行并输出“:”后的值。
- 关键字finally,它的执行机制是,无论在运行程序的时候出现什么情况,finally子语句一定会被执行,除了如果在finally子语句前出现了程序对出代码System.exit(0);
第十章:输入、输出流
输入、输出流的作用是读入外部数据、向外部输出数据。所有输入流都是InputStream或Reader的子类,所有的输出流都是OutputStream或Writer的子类。
- 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([命令字符串]来进行打开可执行文件或者执行操作。
- 文件字节输入流:使用输入流的4个步骤:
①设定输入流的源;
②创建指向源的输入流;
③让输入流读取源中的数据;
④关闭输入流。
- 文件字节输出流(通过学习可以知道,输出流与输入流的一些方面是类似的):使用输出流的4个步骤:
①设定输出流的目的地;
②创建指向目的地的输出流;
③让输出流把数据写入到目的地;
④关闭流。
FileOutputStream(String name,boolean append);和FileOutputStream(File file,boolean append)来判断是否对文件进行刷新:append取true不刷新,取false刷新。
输出流是通往目的地的“通道”。文件字节流可以调用write方法顺序地写入文件,只要不关闭流,每次调用就顺序写入,直到流被关闭。
①void write(int n)可以用来向目的地写入单个字节;
②void write(byte b[])可以用来向目的地写入一个字节数组;
③void write(byte b[],int off , int len);可以用来向目的地写入数组b从off开始共len长度的字节;void close()关闭输入流,同时可以保证冲洗掉缓冲区的内容。
- 文件字符输入、输出流:一个汉字在文件中占两个字节。与字节流对应的是FileReader和FileWriter字符流。其构造方法也与10.3的内容相似。
- 缓冲流:BufferedReader类和BufferedWriter类创建的对象叫做缓冲输入、输出流。构造方法分别为BufferedReader(Reader in);和BufferedWriter(Writer out)缓冲流增强了读写文件的能力。
BufferedWriter能够读取文本行,方法是readLine();也可以向文件写入一个回行符,方法是newLine()
关闭输出流首先要关闭上层流。 - 随机流:随机流可以读、写文件。构造方法RandomAccessFile([文件名],[文件权限])和RandomAccessFile([File对象名],[文件权限]),其中权限为r(只读)或rw(可读写)。当指向文件时不会刷新文件。 可以使用seek(long a)和getFilePointer()```来获取流的读写位置。
- 数组流:字节数组输入、输出流:ByteArrayInputStream();ByteArrayOutputStream(),相关用法与之前的流相似。
- 数据流:数据输入、输出流:DateInputStream和DateOutputStream,它们允许程序按着与机器无关的风格读取Java原始数据。
- 对象流:对象输入、输出流:ObjectInputStream和ObjectOutputStream,使用对象流时要保证对象时序列化的。
- 序列化与对象克隆:使用对象流较容易得到一个序列化对象的克隆:把一个对象写入输出流目的地,再把这个目的地作为输入流的源。
- 使用Scanner解析文件。与8.3类似,只不过这里是解析文件中的数据。
- 两布创建文件对话框:①使用JFileChooser()创建初始不可见的有模式对话框;②使用showSaveDialog(Component a);或者showOpenDialog(Component a);使对话框可见。
- 带进度条的输入流。可以使用ProgressMonitorInputStream(Component c,String s,InputStream);来在读取文件时弹出进度条。
- 文件锁的使用步骤:
①使用RandomAccessFile流创建流对象(读写属性为rw);
②input流调用方法getChannel()获取一个连接到底层文件的FileChannel对象;
③信道借用tryLock或lock方法获得一个FileLock(文件锁)对象。
教材学习中的问题和解决过程
- 问题1:程序编译报错,文件编码的问题。
- 问题1解决方案:jdk在编译的时候,如果没有用-encoding参数指定java源程序的编码格式,则javac首先获得操作系统默认采用的编码格式,也即在编译java程序时,若不指定源程序文件的编码格式,jdk首先获得操作系统默认的编码格式,xp是GBK,然后jdk就把java源程序从该编码格式转化为java内部默认的unicode格式放入内存中。然后,javac把转换后的unicode格式的文件进行编译成.class类文件,此时.class文件是unicode编码的,它暂放在内存中,紧接着,jdk将此以unicode编码的编译后的class文件保存到操作系统中形成.class文件。最终获得的.class文件是内容以unicode编码格式保存的类文件,它内部包含源程序中的中文字符串,只不过此时它己由安装系统编码格式转化为unicode格式。
- 问题2:Example10_3编译成功后运行报错,文件没有放在代码指定的路径中。
- 问题2解决方案:创建输入流时可能会出现错误,比如指向的文件不存在。这时候会出现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();来关闭流。程序结束时会自动关闭所有打开的流,但是要学会显式地关闭打开的流。
- 问题3:javac -encoding gbk 编译方式报错。
- 问题3解决方案:直接使用javac编译。
代码调试中的问题和解决过程
- 问题:Example10_2编译运行出的程序不能使用-encoding参数指定java源程序的编码格式
代码托管
本周考试错题总结
-
错题1
原因:概念不清
理解情况:new filenamefilter()是创建一个继承自filenamefilter的匿名类对象,通过new表达式返回的引用自动向上转型为对filenamefilter的引用。因为匿名类不存在构造方法,需要显式调用父类的构造方法,并重写父类的方法。 -
错题2
原因:概念不清
理解情况:内部类的外嵌类的成员变量在内部类中仍然有效;内部类中的方法也可以调用外嵌类中的方法;匿名类一定是内部类;匿名内部类可以使用外部类的成员变量的,即使是private的也可以;当在匿名类中用this时,这个this则指的是匿名类或内部类本身。这时如果我们要使用外部类的方法和变量的话,则应该加上外部类的类名。
心得体会
本周第七章第十章的学习内容是我在Java学习中遇到过最多最复杂也是最困难的,本周共有四份博客需要提交:学习总结,实验一,类定义还有结对项目,任务可以说是相当繁重,即使是清明节三天假期待在学校学习时间也非常紧。但是当我调试运行第十章代码时知道我们已经开始慢慢学习到开发操作界面还是很开心的,上一次学习设计程序的操作界面还是在高中时信息技术课的Visual Basic,以前都是运行命令行程序,现在开始有开发软件的感觉,很有成就感,相信自己一定会在接下来的学习中更加认真努力,能够在未来用这学期所学知识开发一个令自己满意的简单实用的软件。
学习进度条
代码行数 | 博客量 | 学习时间 | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 16篇 | 320小时 | |
第一周 | 51/100 | 1/1 | 12/20 | 基本掌握了Linux的简单指令 |
第二周 | 173/200 | 1/1 | 18/20 | 学习了Java重要基本语法 |
第三周 | 672/800 | 1/1 | 18/20 | 学习了包含多个类的Java程序及类的包机制 |
第四周 | 436/600 | 1/1 | 12/20 | 学习程序父类和子类的继承规则 |
第五周 | 573/600 | 1/1 | 10/20 | 学习通过类来实现接口和接口回调 |
第六周 | 1182/1200 | 1/1 | 20/20 | 学习内部类、匿名类、异常类和File类 |
计划学习时间:20小时
实际学习时间:20小时