20175212童皓桢 《Java程序设计》第六周学习总结

20175212童皓桢 《Java程序设计》第六周学习总结

教材学习内容总结

第七章 内部类与异常类

1.内部类

Java支持在一个类中定义另一个类,这样的类称作内部类,包含内部类的类称为内部类的外嵌类。

  • 内部类的外嵌类的成员变量在内部类中仍然有效,内部类中的方法也可以调用外嵌类中的方法。
  • 内部类的类体不能声明类变量和类方法。外嵌类的类体中可以用内部类声明对象,作为外嵌类的成员。
  • 内部类仅供它的外嵌类使用,其他类不可以用某个类的内部类声明对象。

2.匿名类(被认为是一个子类去掉声明后的类体)

Bank是类,下列代码用Bank的一个子类(匿名类)创建对象。

new Bank(){
匿名的类体
}
  • 匿名类可以继承、重写父类的方法。
  • 匿名类一定是内部类
  • 匿名类可以访问外嵌类中的成员变量和方法
  • 匿名类因没有类名,因此匿名类创建对象时,直接使用父类的构造方法。

    感觉匿名类的概念和使用方法不太好理解,故用书中例子以阐明:
board.showMess(new OutputAlphabet()
//向参数传递OutputAlphabet的匿名子类对象
{ public void output()
{ for(char c='α';c<='ω';c++) //输出希腊字母
System.out.printf("%3c",c);
}
}
);

Example7_2.java的以上即为使用匿名类的部分。

  • 另外的,可以使用接口名和类体组合创建一个匿名对象传递给方法的参数,类体必须要重写接口中的全部方法,如:
machine.turnOn( new SpeakHello(){
public void speak() {
System.out.println("hello,you are welcome!");
}
}
);
machine.turnOn( new SpeakHello(){
public void speak() {
System.out.println("你好,欢迎光临!");
}
}
);

3.异常类

Java允许定义方法时声明该方法调用过程中可能出现的异常,即允许方法调用过程中抛出异常对象,终止当前方法的继续执行。

另外,异常对象可以调用以下方法得到或输出有关异常的信息:

public String getMessage();
public void printStackTrace();
public String toString();
  • try-catch语句

将可能出现的一场操作放在try部分,一旦try部分抛出异常对象,那么try部分立刻结束执行,转向执行相应的catch部分。

try{
可能发生异常的语句
}
catch(ExceptionSubClass1 e) {

}
catch(ExceptionSubClass2 e) {

}
  • 自定义异常类

一个方法在声明时可以使用throws关键词声明要产生的若干个异常,并在该方法体中具体给出产生异常的操作。如下:

public void income(int in,int out) throws BankException {
if(in<=0||out>=0||in+out<=0) {
throw new BankException(in,out); //方法抛出异常,导致方法结束
}
int netIncome=in+out;
System.out.printf("本次计算出的纯收入是:%d元\n",netIncome);
money=money+netIncome;
}

4.断言

在代码调试阶段中,断言语句一般用于程序不准备通过捕获异常来处理的错误。

  • 断言语句有以下两种格式:

    assert booleanExpression;

    若表达式为真,程序从断言语句处继续执行,否则程序从断言语句处停止执行。

assert booleanExpression:messageException;

与上一种类似,,另外的输出messageException表达式的值。

  • java -ea mainClass 启用断言语句

第十章

1. File类

  • 文件的属性

public String getName() 获取文件的名字。

public boolean canRead() 判断文件是否是可读的。

public boolean canWrite() 判断文件是否可被写入。

public boolean exits() 判断文件是否存在。

public long length() 获取文件的长度(单位是字节)。

public String getAbsolutePath() 获取文件的绝对路径。

public String getParent() 获取文件的父目录。

public boolean isFile() 判断文件是否是一个普通文件,而不是目录。

public boolean isDirectroy() 判断文件是否是一个目录。

public boolean isHidden() 判断文件是否是隐藏文件。

public long lastModified() 获取文件最后修改的时间。

  • 目录

创建目录 public boolean mkdir()

public String[] list() 用字符串形式返回目录下的全部文件。

public File [] listFiles() 用File对象形式返回目录下的全部文件。

public String[] list(FilenameFilter obj) 用字符串形式返回目录下的指定类型的所有文件。

public File [] listFiles(FilenameFilter obj) 用File对象形式返回目录下的指定类型所有文件。

上述两方法的参数FilenameFilter是一个接口,该接口有一个方法:

public boolean accept(File dir,String name);

  • 文件的创建与删除

File file=new File("c:\\myletter","letter.txt");

如果c:\myletter目录中没有名字为letter.txt文件,

文件对象file调用方法

public boolean createNewFile();

文件对象调用方法 public boolean delete()

可以删除当前文件,

例如:file.delete();

  • 运行可执行文件

用Runtime 类声明一个对象( Runtime类在java.lang包)

Runtime ec;

然后使用该类的getRuntime()静态方法创建这个对象:

ec=Runtime.getRuntime();

ec可以调用exec(String command)方法打开本地机的可执行文件或执行一个操作。

2.文件字节输入流

使用输入流通常包括4个基本步骤:

(1)设定输入流的源
(2)创建指向源的输入流
(3)让输入流读取源中的数据
(4)关闭输入流。

3.文件字节输出流

(1)给出输出流的目的地
(2)创建指向目的地的输出流
(3)让输出流把数据写入到目的地
(4)关闭输出流。

4.文件字符输入、输出流

(1)Reader类提供的read方法以字符为单位顺序地读取源中的数据。

int read():

int read(char b[]):

int read(char b[], int off, int len):

void close():

long skip(long numBytes):

(2) Writer流以字符为单位顺序地写文件,每次调用write方法就顺序地向目的地写入内容。 Writer类有如下常用的方法。

void write(int n): 向输出流写入一个字符。

void write(byte b[]): 向输出流写入一个字符数组。

void write(byte b[],int off,int length): 从给定字符数组中起始于偏移量off处取len个字符写到输出流。

void close(): 关闭输出流。

5.缓冲流

(1)BufferedReaderBufferedWriter类创建的对象称作缓冲输入、输出流。二者的源和目的地必须是字符输入流和字符输出流。

构造方法:

BufferedReader(Reader in);

BufferedWriter (Writer out);

(2)BufferedReaderBufferedWriter类读写文件的方法:

readLine() 读取文本行

write(String s,int off,int len) 把字符串s写到文件中

newLine(); 向文件写入一个回行符

6.随机流

使用RandomAccessFile类来创建一个随机访问文件流。RandomAccessFile类创建的流的指向既可以作为源也可以作为目的地。

构造方法

RandomAccessFile(String name,String mode) ;

RandomAccessFile(File file,String mode) ;

相关方法:

seek(long a) 定位RandomAccessFile流的读写位置

getFilePointer() 获取流的当前读写位置

7.数组流

(1)字节数组流

字节数组输入流ByteArrayInputStream和字节数组输出流ByteArrayOutputStream分别使用字节数组作为流的源和目标。

ByteArrayInputStream构造方法及常用方法

ByteArrayInputStream(byte[] buf);

ByteArrayInputStream(byte[] buf,int offset,int length);

public int read();顺序地从源中读出一个字节

public int read(byte[] b,int off,int len);顺序地从源中读出参数len指定的字节数

ByteArrayOutputStream流构造方法及常用方法

ByteArrayOutputStream();

ByteArrayOutputStream(int size);

public void write(int b); 顺序地向缓冲区写入一个字节

public void write(byte[] b,int off,int len); 将参数b中指定的len个字节顺序地写入缓冲区

public byte[] toByteArray(); 返回输出流写入到缓冲区的全部字节

(2)字符数组

CharArrayReaderCharArrayWriter类是字符数组流,使用字符数组作为流的源和目标。

8.数据流

DataInputStreamDataOutputStream类创建的对象称为数据输入流和数据输出流。

构造方法:

DataInputStream(InputStream in)创建的数据输入流指向一个由参数in指定的底层输入流

DataOutputStream(OutnputStream out)创建的数据输出流指向一个由参数out指定的底层输出流

9.对象流

ObjectInputStreamObjectOutputStream类创建的对象称为对象输入流和对象输出流。

它的构造方法是:

ObjectInputStream(InputStream in)

ObjectOutputStream(OutputStream out)

相关方法:

writeObject(Object obj) 将一个对象obj写入到一个文件

readObject() 读取一个对象到程序中

所谓序列化:一个类如果实现了Serializable接口,那么这个类创建的对象就是所谓序列化的对象。

10.使用Scanner解析文件

(1)使用默认分隔标记解析文件

创建Scanner对象,并指向要解析的文件,例如:

File file = new File("hello.java");

Scanner sc = new Scanner(file);

sc将空白作为分隔标记

(2)使用正则表达式作为分隔标记解析文件 :

创建Scanner对象,指向要解析的文件,并使用useDelimiter方法指定正则表达式作为分隔标记。

**11.文件对话框

**

构造方法JFileChooser()创建初始不可见的有模式的文件对话框。然后文件对话框调用下述2个方法:

showSaveDialog(Component a);

showOpenDialog(Component a);

都可以使得对话框可见,只是呈现的外观有所不同,showSaveDialog方法提供保存文件的界面,showOpenDialog方法提供打开文件的界面。

上述两个方法中的参数a指定对话框可见时的位置,当a是null时,文件对话框出现在屏幕的*;如果组件a不空,文件对话框在组件a的正前面居中显示。

11.带进度条的输入流

如果读取文件时希望看见文件的读取进度可以使用javax.swing包提供的输入流类:

ProgressMonitorInputStream

它的构造方法是:

ProgressMonitorInputStream(Conmponent c,String s,InputStream);

12.文件锁

FileLockFileChannel类处理Java提供的文件锁功能。它们分别在java.niojava.nio.channels包中。

输入、输出流读写文件时可以使用文件锁。

RondomAccessFile创建的流在读写文件时使用文件锁的步骤如下:

(1)先使用RondomAccessFile流建立指向文件的流对象,该对象的读写属性必须是rw,例如:

RandomAccessFile input=new
RandomAccessFile("Example.java","rw");

(2)input流调用方法getChannel()获得一个连接到地层文件的FileChannel对象(信道),例如

FileChannel channel=input.getChannel();

(3)信道调用tryLock()lock()方法获得一个FileLock(文件锁)对象,这一过程也称作对文件加锁.

例如:FileLock lock=channel.tryLock();

教材学习中的问题和解决过程

  • 问题1:
board.showMess(new OutputAlphabet()
//向参数传递OutputAlphabet的匿名子类对象
{ public void output()
{ for(char c='α';c<='ω';c++) //输出希腊字母
System.out.printf("%3c",c);
}
}
);

中,对于匿名类的使用格式存有疑惑

  • 问题1解决方案:经过比较书中的范例和使用规范后得知,匿名类的使用和描述紧跟在声明之后,即使是在当作参数时。

代码调试中的问题和解决过程

  • 问题1:在IDEA中调试书中Example7_6时无法正确开启断言语句。

    20175212童皓桢 《Java程序设计》第六周学习总结
  • 问题1解决方案:发现班课中有同学与我有相同问题,并找到了解决方法:
run->configrations->VM options:-ea

20175212童皓桢 《Java程序设计》第六周学习总结

之后成功调试并启用assert语句

20175212童皓桢 《Java程序设计》第六周学习总结

代码托管

20175212童皓桢 《Java程序设计》第六周学习总结

上周考试错题总结

  • 错题一:如果有以下程序片段
interface Some{

 void dosome ();

}

class SomeImpl implements Some {

 public void dosome(){

   System.out.println("做一些事");

 }

}

public class Main {

 public static void main (String [] args) {

  Some s= new SomeImpl();

  s.dosome ();

 }

}

以下描述正确的是

A

.

编译失败

B . 显示“做一些事”

C

.

发生ClassCastException

D

.

执行时不显示任何信息

原因和分析:对接口的理解不很到位。在此题中简单的将接口Some作为父类,并最后调用在子类中重写的方法即可。

结对及互评

评分标准

  1. 正确使用Markdown语法(加1分):

    • 不使用Markdown不加分
    • 有语法错误的不加分(链接打不开,表格不对,列表不正确...)
    • 排版混乱的不加分
  2. 模板中的要素齐全(加1分)

    • 缺少“教材学习中的问题和解决过程”的不加分
    • 缺少“代码调试中的问题和解决过程”的不加分
    • 代码托管不能打开的不加分
    • 缺少“结对及互评”的不能打开的不加分
    • 缺少“上周考试错题总结”的不能加分
    • 缺少“进度条”的不能加分
    • 缺少“参考资料”的不能加分
  3. 教材学习中的问题和解决过程, 一个问题加1分

  4. 代码调试中的问题和解决过程, 一个问题加1分

  5. 本周有效代码超过300分行的(加2分)

    • 一周提交次数少于20次的不加分
  6. 其他加分:

    • 周五前发博客的加1分
    • 感想,体会不假大空的加1分
    • 排版精美的加一分
    • 进度条中记录学习时间与改进情况的加1分
    • 有动手写新代码的加1分
    • 课后选择题有验证的加1分
    • 代码Commit Message规范的加1分
    • 错题学习深入的加1分
    • 点评认真,能指出博客和代码中的问题的加1分
    • 结对学习情况真实可信的加1分
  7. 扣分:

    • 有抄袭的扣至0分
    • 代码作弊的扣至0分
    • 迟交作业的扣至0分

点评模板:

  • 博客中值得学习的或问题:

    • 对书上的内容有总结和自己的理解
    • 可以多尝试调试代码,发现问题
  • 代码中值得学习的或问题:

  • 基于评分标准,我给本博客打分:13分。

    得分情况如下:正确使用Markdown语法(加1分),模板中的要素齐全(加1分)教材学习中的问题和解决过程, 两个问题加2分,本周有效代码超过300分行的(加2分),感想,体会不假大空的加1分排版精美的加一分

    进度条中记录学习时间与改进情况的加1分

    有动手写新代码的加1分

    代码Commit Message规范的加1分

    错题学习深入的加1分

    点评认真,能指出博客和代码中的问题的加1分

    结对学习情况真实可信的加1分

点评过的同学博客和代码

  • 本周结对学习情况
    • 20175227
    • 结对学习内容
      • 本周教材对于第七章、第十章的知识进行学习
      • 合作写出了四则运算练习器程序的第一阶段任务
  • 上周博客互评情况

其他(感悟、思考等,可选)

  • 本周和结对伙伴初步设计出了四则运算练习器,扩展了如调用eval方法,getPercentInstance方法等知识
  • 通过对教材的学习,了解了两个特殊类的使用方法及输入、输出流相关知识

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 6/6 1/1 20/20
第二周 245/251 1/2 18/38
第三周 633/884 1/3 22/60
第四周 305/1189 1/4 30/90
第五周 410/1599 3/7 30/120
第六周 1135/2734 3/10 30/150

尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。

耗时估计的公式

:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

参考:软件工程软件的估计为什么这么难软件工程 估计方法

(有空多看看现代软件工程 课件

软件工程师能力自我评价表
)

参考资料

上一篇:20175212童皓桢 《Java程序设计》第11周学习总结


下一篇:20155220java实验二 面向对象程序设计 实验报告