JAVA核心技術卷I——筆記

一、前言

從頭JAVA,選擇了先從JAVA核心技術這本書,先看的電子版(第七版)的,書是第九版的,卷一已經有很多不一樣了,週六日看(先立個FLAG)。內容基本上都是知識點串記和注意點。

二、筆記

  1. 關於代碼中的static變量或者代碼塊,是要在構造器之前初始化的。
  2. 編譯器通過方法名和參數(方法的簽名),如果方法不爲private、static、final方法(靜態綁定),則默認採用動態綁定(多態性)。
  3. final類和方法不允許被繼承,final類默認爲其類下的方法添加final
  4. 超類的關於比較的說明:
    == 比較基本域 equels 比較對象域 instanceOf 是否屬於同一個類型的類
  5. equals 方法和hashCode方法
  6. Object基類中的toString方法,用來輸出對象所屬的類型和散列碼(hashCode)
  7. arraylist是線程不安全的(多個線程操作同一個ArrayList的時候,可能會出現非期望數據,網上有例子),且在初始化的時候如果,
ArrayList<Object> test = new ArrayList<Object>(100);
test.add(0,new Object);

上述代碼會出錯,因爲這個時候ArrayList的size爲0,100只是代表了ArrayList的初始化大小。

  1. 反射

    1)Class類,在程序運行期間,Java運行時系統始終爲所有的對象維護一個被稱爲運行時的類型標識。這個信息保存着每個對象所屬的類足跡。虛擬機利用運行時信息選擇相應的方法執行方Class.forName(className); 記得弄一個異常捕獲。
    常用方法:
    Class.getName(); //獲取類名
    object.getName.newInstance(); //可以用來快速創建一個類的實例。
    newInstance()//默認調用對象的無參構造方法;
    newInstance(Object[] args); //構造方法的參數。
    利用反射機制能夠打印這個類的相關信息,以及超類等的信息

  2. 可實現多接口,但只能單繼承。(多態的概念)

  3. 對象的深拷貝和淺拷貝:
    如果使用 Object o = new Object(“錢”) Object o1 = 0; 這個時候o1和o是引用的同一對象,所以說如果使用o1修改屬性值,引用對象的克隆(深拷貝)clone是超類Object中的方法。
    Object o = new Object(“錢”); Object o1 = o.clone(); 如果對象內部是基本數據類型的話,修改不會對彼此產生影響;如果對象的內部屬性
    包含其他對象,(如果不是類似於String這樣不可變的)則指向的是同一個子對象。(這個時候是淺拷貝)

  4. 內部類
    使用內部類的原因:
    1) 內部類方法可以訪問該類定義所在的作用域中的數據,包括私有數據
    2) 內部類可以對同一個包中的其他類隱藏起來
    3) 當想要定義一個回調函數且不想編寫大量代碼時,使用內部類更加便捷
    分類:
    成員內部類、靜態內部類、局部內部類、匿名內部類(事件監聽)

  5. 代理:利用代理可以在運行時創建一個實現了一組給定接口的新類。這種功能只有在編譯時無法確定需要實現哪個接口時纔有必要使用。
    代理類的特性: 代理類是在程序運行過程中創建的,一旦被創建,就變成了常規類,與虛擬機中的任何其他類沒有什麼區別。
    所有的代理類都擴展於Proxy類,一個代理類只有一個實例變量—調用處理器,它定義在Proxy的超類中。
    爲了履行代理對象的職責,所需要的任何附加數據都必須存儲在調用處理器中。
    所有的代理類都覆蓋了Object類中的方法toString()、equals和hashCode方法。
    在這裏插入圖片描述

  6. 圖形程序設計(AWT、Java Swing)
    在這裏插入圖片描述
    基本AWT庫採用將處理用戶界面元素的任務委派給每個目標平臺的本地GUI工具箱的方式,由本地GUI工具箱負責用戶界面元素的創建和動作。
    Swing 沒有完全代替AWT,而是基於AWT架構之上。
    在Java中,頂層窗口(就是沒有包含在其他窗口中的窗口)被稱爲框架。在AWT庫中有一個稱爲Frame的類。用於描述頂層窗口。這個類的Swing版本名爲JFame,它擴展與Frame類。JFrame是極少數幾個不繪製在畫布上的Swing組件之一。因此,它的修飾部件(按鈕、標題、圖標等)
    在這裏插入圖片描述
    一個事件源可以發送到多個監聽器,多個事件源也可以到一個監聽器
    佈局管理器:像安卓一樣,頁面的佈局需要頁面佈局管理器。Java用一個非常出色的概念詩選動態佈局:容器內的所有組件都由佈局管理器
    進行定位。Java中的默認佈局管理器是流佈佈局管理器。
    流佈局管理器的特點是在一行水平排列組件,直到沒有足夠的空間爲止,這時開始新的一行。當用戶縮放容器時,佈局管理器自動的調整組件的爲止使其填充可用的空間。
    爲容器設置佈局管理器 SetLayout(LayoutMananger m)
    邊界佈局(BorderLayout),四周不變,縮放的時候改變中間位置的大小。
    網格佈局(GridBagLayout)
    箱式佈局以及重疊佈局等等。

    過濾器: 有文檔過濾器(DocumentFilter)和文件過濾器(FileFilter)可以對文檔,文本內容、格式以及文件進行擴充校驗;
    檢測器: 還有另一種潛在的實用機制,它可以用來警告用戶以避免無效的輸入。可以給任何JComponent附加校驗器(verifier).如果組件失去焦點,就詢問檢驗其。如果校驗器報告組件中的內容是無效的,組件馬上會重獲焦點。因爲,用戶在提供其他輸入之前,必須先修正無效的內容。
    校驗器必須擴展抽象類InputVerifier,並且定義verify方法。文本域的一個簡單檢驗器。

class MyTextVerifer{
      public boolean verify(JComponent component){
             JFormattedTextField field = (JFormattedTextField) component;
             return field.isEditValid();
       }
      }

然而,檢驗器並不是萬無一失的。如果過點擊按鈕,按鈕會在無效組件重新獲得焦點之前通過他的動作監聽器。動作監聽器就會從驗證失敗的組件得到無效的結果。
對話框:
與最流行的窗口系統一樣,AWT也區分模式對話框和無模式對話框,一個模式對話框在用戶結束對它的操作之前,不允許用戶與應用程序其餘的窗口進行交互。模式對話框用於在程序繼續運行之前獲取用戶提供的信息;無模式對話框允許用戶同時在對話框和應用程序其餘的窗口中輸入信息,一個最好的例子就是工具欄。
選項對話框,Swing具有一組簡單的對話框,用於手機用戶的一些簡單信息。JOptionPane有四個用於顯示這些簡單的對話框的靜態方法:
showMessageDialog 顯示一條消息並等待用戶點擊OK 無
showConfirmDialog 顯示一條信息並等待用戶確認 代表被選項的一個整數
showOptionDialog 顯示一條信息並得到用戶在一組選項中的選擇 代表被選項的一個整數
showInputDialog 顯示一條信息並得到用戶的一行輸入 用戶選擇或輸入的字符串
每個對話框可以指定一條消息。消息可以是字符串、圖標、用戶界面組件或者
其他類型的對象(調用toString方法顯示結果字符串)

文件對話框:(JFileChooser) 可以無需指定父容器,且可重用
1)調用setCurrentDiectory方法 設置當前目錄 chooser.setCurrentDiretory()
2) 默認文件名,setSelectedFile方法進行指定
3)允許選擇多個文件,需要調用setMultiSelectionEnable方法
4)如果需要只選擇某一類文件,則需要配置文件過濾器
5)在默認情況下,用戶在文件選擇器中只能選擇文件。如果希望選擇目錄,需要使用
setFileSelectionMode方法:參數爲:JFileChooser.FILE_ONLY(默認值)、
JFIleChooser>DIRECTORIES_ONLY或者
JFileChooser.FILES_AND_DIRECTORIES
6) 調用showOpenDialog或者showSavageDialog方法顯示對話框。必須爲這些調用提供父組件
int result = chooser.showOpenDialog(parent,“選擇按鈕”);
7)使用getSelectedFile()或者getSelectedFiles()方法來獲取得選擇的一個或多個文件這些方法將返回一個File對象或者一組FIle對象。如果需要文件對象名字時,可以調用 getPath方法
在這裏插入圖片描述

8) 文件視圖
顏色選擇器,例如其他類似的還有日期等等
添加監聽器需要提供一個父組件

 chooser.getSelectionModel().addChangeListener( new ChangeListener()
  {
     方法體:
     獲取顏色的方法,chooser.getColor();
  }
  });

  1. jar命令(類似於UNIX tar 命令)
    一般打包命令: jar cvf 文件名1 文件名2 …
    1) jar命令選項:
    jar命令格式:jar {c t x u f }[ v m e 0 M i ][-C 目錄]文件名…
    其中{ctxu}這四個選項必須選其一。[v f m e 0 M i ]是可選選項,文件名也是必須的。
    -c 創建一個jar包
    -t 顯示jar中的內容列表
    -x 解壓jar包
    -u 添加文件到jar包中
    -f 指定jar包的文件名
    -v 生成詳細的報造,並輸出至標準設備
    -m 指定manifest.mf文件.(manifest.mf文件中可以對jar包及其中的內容作一些一設置)
    -0 產生jar包時不對其中的內容進行壓縮處理
    -M 不產生所有文件的清單文件(Manifest.mf)。這個參數與忽略掉-m參數的設置
    -i 爲指定的jar文件創建索引文件
    -C 表示轉到相應的目錄下執行jar命令,相當於cd到那個目錄,然後不帶-C執行jar命令
    在這裏插入圖片描述
    在這裏插入圖片描述

  2. java start web
    將程序(圖形化的基本上是)打包成jar包,然後添加一個文件名對應的.jnlp文件。放到tomcat的webapp文件下,然後在添加一個index.html文件,內容指向這個jnlp文件,運行tomcat啓動成功後,訪問index.html文件即可;java web start 暫時未發現他的用處 !

  3. 應用程序的存儲
    1)屬性映射(property map)是存儲鍵/值對的數據結構。屬性映射經常用來存放配置信息
    有三個特性:
    鍵和值都是字符串;很容易地寫入或從文件讀取
    使用二級緩存表示存放默認值
    在java平臺上,實現屬性映射的類稱爲properties
    Properties settings = new Properties();
    settings.put(“key1”,“value1”);
    可以使用store方法將屬性列表保存到文件中。
    FileOutputStream out = new FileOutputStream(“setting.properties”);
    settings.trore(out,“Test properties”); // 第二個參數是包含在該文件中的註釋
    從文件中加載屬性,可以使用

FileInputStream in = new FileInoutStream(setting.properties);
setting.load(in);

這個東西也是很有用的,比如說通過類加載器,自己主動來加載類時,可以通過這種方式,將類的配置加載進來
properties類繼承於Hashtable類,put方法不檢查放入表中的值是否是一個字符串。
屬性配置文件的優缺點
有點:屬性配置文件可以很快的讀寫的過程
缺點:配置文件不一定和應用程序存儲在同一個位置,因爲存放的地方可能是不可寫的。
例如在一個只讀目錄下或者是在jar文件中
2)多個用戶可能想以不同方式配置同一個應用程序
3) 配置文件不能存放在用戶的主目錄中,因爲某些操作系統(如Windows 9X)沒有主目錄的概念
沒有標準的爲配置文件命名的規則,當用戶安裝了多個java應用程序時,會增加配置文件名字衝突的可能性

Preferences API
能夠解決上面的問題,對於沒有用戶主目錄的操作系統,在Windows上通過保存到註冊表中來實現
在Linux上通過保存到用戶本地來實現

  1. java中的異常:Java語言規範將派生於RuntimeException類或Error類的所有異常稱爲“未檢查異常”,其它異常稱爲“已檢查異常”
    如果子類中重寫了超類的一個方法,那麼,子類方法中聲明的已檢查異常不能超過超類方法中,聲明的異常範圍範圍(子類方法中拋出的異常只能更具體,也就是更小,或者不拋出異常)
    自定義異常類,一般應該包含兩個構造器,一個是默認構造器,另一個是帶有信息信息的構造器
    當捕獲到異常時,可以通過 Throwable exception = e.getCause();方法得到原始異常
    關鍵字,finally :代碼沒有異常將會執行try中的語句,執行完try中的語句就會執行finally中的語句
    ,接着在執行try外面的語句;
    try 語句可以沒有catch語句,這個時候必須有一個finally語句。
    在這裏插入圖片描述

  2. 日誌 :
    日誌主要涉及到處理器,過濾器、格式化器
    slf4j或是java.util.loggin
    在這裏插入圖片描述
    在這裏插入圖片描述

  3. 斷言
    從JDK1.5以後是默認支持斷言的,在默認情況下,斷言是禁用的。可以在運行程序時使用-enablessertions或-ea選項啓用它 : 例如 java - enableassert MyApp需要注意的是,在啓用或禁用斷言時不必重新編譯程序。啓用或禁用斷言時類加載器的功能。當斷言被禁用時,類加載器將跳過斷言代碼,因此,不會降低程序運行速度。
    也可以在某個類或某個保重使用斷言。例如java -ea:MyClass -ea:com.zlc.app
    這條命令將開啓MyClass類以及在com.zlc.app包下的所有的斷言
    -ea將開啓默認包中的所有類的斷言
    也可以用選項 -disableassertions 或-da禁用某個特定類和包的斷言
    java -ea : … da:MyClass MyApp
    有些類不是由類加載器加載,而是由虛擬機加載的。
    斷言只能應用於開發和調試階段
    不一定只有在異常的時候纔可以捕獲堆棧信息,可以通過Thead.dumpStack();
    想要觀察類的加載過程,可以用 -verifybose標誌運行java虛擬機

  4. AWT中的Robot類(可以弄個腳本)
    包含了一些鍵盤敲擊和鼠標點擊等獲得默認的屏幕設備:

 GraphicsEnvironment environment =   GraphicsEnvironment.getLocalGraphicsEnvironment();
  GraphicsDevice screen = environment.getDefaultScreenDevice();

然後構造一個Robot對象 Robot robot = new Robot(screen);
鍵盤敲擊事件 robot.keyPress(KeyEvent.VK_TAB);
釋放 robot.Release(KeyEvent.VK_TAB);
robot.mouseMove(x,y); 鼠標移動,(x,y是絕對屏幕座標系的像素座標)
robot.mousePress(InputEnvent.BUTTON1_MASK); 鼠標點擊
捕獲屏幕截圖,給一個矩形框。

  Rectangle rect = new Rectangle(x,y,width,height);
  BufferedImage image = robot.createScreenCapture(rect);

  1. JDB調試器,現在開發工具都有debug功能,知道名字就行。

  2. 流與文件
    在這裏插入圖片描述
    1)輸入流:一個能讀取字節序列的對象被稱爲輸入流;一個可以寫入字節序列的對象被稱爲輸出流。
    2) InputStream抽象類中的read和write方法都能阻塞一個線程直到字節被正真的讀取或者寫入,這意味着如果流不能立即讀取或寫入,Java就會掛起這個調用的線程。這樣就能夠給其他線程提供機會去做有用的動作,同時這個方法 將一直等待,直到流再次可用爲止。當完成流的讀取或者寫入後,就應該調用close方法關閉它們 ;關閉一個輸出流也可以刷新輸出流佔用的緩存區。
    在這裏插入圖片描述
    在這裏插入圖片描述
    skip(long n)方法,跳過n個字節;
    available()方法,返回可用的未阻塞的字節數。
    mark(int readLimit) 在輸入流的當前位置放一個標記。(不是所有流都支持這個特性)如果從輸入流中讀取的字節多於readlimmit字節,那麼允許忽略這個標記。
    reset()返回最後的標記。在之後調用read方法時將會重讀那些字節。如果目前沒有標記,則流將不會被重置。
    markSupported() 如果流支持標記則返回true。
    flush() 刷新輸出流,即將緩衝區中的所有數據發送到目的地
    close( ) 刷新並關閉輸出流
    FileOutputStream(String name) 新建一個由name指定的文件輸出流。路徑名不是絕對路徑,而是相對於當前的工作路徑;(該方法會自動刪除存在的同名文件)
    FileOutputStream(String name,boolean append) 新建一個由name字符串指定的文件輸出流。路徑名不是絕對路徑,是相對於當前工作路徑,如果append參數爲true,則將數據追加到文件的結尾。存在同名的文件不會被 刪除。
    FileOutputStream(File f)新建一個使用封裝在File對象中的信息的文件輸出流,這個方法會自動刪除人核已經存在的且與f同名的文件。
    BufferedInputStream(InputStream in) 新建一個默認大小的緩衝流。緩衝的輸入流從一個流中讀取字符,而不是每次都引起對設備的訪問。當緩衝區空時,一個新的數據塊將會被讀入緩衝區。
    BuffeedInputStream(InputStram in,int n),n指定大小的緩存

  3. 隨機存取文件流
    RandomAccessFile流類能夠在文件的任何位置查找或者寫入數據。它同時實現了DataInput和DataOutput接口。磁盤文件可以隨機
    存取,但是來自網絡的數據流就不行了。打開一個歲建存取文件,要麼進行只讀操作,要麼進行讀寫操作。
    可以通過構造器的第二個參數帶入“r”“rw”指定相應的操作。當打開一個現有文件作爲RandomAccessFile時,原來的文件不會被刪除。

RandomAccessFile(String file ,String mode)
RandomAccessFile(File file, String mode)
mode "r"表示只讀模式,“rw”表示讀/寫模式,“rws”表示對於每一次的更新採用同步方式將數據或元數據寫入磁盤的讀/寫模式,“rwd”表示採用同步模式將數據邪惡如磁盤的讀/寫模式

long getFilepointer() 返回文件指針的當前位置

void seek(Long pos)將文件指針的位置設定爲從文件開始的pos字處。

long length() 返回文件的長度(以字節計)

字符集,這個以前看過一篇博客 寫的很好

  1. 文本輸出

進行文本輸出時,應該使用PrintWrite.一個PrintWriter必須與一個目標writer相結合
PrintWriter out= new PrintWriter(new Filewriter(“employee.txt”));
PrintWriter out = new PrintWriter(new FileOutputStream(“employee.txt”));

  1. 文本輸入
    當以二進制寫入數據時,應當使用DataOutputStream; 當以文本格式寫入數據時,應當使用PrintWriter.

  2. ZIP文件流
    每個ZIP文件都有頭文件,其中包含了諸如文件名和使用的壓縮方法等信息,可以使用ZipInoutStream類讀取一個ZIP文件
    ZipInputStream(InputStream in) 這個構造器創建了一個ZipInputStream,它允許從給定的InputStream內讀取數據
    ZipEntry getNextEntry() 返回下一條目的ZipEntry對象,如果沒有更多的條目的話,返回null
    void closeEntry() 關閉ZIP文件中當前打開的條目。隨後可以使用getNextEntry()讀取下一條目。

ZipOutputStream(OutputStream out) 這個構造器創建了一個ZipOutputStream內寫入壓縮數據
void putNextEntry(ZipEntry ze) 將給定的ZipEntry的信息寫入流中並且爲數據定位流。隨後可以使用
write()把數據寫入流中。
void closeEntry() 關閉ZIP文件中目前打開的條目。使用putNextEntry方法開始對下一條目進行操作。
void setLevel(int level) 壓縮級別,從0(NO_COMPRESSION,即沒有壓縮)到9(BEST_COMPRESSION,最佳壓縮)
void setMethod(int method)對於該ZipOutputStream中的全部沒有指定壓縮方法的條目,設置默認的壓縮方法。
menthod 壓縮方法,是DEFLATED或者STORED

  1. StringBuilder類和StringBuffer類
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
  2. 對象流(ObjectInputStream/ObjectoutputStream)
    對於任何需要在對象流中存儲和恢復的類必須實現Serializable接口,該接口沒有方法,所以不需要要對自己的類進行任何修改,和Cloneable接口很相似。然而,要一個類能夠被克隆,仍然必須覆蓋Object類的clone方法。要讓一個類能夠序列化,則不需要做其他的任何事。
    void writeObject(Object obj) 將指定的對象寫入ObjectOutputStream。這個方法將保存
    對象的類、類的簽名以及該類及其超類的非靜態、非臨時的域的值。
    void readObject()
    在這裏插入圖片描述
    在這裏插入圖片描述
  3. 關於序列化和反序列化
    所有的對象(包括數組和字符串)以及類描述符在保存到輸出文件時,都會獲得一個序列號。因爲每個被保存的對象都會分配到一個唯一的序列號(從00 7E 00 00開始),這個處理流程被稱爲序列化。
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
  4. 在這裏插入圖片描述
  5. 在這裏插入圖片描述

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

  1. 在這裏插入圖片描述

在這裏插入圖片描述

文件鎖(lock()方法和tryLock()方法)
FlieChannel fileChannel = new FileChannel(“a.txt”);
FileLock lock = lock.lock();
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章