1. 程式人生 > ># 2019-2020-4 《Java 程序設計》第六周總結

# 2019-2020-4 《Java 程序設計》第六周總結

創建組 通信 point inter 兩個 類繼承 NPU set sdi

2019-2020-4 《Java 程序設計》第六周知識總結

第七章:內部類與異常類

1.內部類

(1)類可以有兩種重要的成員:成員變量和方法,類還可以有一種成員:內部類。

(2)java支持在一個類中聲明另一個類,這樣的類稱為內部類,而包含內部類的類稱為內部類的外部類。聲明內部類如同在類中聲明方法和成員變量一樣,一個類把內部類看作是自己的成員.內部類的外嵌類的成員變量在內部類中仍然有效,內部類中的方法也可以調用外嵌類中的方法。

(3)內部類的類體中不可以聲明類變量和方法,外嵌類的類體中可以用內部類聲明對象,作為外嵌類的成員。

2.匿名類

a) 和類有關的匿名類
當使用類創建對象時,程序允許把類體與對象的創建組合在一起,也就是說,類創建對象時,除了構造方法還有類體,此類體被認為是該類的一個子類去掉類聲明後的類體,稱作匿名類。匿名類就是一個子類,由於無名可用,所以不可能用匿名類聲明對象,但卻可以直接用匿名類創建對象。

註:(1)匿名類可以繼承父類的方法也可以重寫父類的方法。使用匿名類時,必然是在某個類中直接用匿名類創建對象,因此匿名類一定是內部類,匿名類可以訪問外嵌類中的成員變量和方法,匿名類的類體中不可以聲明static成員變量和static方法。

(2)盡管匿名類創建的對象沒有經歷類聲明的步驟,但匿名對象的引用必須傳遞一個匹配的參數,匿名類的主要途徑就是向方法的參數傳值。

(3)如果匿名類繼承了類的方法,x就調用繼承的方法,如果匿名類重寫了父類的方法,x就調用重寫的方法。

b) 和接口相關的匿名類

3.異常類

(1)異常的概念
異常是指當程序中某些地方出錯時創建的一種特殊的運行時錯誤對象。Java創建異常對象後,就發送給Java程序,即拋出異常(throwing an exception)。程序捕捉到這個異常後,可以編寫相應的異常處理代碼進行處理。使用異常處理可以使得程序更加健壯,有助於調試和後期維護。

(2)異常處理
Java異常通常在調用某些方法不一定完全成功時拋出,針對拋出的異常程序需要給出相應的處理,這稱為異常處理。異常處理分為三個部分:捕捉異常、程序流程的跳轉和異常處理語句塊。當一個異常被拋出時,程序中有專門的語句來接收這個被拋出的異常對象,這個過程就是捕捉異常;當一個異常類的對象被捕捉或接收後,用戶程序就會發生流程跳轉,系統中止程序運行,跳轉到異常處理語句的執行,或者直接跳出系統,回到操作系統狀態下。在Java語言中,try語句用來啟動Java的異常處理機制,通常是可能拋出異常的語句的調用;而catch語句進行捕捉和處理異常,有時添加finally語句塊,finally中的語句是正常執行或者處理異常之後必須執行的語句。語句格式如下:

try
{
語句塊;
}
catch(異常類 異常類參數名)
{
異常處理語句塊;
}
finally
{
try或者catch語句完畢後必須執行的語句(通常用於關閉文件
流對象或者數據庫對象等);
}

(3)用戶自定義異常
用戶自定義異常用來處理用戶應用程序中的特定邏輯的運行錯誤,用戶自定義的異常類通常繼承自Exception類。

第十章:輸入、輸出流

一、理解數據流
流一般分為輸入流(Input Stream)和輸出流(Output Stream)兩類。

二、Java的標準數據流
標準輸入輸出指在字符方式下(如DOS),程序與系統進行交互的方式,分為三種:
標準輸入studin,對象是鍵盤。
標準輸出stdout,對象是屏幕。
標準錯誤輸出stderr,對象也是屏幕。

三、字節流方法
字節流:從InputStream和OutputStream派生出來的一系列類。這類流以字節(byte)為基本處理單位。
InputStream、OutputStream
FileInputStream、FileOutputStream
PipedInputStream、PipedOutputStream
ByteArrayInputStream、ByteArrayOutputStream
FilterInputStream、FilterOutputStream
DataInputStream、DataOutputStream
BufferedInputStream、BufferedOutputStream

1、InputStream 和OutputStream
read():從流中讀入數據
skip():跳過流中若幹字節數
available():返回流中可用字節數
mark():在流中標記一個位置
reset():返回標記過得位置
markSupport():是否支持標記和復位操作
close():關閉流
int read() :從輸入流中讀一個字節,形成一個0~255之間的整數返回(是一個抽象方法)。
int read(byte b[]) :讀多個字節到數組中。
int read(byte b[], int off, int len):從輸入流中讀取長度為len的數據,寫入數組b中從索引off開始的位置,並返回讀取得字節數。
write(int b) :將一個整數輸出到流中(只輸出低位字節,抽象)
write(byte b[]) :將字節數組中的數據輸出到流中
write(byte b[], int off, int len) :將數組b中從off指定的位置開始,長度為len的數據輸出到流中
flush():刷空輸出流,並將緩沖區中的數據強制送出
close():關閉流

2、管道流
管道用來把一個程序、線程和代碼塊的輸出連接到另一個程序、線程和代碼塊的輸入。java.io中提供了類PipedInputStream和PipedOutputStream作為管道的輸入/輸出流
管道輸入流作為一個通信管道的接收端,管道輸出流則作為發送端。管道流必須是輸入輸出並用,即在使用管道前,兩者必須進行連接
管道輸入/輸出流可以用兩種方式進行連接:
在構造方法中進行連接
PipedInputStream(PipedOutputStream pos);
PipedOutputStream(PipedInputStream pis);
通過各自的connect()方法連接
在類PipedInputStream中,connect(PipedOutputStream
在類PipedOutputStream中,connect(PipedInputStream pis);

3、數據流
DataInputStream和DataOutputStream
在提供了字節流的讀寫手段的同時,
以統一的通用的形式向輸入流中寫入boolean,int,long,double等基本數據類型,並可以在次把基本數據類型的值讀取回來。
提供了字符串讀寫的手段。
分別實現了DataInput和DataOutput接口
聲明類: Public class DataInputStream extends filterInputStream implements DataInput

4、對象流
對象的持續性(Persistence)
能夠紀錄自己的狀態一邊將來再生的能力,叫對象的持續性
對象的串行化(Serialization)
對象通過寫出描述自己狀態的數值來記錄自己的過程叫串行化。串行化的主要任務是寫出對象實例變量的數值,如果變量是另一個對象的引用,則引用的對象也要串行化。這個過程是遞歸的
對象流
能夠輸入輸出對象的流稱為對象流。
可以將對象串行化後通過對象輸入輸出流寫入文件或傳送到其它地方
在java中,允許可串行化的對象在通過對象流進行傳輸。只有實現Serializable接口的類才能被串行化, Serializable接口中沒有任何方法,當一個類聲明實現Serializable接口時,只是表明該類加入對象串行化協議
要串行化一個對象,必須與一定的對象輸出/輸入流聯系起來,通過對象輸出流將對象狀態保存下來(將對象保存到文件中,或者通過網絡傳送到其他地方) ,再通過對象輸入流將對象狀態恢復
類ObjectOutputStream和ObjectInputStream分別繼承了接口ObjectOutput和ObjectInput,將數據流功能擴展到可以讀寫對象,前者用writeObject()方法可以直接將對象保存到輸出流中,而後者用readObject()方法可以直接從輸入流中讀取一個對象

四、字符流的方法
1、 字符流:從Reader和Writer派生出的一系列類,這類流以16位的Unicode碼表示的字符為基本處理單位。
Reader、Writer
InputStreamReader、OutputStreamWriter
FileReader、FileWriter
CharArrayReader、CharArrayWriter
PipedReader、PipedWriter
FilterReader、FilterWriter
BufferedReader、BufferedWriter
StringReader、StringWriter

2、Reader類和Writer類
在JDK1.1之前,java.io包中的流只有普通的字節流(以byte為基本處理單位的流),這種流對於以16位的Unicode碼表示的字符流處理很不方便。從JDK1.1開始, java.io包中加入了專門用於字符流處理的類,它們是以Reader和Writer為基礎派生的一系列類
同類InputStream和OutputStream一樣,Reader和Writer也是抽象類,只提供了一系列用於字符流處理的接口。它們的方法與類InputStream和OutputStream類似,只不過其中的參數換成字符或字符數組
1、Reader類
? void close()
? void mark(int readAheadLimit)
? boolean markSupported() :
? int read()
? int read(char[] cbuf)
? int read(char[] cbuf, int off, int len)
? boolean ready()
? void reset()
? long skip(long n)
2、Writer類
? void close()
? void flush()
? void write(char[] cbuf)
? void write(char[] cbuf, int off, int len)
? void write(int c)
? void write(String str)
? void write(String str, int off, int len)

五、、文件操作類的方法 File類
1、File類聲明如下:
public class File ectends Object implements Serializable,Comparable
構造方法:
public File(String pathname)
public File(File patent,String child)
public File(String patent,String child)
2、文件名的處理
String getName( ); //得到一個文件的名稱(不包括路徑)
String getPath( ); //得到一個文件的路徑名
String getAbsolutePath( );//得到一個文件的絕對路徑名
String getParent( ); //得到一個文件的上一級目錄名
String renameTo(File newName); //將當前文件名更名為給定文件的完整路徑
3、文件屬性測試
boolean exists( ); //測試當前File對象所指示的文件是否存在
boolean canWrite( );//測試當前文件是否可寫
boolean canRead( );//測試當前文件是否可讀
boolean isFile( ); //測試當前文件是否是文件(不是目錄)
boolean isDirectory( ); //測試當前文件是否是目錄
4、普通文件信息和工具
long lastModified( );//得到文件最近一次修改的時間
long length( ); //得到文件的長度,以字節為單位
boolean delete( ); //刪除當前文件
5、目錄操作
boolean mkdir( ); //根據當前對象生成一個由該對象指定的路徑
String list( ); //列出當前目錄下的文件
6、文件過濾器
類FilterInputStream和FilterOutputStream分別對其他輸入/輸出流進行特殊處理,它們在讀/寫數據的同時可以對數據進行特殊處理。另外還提供了同步機制,使得某一時刻只有一個線程可以訪問一個輸入/輸出流。
類FilterInputStream和FilterOutputStream分別重寫了父類InputStream和OutputStream的所有方法,同時,它們的子類也應該重寫它們的方法以滿足特定的需要
? 要使用過濾流,首先必須把它連接到某個輸入/輸出流上,通常在構造方法的參數中指定所要連接的流:
– FilterInputStream(InputStream in);
– FilterOutputStream(OutputStream out);
註:這兩個類是抽象類,構造方法也是保護方法
類BufferedInputStream和BufferedOutputStream實現了帶緩沖的過濾流,它提供了緩沖機制,把任意的I/O流“捆綁”到緩沖流上,可以提高讀寫效率
? 在初始化時,除了要指定所連接的I/O流之外,還可以指定緩沖區的大小。缺省大小的緩沖區適合於通常的情形;最優的緩沖區大小常依賴於主機操作系統、可使用的內存空間以及機器的配置等;一般緩沖區的大小為內存頁或磁盤塊等地整數倍,如8912字節或更小。
– BufferedInputStream(InputStream in[, int size])
– BufferedOutputStream(OutputStream out[, int size])

7、文件對話框
隨機文件操作
於InputStream 和OutputStream 來說,它們的實例都是順序訪問流,也就是說,只能對文件進行順序地讀/寫。隨機訪問文件則允許對文件內容進行隨機讀/寫。在java中,類 RandomAccessFile 提供了隨機訪問文件的方法。類RandomAccessFile的聲明為:
public class RandomAccessFile extends Object implements DataInput, DataOutput
File:以文件路徑名的形式代表一個文件
FileDescriptor:代表一個打開文件的文件描述
FileFilter & FilenameFilter:用於列出滿足條件的文件
File.list(FilenameFilter fnf)
File.listFiles(FileFilter ff)
FileDialog.setFilenameFilter(FilenameFilter fnf)
? FileInputStream & FileReader:順序讀文件
? FileOutputStream & FileWriter:順序寫文件
? RandomAccessFile:提供對文件的隨機訪問支持
類RandomAccessFile則允許對文件內容同時完成讀和寫操作,它直接繼承Object,並且同時實現了接口DataInput和DataOutput,提供了支持隨機文件操作的方法
DataInput和DataOutput中的方法
? readInt(), writeDouble()…
int skipBytes(int n):將指針鄉下移動若幹字節
length():返回文件長度
long getFilePointer():返回指針當前位置
void seek(long pos):將指針調到所需位置
void setLength(long newLength):設定文件長度
構造方法:
RandomAccessFile(File file, String mode)
RandomAccessFile(String name, String mode)
mode 的取值
– “r” 只讀. 任何寫操作都將拋出IOException。
– “rw” 讀寫. 文件不存在時會創建該文件,文件存在時,原文件內容不變,通過寫操作改變文件內容。
– “rws” 同步讀寫. 等同於讀寫,但是任何協操作的內容都被直接寫入物理文件,包括文件內容和文件屬性。
– “rwd” 數據同步讀寫. 等同於讀寫,但任何內容寫操作都直接寫到物理文件,對文件屬性內容的修改不是這樣。

六、Java中Scanner的用法
Scanner是SDK1.5新增的一個類,可是使用該類創建一個對象.
Scanner reader=new Scanner(System.in);
然後reader對象調用下列方法(函數),讀取用戶在命令行輸入的各種數據類型: next.Byte(),nextDouble(),nextFloat,nextInt(),nextLin(),nextLong(),nextShot()
上述方法執行時都會造成堵塞,等待用戶在命令行輸入數據回車確認.例如,擁護在鍵盤輸入12.34,hasNextFloat()的值是true,而hasNextInt()的值是false. NextLine()等待用戶輸入一個文本行並且回車,該方法得到一個String類型的數據。

2019-2020-4《Java 程序設計》第六周學習總結

1.通過第六周的學習,利用教材和老師在藍墨雲上的一些教學視頻以及通過老師和同學的博客以及一些課外資料,充分學習了第七、十章的內容,學習的內容有:內部類,匿名類,異常類,斷言,File類,文件字節輸入流,文件字節輸出流,文件字符輸入、輸出流,緩沖流,隨機流,數組流,數據流,對象流,序列化與對象克隆,使用Scanner解析文件,文件對話框,帶進度條的輸入流,文件鎖。由於本周的學習任務較重,對這兩章學習內容並不是十分理解,但通過學習七、十章內容,會使得編程更加便捷、方便,總體來說,自我感覺這兩章內容相對較難。

2.通過手打第七、十章代碼,對語法有一定的幫助,並在調試完代碼後上傳至碼雲倉庫,並提交腳本。(由於這兩章例子過多,博客中體現部分程序運行截圖)

部分程序運行截圖:

技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片

腳本截圖:

技術分享圖片

註:我的碼雲鏈接:https://gitee.com/zzm-zcc/zhang_zhi_min

2019-2020-4 《Java 程序設計》第六周練習題生疏題、錯題總結

1、下列關於異常的說法,錯誤的是(AD)

A .Java使用throws拋出一個異常,使用throw聲明方法可能拋出異常。

B .執行System.out.println(3/0);語句會報ArithmeticException異常。

C .Java中的錯誤是以對象的方式呈現為java.lang.Throwable的各種子類實例。

D .方法parseInt()在執行過程中可能拋出DataFormatException異常。

2、下列關於斷言的說法,錯誤的是(D)

A .斷言語句通常用於調試代碼。

B .如果使用assert booleanException:messageException;形式的斷言語句,當booleanException的值是false時,程序從斷言語句處停止執行,並輸出messageException的值。

C .在調試程序時,可以使用-ea啟動斷言語句。

D .String n = new AssertDemo().getName("Magical");

3、下列無法通過編譯的是(C)

class OutClass {
int m = 1;
static float x;             //A
class InnerClass {
   int m =12;            //B
   static float n =20.89f;   //C 
   InnerClass(){
   }
   void f() {
      m = 100;
   }
}
void cry() {
  InnerClass tom = new InnerClass(); //D
}
}

A .A

B .B

C .C

D .D

4、調用線程的interrupt()方法 ,會拋出哪些異常對象?(ADE)

A .ClosedByInterruptException

B .IllegalStateException

C .RuntimeException

D .InterruptedException

E .SecurityException

5、如果某個方法的參數是接口類型,那麽可以使用接口名和類體組合創建一個匿名對象傳遞給方法的參數,類體必須要重寫接口中的全部方法。(A)

A .true

B .false

# 2019-2020-4 《Java 程序設計》第六周總結