2018年12月26日 星期三

Java SE 入門教學 - 圖形介面開發

更新時間:12/26/2018

前言

人是視覺動物(誤) 感性的物種,擁有獨自的喜好,看順眼與不順眼都很主觀,但唯一相同的是直覺性地操作工具,當接觸到未知的工具時,總是從看得見得開始摸索,並慢慢發覺隱藏在背後的功能,最後可以非常靈活使用工具。

程式設計師生產出來的產品也是一樣,如果一個系統只能使用文字介面操作,那它的使用對象一定是"工程師",一般使用者可不買單這種純文字的操作,操作一個功能還要查找要使用那個命令,這實在是太麻煩了!

圖形使用者介面(Graphical User Interface, GUI)是指採用圖形方式顯示的電腦操作用戶介面。與早期電腦使用的命令列介面相比,圖形介面對於使用者來說在視覺上更易於接受,以「各種美觀、而不單調的視覺訊息」提示使用者「狀態的改變」,勢必比純文字來得精彩。

2018年12月25日 星期二

Java SE 入門教學 - 執行緒(2)

更新時間:12/25/2018

前言

在前篇 執行緒(1) 初次介紹了執行緒,並提出執行緒的競速情況(Race Condition)。在此篇文章會介紹簡單、靈活地操作執行緒,至於更深入的控制執行緒的剖析,將不在此篇討論。

在執行緒中的"鎖"提供了兩種主要特性:互斥(mutual exclusion)和可見性(visibility)。

互斥即一次只允許一個執行緒持有某個特定的鎖,因此可使用該特性實作對共享數據的協調訪問協議,這樣,一次就只有一個執行緒能夠使用該共享數據。

可見性要更加複雜一些,它必須確保釋放鎖之前對共享數據做出更改,對於隨後獲得該鎖的另一個執行緒是可見的。如果沒有同步機制提供的這種可見性保證,執行緒看到的共享變數可能是修改前的值或不一致的值,這將引發許多嚴重問題。

2018年12月24日 星期一

Java SE 入門教學 - 執行緒(1)

更新時間:12/24/2018

前言

以前電腦的 CPU 只有單一實體核心,而現在電腦的 CPU 都是實體多顆核心,能夠讓作業系統同時處理許多程序(Process)與執行緒(Thread),使得應用程式充分利用 CPU 資源。此篇文章是 Java (多)執行緒的一個入門,其實 Java 裡頭的執行緒完全可以寫成一本書了!這邊就是如何在 Java 中簡單使用(多)執行緒,並介紹(多)執行緒產生的後遺症。

執行緒是作業系統能夠進行運算排程的最小單位。它被包含在程序之中,是程序中的實際運作單位。一條執行緒指的是程序中一個單一順序的控制流,一個程序中可以並行多個執行緒,每條執行緒並列執行不同的任務。

為什麼使用執行緒?

在 Java 程序中使用執行緒有許多原因。如果您使用 Swing、servlet、RMI 或 Enterprise JavaBeans(EJB)技術,您也許沒有意識到您已經在使用執行緒了。使用執行緒的一些原因是它們可以幫助:

使 UI 響應更快

事件驅動的 UI 工具箱(如 AWT 和 Swing)有一個事件執行緒,它處理 UI 事件,如按下鍵盤或點擊滑鼠。 AWT 和 Swing 程序把事件偵聽器與 UI 物件連接。當特定事件(如單擊了某個按鈕)發生時,這些偵聽器會得到通知。事件偵聽器是在 AWT 事件執行緒中調用的。 如果事件偵聽器要執行持續很久的任務,如檢查一個大文檔中的拼寫,事件執行緒將忙於運行拼寫檢查器,所以在完成事件偵聽器之前,就不能處理額外的 UI 事件。這就會使程序看來似乎停滯了,讓用戶不知所措。 要避免使UI 延遲響應,事件偵聽器應該把較長的任務放到另一個執行緒中,這樣 AWT 執行緒在任務的執行過程中就可以繼續處理 UI 事件(包括取消正在執行的長時間運行任務的請求)。

利用多處理器(MultiProcessor, MP)系統

多處理器(MP)系統比過去更普及了。以前只能在大型數據中心和科學計算設施中才能找到它們。現在許多低端服務器系統,甚至是一些個人主機或行動裝置系統都有多個處理器。 現代操作系統,包括 Linux、Solaris 和 Windows Server/7/10,都可以利用多個處理器並調度執行緒在任何可用的處理器上執行。 調度的基本單位通常是執行緒;如果某個程序只有一個活動的執行緒,它一次只能在一個處理器上運行。如果某個程序有多個活動執行緒,那麼可以同時調度多個執行緒。在精心設計的程序中,使用多個執行緒可以提高程序吞吐量和性能。

簡化建模

在某些情況下,使用執行緒可以使程序編寫和維護起來更簡單。考慮一個仿真應用程序,您要在其中模擬多個實體之間的交互作用。給每個實體一個自己的執行緒可以使許多仿真和對應用程序的建模大大簡化。 另一個適合使用單獨執行緒來簡化程序的示例是在一個應用程序有多個獨立的事件驅動組件的時候。例如,一個應用程序可能有這樣一個組件,該組件在某個事件之後用秒數倒數計時,並更新螢幕顯示。與其讓一個主循環定期檢查時間並更新顯示,不如讓一個執行緒什麼也不做,一直休眠,直到某一段時間後,更新螢幕上的計數器,這樣更簡單,而且不容易出錯。這樣,主執行緒就根本無需擔心計時器。

執行異步(Asynchronous)或後台處理

服務器應用程序從遠程來源,如網路插座(Network socket, 網路埠)獲取輸入。當讀取 Network socket 時,如果當前沒有可用數據,那麼對 SocketInputStream.read() 的調用將會阻塞,直到有可用數據為止。 如果單執行緒程序要讀取 Network socket,而 Network socket 另一端的實體並未發送任何數據,那麼該程序只會永遠等待,而不執行其它處理。相反,程序可以輪詢 Network socket,查看是否有可用數據,但通常不會使用這種做法,因為會影響性能。 但是,如果您創建了一個執行緒來讀取 Network socket,那麼當這個執行緒等待 Network socket 中的輸入時,主執行緒就可以執行其它任務。您甚至可以創建多個執行緒,這樣就可以同時讀取多個 Network socket。這樣,當有可用數據時,您會迅速得到通知(因為正在等待的執行緒被喚醒),而不必經常輪詢以檢查是否有可用數據。使用執行緒等待 Network socket 的代碼也比輪詢更簡單、更不易出錯。

2018年12月19日 星期三

Java SE 入門教學 - 簡單操作資料庫 - 語法使用

更新時間:12/19/2018

前言

在建立前端即 Java 程序和後端(即資料庫)之間的連接之前,我們應該了解 JDBC 究竟是什麼以及它為何存在。

什麼是 JDBC?

JDBC 是 Java Database Connectivity 的首字母縮寫。這是 ODBC(開放式資料庫連接)的進步。JDBC 是為了將數據從前端移動到後端而開發的標準 API 規範。此 API 由用 Java 編寫的類別和介面組成。它基本上充當介面(不是我們在 Java 中使用的介面)或 Java 程序和資料庫之間的通道,即它在兩者之間建立鏈接,以便程序員可以從 Java 代碼發送數據並將其存儲在資料庫中以備將來使用。

為什麼 JDBC 會出現?

如前所述,JDBC 是 ODBC 的一個進步,ODBC 依賴於平台有很多缺點。ODBC API 是用 C、C++、Python、Core、Java 編寫的,正如我們所知,上面的語言(除了 Java 和 Python 的某些部分)都依賴於平台。因此,為了消除依賴性,JDBC 由資料庫供應商開發,該供應商由用 Java 編寫的類別和介面組成。

2018年12月13日 星期四

Java SE 入門教學 - 簡單操作資料庫 - 環境架設

更新時間:12/13/2018

前言

有些資料執行完畢就可以丟掉,但有些資料必須保存,以利下一次的使用,我們可以使用序列化與反序列化將資料儲存在硬碟中,但資料多後,程式碼需要控制流程,又要管理資料,這會變得很難維護。

在紙筆發明前,我們的老祖宗只能使用我們的大腦記住所有的資料同時又必須思考要做什麼事情。在紙筆發明後,我們可以將一些資訊寫下來,這樣我們的老祖宗可以專心思考要做什麼事情,甚至可以創作一些詩詞廣為流傳,例如《江城子》蘇軾


近代,在電腦發明前,我們可能使用"資料夾"的方式來保存世界上所有國家的資料。


在電腦發明後,我們可能使用這樣的工作表軟體紀錄資料。


使用這種工作表來儲存國家資料,當然比用卡片好多了,尤其是想要尋找某個國家的資料,然後修改它的人口數量。雖然方便多了,不過在你查詢國家資料時,可能會有這樣的問題:各表單間還是不能連貫,那跟一個一個檔案分開也沒啥區別了

2018年12月12日 星期三

安裝 MariaDB

更新時間:12/12/2018

前言

MariaDB 資料庫管理系統是 MySQL 的一個分支,主要由開源社群在維護,採用 GPL 授權授權。開發這個分支的原因之一是:Oracle 公司收購了 MySQL 後,有將 MySQL 閉源的潛在風險,因此社群採用分支的方式來避開這個風險。

MariaDB 的目的是完全相容 MySQL,包括 API 和命令列,使之能輕鬆成為 MySQL 的代替品。在儲存引擎方面,10.0.9 版起使用 XtraDB(名稱代號為Aria)來代替 MySQL 的 InnoDB。

MariaDB 由 MySQL 的創始人米卡埃爾·維德紐斯(Ulf Michael Widenius)主導開發,他早前曾以 10 億美元的價格,將自己建立的公司 MySQL AB 賣給了 SUN,此後,隨著 SUN 被甲骨文收購,MySQL 的所有權也落入 Oracle 的手中。MariaDB 名稱來自米卡埃爾·維德紐斯的女兒瑪麗亞(英語:Maria)的名字。

2018年12月11日 星期二

第一次使用與設定 NetBeans IDE

更新時間:12/11/2018

前言

IDE(Integrated Development Environment, 集成開發環境) 用於提供程序開發,您可以在這個 IDE 上可以完成編輯、編譯、連結、運行和除錯所有步驟。
使用 IDE 的好處是:
 (i) 可以幫您偵測哪一行代碼有問題,直接(編譯)顯示出語法警告或語法錯誤。
 (ii) 可以幫您很快調用所需的 API,擁有提示功能,方便查看 API 的聲明或者源代碼。
 (iii) 可以幫你去調試應用程序,查找程序錯誤。

2018年12月10日 星期一

安裝 NetBeans IDE

更新時間:12/10/2018

前言

NetBeans 是 Java 的集成開發環境(IDE)。NetBeans 允許從一組模組化軟件的組件開發應用程序,模組是一個 jar 檔(Java archive file)它包含了一組 Java 程式的類別而它們實作全依據依 NetBeans 定義了的公開介面以及一系列用來區分不同模組的定義描述檔(Manifest file)。NetBeans 可在 Microsoft Windows、macOS、Linux 和 Solaris 上運行。除了 Java 開發之外,它還有其他語言的擴展,如 PHP、C、C++、HTML5 和 Javascript。基於 NetBeans 的應用程序(包括 NetBeans IDE)可以由第三方開發人員進行擴展。

2018年12月8日 星期六

Java SE 入門教學 - 物件序列化與反序列化

更新時間:12/08/2018

前言

一個類別只有實現了 Serializable 介面,它的物件才是可序列化的。因此如果要序列化某些類別的物件,這些類別就必須實作 Serializable 介面。而實際上,Serializable 是一個空介面,沒有什麼具體內容,它的目的只是簡單的標識一個類別的物件可以被序列化。好處:

(i) 比如說你的記憶體不夠用了,那計算機就要將內存裡面的一部分物件暫時的保存到硬碟中,等到要用的時候再讀入到記憶體中。在比如說你要將某個特定的物件保存到文件中,我隔幾天再把它拿出來用,那麼這時候就要實作 Serializable 介面。

(ii) 在進行 java 的 Socket 編程的時候,你有時候可能要傳輸某一類別的物件,那麼也就要實作 Serializable 介面。最常見的你傳輸一個字符串,它是 JDK 裡面的類別,也實作了 Serializable 介面,所以可以在網絡上傳輸。

(iii) 如果要通過遠程的方法(RMI)去調用一個遠程物件的方法,如在計算機 A 中調用另一台計算機 B 的物件的方法,那麼你需要通過 JNDI 服務獲取計算機 B 目標物件的引用,將物件從 B 傳送到 A,就需要實作 Serializable 介面。例如,在 web 開發中,如果物件被保存在了 Session 中,tomcat 在重啟時要把 Session 物件序列化到硬碟,這個物件就必須實作 Serializable 介面。如果物件要經過分佈式系統進行網絡傳輸或通過 rmi 等遠程調用,這就需要在網絡上傳輸物件,被傳輸的物件就必須實作 Serializable 介面。

2018年12月7日 星期五

Java SE 入門教學 - properties文件 和 Properties類別

更新時間:12/07/2018

前言

在我們平時寫程序的時候,有些參數是經常改變的,而這種改變不是我們預知的。比如說我們開發了一個操作數據庫的模塊,在開發的時候我們連接本地的數據庫那麼 IP、數據庫名稱、數據庫表名稱、數據庫主機等信息是我們本地的,要使得這個操作數據的模塊具有通用性,那麼以上信息就不能寫死在程序裡。通常我們的做法是用配置文件來解決。

各種語言都有自己所支持的配置文件類型。比如 Python ,它支持 .ini 文件。因為他內部有一個 ConfigParser 類來支持 .ini 文件的讀寫,根據該類提供的方法程序員可以自由的來操作 .ini 文件。而在 Java 中,Java 支持的是 .properties 文件的讀寫,java.util.Properties 類別為我們操作 .properties 文件提供了便利。

在 Java 項目中,操作 properties 文件 是經常要做的,因為很多的配置信息都會寫在 properties 文件中,這種檔案被稱為屬性資源包(Property Resource Bundles)。每個參數被儲存為一對字串:一個儲存名稱參數(被稱為「鍵」),另一個儲存值。

2018年12月5日 星期三

Java SE 入門教學 - IO 流

更新時間:12/05/2018

前言

Java 流式輸入/輸出原理

在 Java 程序中,對於數據的輸入/輸出操作以「流(Stream)」方式進行;JDK提供了各種各樣「流」的類別,用以獲取不同種類的數據;程序中通過標準的方法輸入或輸出數據。

流是用來讀寫數據的,java 有一個類別叫 File,它封裝的是文件的文件名,只是記憶體裡面的一個物件,真正的文件是在硬碟上的一塊空間,在這個文件裡面存放著各種各樣的數據,我們想讀文件裡面的數據怎麼辦呢?是通過一個流的方式來讀,我們想從程序讀數據,對於計算機來說,無論讀什麼類型的數據都是以 010101101010 這樣的形式讀取的。怎麼把文件裡面的數據讀出來呢?您可以把文件想像成一個小桶,文件就是一個桶,文件裡面的數據就相當於是這個桶裡面的水,那麼我們怎麼從這個桶裡面取水呢?也就是怎麼從這個文件讀取數據呢?

常見的取水辦法是我們用一根管道插到桶上面,然後在管道的另一邊打開水龍頭,桶裡面的水就開始嘩啦嘩啦地從水龍頭里流出來了,桶裡面的水是通過這根管道流出來的,因此這根管道就叫流,Java 裡面的流式輸入/輸出跟水流的原理一模一樣,當您要從文件讀取數據的時候,一根管道插到文件裡面去,然後文件裡面的數據就順著管道流出來,這時你在管道的另一頭就可以讀取到從文件流出來的各種各樣的數據了。當您要往文件寫入數據時,也是通過一根管道,讓要寫入的數據通過這根管道嘩啦嘩啦地流進文件裡面去。除了從文件去取數據以外,還可以通過網絡,比如用一根管道把我和你的機子連接起來,我說一句話,通過這個管道流進你的機子裡面,你馬上就可以看得到,而你說一句話,通過這根管道流到我的機子裡面,我也馬上就可以看到。有的時候,一根管道不夠用,比方說這根管道流過來的水有一些雜質,我們就可以在這個根管道的外面再包一層管道,把雜質給過濾掉。從程序的角度來講,從計算機讀取到的原始數據肯定都是 010101 這種形式的,一個字節一個字節地往外讀,當你這樣讀的時候你覺得這樣的方法不合適,沒關係,你再在這根管道的外面再包一層比較強大的管道,這個管道可以把 010101 幫你轉換成字符串。這樣你使用程序讀取數據時讀到的就不再是 010101 這種形式的數據了,而是一些可以看得懂的字符串了。

2018年12月3日 星期一

Java SE 入門教學 - 集合

更新時間:12/03/2018

前言

Java 中的集合是一個框架,它提供了一個存儲和操作物件組的體系結構。能夠有系統的操作資料,是處理資料的好幫手。Java Collections 可以實現您對數據執行的所有操作,例如搜索,排序,插入,操作和刪除。

早在 Java 2 中之前,Java 就提供了特殊類別。比如:Dictionary, Vector, Stack, 和 Properties 這些類別用來存儲和操作物件組。雖然這些類別都非常有用,但是它們缺少一個核心的,統一的主題。由於這個原因,使用 Vector 類別的方式和使用 Properties 類別的方式有著很大不同。

集合框架被設計成要滿足以下幾個目標。

  • 該框架必須是高性能的。基本集合(動態數組,鍊錶,樹,哈希表)的實現也必須是高效的。
  • 該框架允許不同類型的集合,以類似的方式工作,具有高度的互操作性。
  • 對一個集合的擴展和適應必須是簡單的。

為此,整個集合框架就圍繞一組標準介面而設計。你可以直接使用這些介面的標準實現,諸如:LinkedList、HashSet 和 TreeSet 等,除此之外你也可以通過這些介面實現自己的集合。

此篇針對如何使用集合框架做個拋磚引玉,重點在於如何簡單的使用這些類別,更深入的瞭解集合框架不在此篇的討論範圍。

2018年11月30日 星期五

Java SE 入門教學 - 泛型(Generic)

更新時間:11/30/2018

前言

泛型((Generic)在 JAVA 中有很重要的地位,在物件導向編程及各種設計模式中有非常廣泛的應用。

什麼是泛型?為什麼要使用泛型?

泛型,即「參數化型態」。一提到參數,最熟悉的就是定義方法時形式參數(formal parameter, parameter, 參數),然後調用此方法時傳遞實際參數(actual parameter, arguments, 引數)。那麼參數化型態怎麼理解呢?顧名思義,就是將型態由原來具體的型態參數化,類似於方法中的變數參數,此時型態也定義成形式參數(可以稱之為形式型態參數),然後在使用/調用時傳入具體的型態(實際型態參數)。

泛型的本質是為了參數化型態(在不創建新型態的情況下,通過泛型指定的不同型態來控制形式參數具體限制的型態)。也就是說在泛型使用過程中,操作的數據型態被指定為一個參數,這種參數型態可以用在類別、介面和方法中,分別被稱為泛型類別(Generic Class)、泛型介面(Generic Interface)、泛型方法(Generic Method)。



一、沒有泛型會怎樣?

先看下面這段代碼,我們實現兩個能夠設置點座標的類別,分別設置 Integer 型態的點座標和 Float 類型的點座標:

那現在有個問題:大家有沒有發現,他們除了變數型態不一樣,一個是 Integer,一個是 Float 以外,其它並沒有什麼區別!那我們能不能合併成一個呢?

2018年11月26日 星期一

Java SE 入門教學 - 內部類別-巢狀類別

更新時間:11/26/2018

前言

如果要把每個功能都分出來,一個大型專案肯定會使用超多的類別,但,有時候這個類別只有特定的類別使用時,可以考慮使用另一個技術「內部類別(Inner Class)」、「巢狀類別(Nested Class)」。

內部類別通常是用來輔助外部類別,另一層封裝的類別階層組織,以提高程式的可讀性和維護性。



一、內部類別的基礎概念

在類別中您還可以定義類別,稱之為內部類別(Inner class)或「巢狀類別」(Nested class)。非 "static" 的內部類別可以分為三種:成員內部類別(Member inner class)、區域內部類別(Local inner class)與匿名內部類別(Anonymous inner class);static 的內部類別只有一種:靜態成員內部類別。

使用內部類別的好處在於可以直接存取外部類別的私用(private)成員,舉個例子來說,在視窗程式中,您可以使用內部類別來實作一個事件傾聽者類別,這個視窗傾聽者類別可以直接存取視窗元件,而不用透過參數傳遞。

另一個好處是,當某個 Slave 類別完全只服務於一個 Master 類別時,我們可以將之設定為內部類別,如此使用 Master 類別的人就不用知道 Slave 的存在。

存取修飾子的使用:

外部類別只能使用:public、default、final、abstract。
內部類別可以使用:private、protected、public、static。

2018年11月23日 星期五

Java SE 入門教學 - 匿名物件

更新時間:11/23/2018

前言

物件導向 的文章中有介紹一個類別的基本構成,而當我們使用一個類別建立起一個非靜態的類別時,總是使用建構子來建構「物件實例」,然後儲存在一個「物件參考變數」中;但有時候我們只是想要執行一下這個類別的功能,而後續就再也不使用它了,那麼我還需要管理這個「物件參考變數」嗎?


一、複習:建立一個物件實例

首先,複習一下語法:

父類別(介面)名稱 物件參考變數 = new 自己/子類別建構子();
(i) (ii) (iii)

(i):宣告物件參考變數的型別

(ii):物件參考變數的名字

(iii):建立物件實例

使用 new 關鍵字在記憶體堆區塊(Heap)開闢足夠大的空間建立 自己/子類別 的物件實例。


2018年11月22日 星期四

Java SE 入門教學 - 列舉 Enumeration

更新時間:11/22/2018

前言

程式中經常會使用到一些常數,如果有些常數是共用的,在 Java 中可以定義一個類別或介面來統一管理常數,而其它物件從這些類別或介面上取用常數,如果需要修改常數則可以從這些類別或介面上直接修改,而不用更動到程式的其它部份,這種使用常數的方式在 J2SE 1.4 或之前的版本相當常見。

J2SE 5.0 中新增了「列舉型態」(Enumerated Types),您可以使用這個功能取代之前 J2SE 1.4 或之前版本定義常數的方式,除了常數設置的功能之外,列舉型態還給了您許多編譯時期的檢查功能,但別想的太複雜,列舉型態本質上還是以類別的方式存在,因而它提供了這麼多額外的功能並不奇怪。


一、列舉常數值

在日常生活中,項目固定、值固定,請用列舉。列舉必須寫在類別內部,屬於內部類別。

語法:

enum 列舉名稱{常數值1, 常數值2, 常數值3, ...}

編譯器會自動加上存取修飾值 public static final


範例:星期

安裝 DJ Java Decompiler

更新時間:07/25/2019

前言

想要看 Java 編譯器為我們做了多少事情,就使用「反組譯器」來查看看吧!


一、從網頁下載安裝檔案

▼ 開啟 DJ Java Decompiler 官網,點選【Download for Windows】。

Java SE 入門教學 - 可變動參數與陣列

更新時間:11/22/2018

前言

在寫方法時,我們有時候會使用到相同型別,但參數個數不同的時候,就會使用到多載(Overloading)或是傳入陣列解決問題。

當需要 1個、2個和3個相同型別參數時,使用多載可以解決;使用陣列在操作上就顯得有點麻煩。

public double average(int x){...};
public double average(int x1, int x2){...};
public double average(int x1, int x2, int x3){...};

當100個相同型別參數時,使用多載就必須要寫100個方法,萬一之後要修改,也要修改100個方法,這...太累人了!
所以,使用參數傳入陣列可以省事多了!只是每一次要使用前都要先建立陣列。

public double average(int[] x){...};

當如果要使用 1 ~ 20 個相同型別參數時,該使用多載還是使用陣列呢?這時可以考慮使用可變動參數的寫法,擁有相同型別但數量不同的參數。

2018年11月20日 星期二

Java SE 入門教學 - Object 類別的常見方法

更新時間:11/20/2018

前言

Object 類別是所有類別的根,也就是說當您自己撰寫任何類別的時候,都一定會繼承 Object 類別內的東西,這些東西還真是形影不離啊......。既然每個地方都可以看見它們的存在,勢必要好好「瞭解」與「利用」這些好~夥伴!

方法名稱 方法說明
protected Object clone() 複製此物件。
boolean equals(Object obj) 比較兩個物件是否相等。
protected void finalize() 如果物件沒有任何參考指向它,則會呼叫垃圾收集器(garbage collector)回收。
Class<?> getClass() 取得此物件執行時期的類別。
int hashCode() 雜湊值。
String toString() 回傳代表此物件的字串說明。
void notify() 喚醒正在此物件監視上等待的單個線程。
void notifyAll() 喚醒等待此物件監視上等待的所有線程。
void wait() 導致當前線程等待,直到另一個線程調用此物件的 notify() 方法或 notifyAll() 方法。
void wait(long timeout) 導致當前線程等待,直到另一個線程調用此物件的 notify() 方法或 notifyAll() 方法,或者已經過了指定的時間量。
void wait(long timeout, int nanos) 導致當前線程等待,直到另一個線程為此對象調用 notify() 方法或 notifyAll() 方法,或者某個其他線程中斷當前線程,或者已經過了指定的時間量。

Java SE 入門教學 - 多型

更新時間:11/20/2018

前言

如果類別與類別之間有繼承關係,則您可以用父類別宣告一個參考名稱,並讓其參考至子類別的物件實例,並以父類別上的公開介面來操作子類別上對應的公開方法,這是多型的基本操作方式。


一、多型的基本概念

多型是指在執行期間(而非編譯時期) 判斷物件實例所參考的實際類型,根據其實際的類型調用其相應的方法。

在之前「抽象類別與介面」篇章中,有提到 多型(polymorphism) 的基本概念。



2018年11月18日 星期日

Java SE 入門教學 - 打包JAR

更新時間:11/18/2018

前言

要完成一個 Java 專案,勢必得分好幾個 Class 撰寫。但是當這個 Java 專案完成後,要如何拿給使用者執行呢?總不能讓使用者自己一個一個去試這堆 Class 中到底哪個是擁有程式進入點的 Main Class 吧?Java JDK 提供了將 .class 打包為 .jar 的指令,只要安裝好 JDK 後就可以使用「jar」指令來將 class 檔案打包為以 ZIP 格式壓縮的 JAR 檔案,之後將這 JAR 檔案拿到任何裝有 JRE 的作業系統上,都可以使用「java -jar」指令來執行。


一、JAR(檔案格式)

在軟體領域,JAR 檔案(Java 歸檔,英語:Java ARchive)是一種軟體包檔案格式,通常用於聚合大量的 Java 類別檔案、相關的元資料和資源(文字、圖片等)檔案到一個檔案,以便分發 Java 平台應用軟體或庫。

JAR 文件格式提供了許多好處:

  • 安全性:您可以對 JAR 文件的內容進行數字簽名(digitally sign)。然後,識別您的簽名的用戶可以選擇授予您原本不具備的軟件安全權限。
  • 減少下載時間:如果您的 applet 捆綁在 JAR 文件中,則可以在單個 HTTP 事務中將 applet 的類文件和相關資源下載到瀏覽器,而無需為每個文件打開新連接。
  • 壓縮:JAR 格式允許您壓縮文件以實現高效存儲。
  • 擴展包裝:擴展框架提供了一種向Java核心平台添加功能的方法,JAR文件格式定義了擴展的包裝。通過使用JAR文件格式,您也可以將軟件轉換為擴展名。
  • 套件密封:可以選擇密封存儲在 JAR 文件中的套件,以便套件可以強制實現版本一致性。在 JAR 文件中封裝套件意味著必須在同一個 JAR 文件中找到該套件中定義的所有類。
  • 套件版本控制:JAR 文件可以保存有關其包含的文件的數據,例如供應商和版本信息。
  • 可移植性:處理 JAR 文件的機制是 Java 平台核心 API 的標準部分。

常見的 JAR 文件操作:

操作說明 指令
建立 JAR 檔案 jar cf jar-file input-file(s)
查看 JAR 檔案的內容 jar tf jar-file
提取 JAR 檔案的內容 jar xf jar-file
從 JAR 檔案中提取特定文件 jar xf jar-file archived-file(s)
執行打包為 JAR 檔案的應用程序
(需要 Main-class manifest header)
java -jar app.jar
調用打包為 JAR 檔案的 applet <applet code=AppletClassName.class
    archive="JarFileName.jar"
    width=width height=height>
</applet>

2018年11月17日 星期六

安裝 Dev-C++


更新時間:11/17/2018

前言

這次一款小而巧的 C++ 編譯軟體。
Dev-C++ 是一套用於開發 C/C++ 的自由的整合式開發環境(IDE),並以 GPL 作為散布許可。使用 MinGW 及 GDB 作為編譯系統與除錯系統。Dev-C++ 的 IDE 是利用 Delphi 開發的。
Dev-C++ 是一個 SourceForge 的計畫,是由 Colin Laplace 這位程式設計師及其公司 Bloodshed Software 所開始的。目前 Dev-C++ 一般用於撰寫執行於 Microsoft Windows 的程式。

2018年11月16日 星期五

Java SE 入門教學 - Package部屬

更新時間:11/19/2018

前言

當您專案的類別越寫越多時,需要有一套方式可以管理類別,就像您使用類別管理變數、方法一樣,分門別類。例如在程式中,您也許會定義一個 Rectangle 類別,但另一個與您合作開發程式的開發人員並不曉得已經有這個類別名稱的存在,他可能也定義了一個 Rectangle 類別,於是編譯過後他的 Rectangle 類別檔案會覆蓋您的 Rectangle 類別檔案,問題就發生了。


一、什麼是套件(Package)

套件是 JAVA 用來組織類別、抽象類別、介面與子套件的機制。其作用如下:

  • 防止命名衝突。例如可以有相同類別的名字 Employee 在不同的套件 college.staff.cse.Employee 和 college.staff.ee.Employee 中。
  • 類別(class)、抽象類別(abstract method)、介面(interface)、列舉(enumerations)、註解(annotations)變得更容易搜尋、配置與使用。
  • 存取修飾子發揮作用,可控制訪問權限。
  • 套件可以被視為數據封裝或數據隱藏。

我們必須把相關的類別放在套件中。如此,我們可以簡單地寫上 import 關鍵字導入已經存在的套件包,並在我們的程序中使用它。套件包是一組相關類別的容器,其中一些類別是可訪問的,而其他類別是為內部目的而保留的。我們可以在程序中盡可能地重複使用套件包中已經存在的類別。

2018年11月14日 星期三

Java SE 入門教學 - 例外處理

更新時間:11/19/2018

前言

程式在執行時,有時候會碰到一些狀況使得程式崩潰,這是程式設計師最不想要遇到的狀況。所以 JAVA 提供一些方式可以處理這些狀況,讓程式更穩定。

一、例外的概念

例外指的是運行期出現的錯誤,也就是當程序開始執行以後執行期出現的錯誤。出現錯誤時觀察錯誤的名字和行號最為重要。

Java 例外是 Java 提供用於處理程序中異常的一種機制。

所謂錯誤是指在程序運行的過程中發生的一些例外事件(如:除0溢出,數組下標越界,所要讀取的文件不存在)。

設計良好的程序應該在例外發生時提供處理這些錯誤的方法,使得程序不會因為異常的發生而阻斷或產生不可預見的結果。

Java 程序的執行過程中如出現例外事件,可以生成一個例外物件實例,該例外物件實例封裝了例外事件的信息並將被提交給 Java 執行程序,這個過程稱為拋出(throw)例外。

當 Java 執行程序接收到例外物件實例時,會尋找能處理這一例外的代碼並把當前例外物件實例交給其處理,這一過程稱為捕獲(catch)例外。

2018年11月13日 星期二

Java SE 入門教學 - 抽象類別與介面

更新時間:11/19/2018

前言

前一篇介紹了物件導向,類別的構造與性質,雖然知道把具體或概念一一抽象出來成為類別,碰到相似的具體或概念時,可以使用繼承來減少程式碼的撰寫,但有沒有可能您寫的父類別,繼承過來的子類別卻需要把每個方法都覆寫(Override)一次,導致父類別的方法完全無用武之地呢?

或是您可能想要繼承爸爸與媽媽的意志,爸爸是由爺爺、奶奶這個血脈傳承下來,而媽媽卻是由外公、外婆這個血脈傳承下來,那麼我要如何同時繼承兩個呢?在 JAVA 中規定不能繼承兩個類別,那怎麼辦?

一、抽象類別(abstract class)

既然父類別的方法無用武之地,那麼我們只宣告方法名稱而不實作當中的邏輯,這樣的方法稱之為「抽象方法」(Abstract method)

如果一個類別中包括了抽象方法,則該類別稱之為「抽象類別」(Abstract class),抽象類別是個未定義完全的類別,所以它不能被用來生成物件,它只能被擴充,並於擴充後完成未完成的抽象方法定義。

在 Java 中要宣告抽象方法與抽象類別,使用"abstract"關鍵字。

從某種意義上來說,抽象方法就是被用來重寫的,所以在父類別宣告的抽象方法一定要在子類別裡面重寫。如果真的不想在子類別裡面重寫這個方法,那麼可以在子類別裡面把這個方法再定義為抽象方法,因為子類別覺得我去實現也不合適,應該讓繼承我的子類別去實現比較合適,因此也可以在繼承這個子類別的下一個子類別裡面重寫父類別宣告的抽象方法,這樣是可以的。

2018年11月7日 星期三

Java SE 入門教學 - 物件導向

更新時間:11/07/2018

前言

在現代意義上的物件導向編程中引用「物件」和「導向」的術語在20世紀50年代末和60年代初首次出現在麻省理工學院。早在1960年人工智能組的環境中,「物件」就可以指具有屬性(properties, attributes)的識別項(LISP原子);Alan Kay 後來引用了對LISP內部的詳細理解,對他1966年的思想產生了強烈的影響。

在1960年的 Simula 語言中即可發現,當時的程式設計領域正面臨著一種危機:在軟硬體環境逐漸複雜的情況下,軟體如何得到良好的維護?物件導向程式設計在某種程度上通過強調可重複性解決了這一問題。1970年代的 Smalltalk 語言在物件導向方面堪稱經典——以至於多年後的今天依然將這一語言視為物件導向語言的基礎。

Smalltalk 的建立者深受 Simula 67 的主要思想影響,但 Smalltalk 中的物件是完全動態的——它們可以被建立、修改並銷毀,這與 Simula 中的靜態物件有所區別。此外,Smalltalk 還引入了繼承性的思想,它因此一舉超越了不可建立實體的程式設計模型和不具備繼承性的 Simula。

物件導向程式設計在1980年代成為了一種主導思想,這主要應歸功於 C++ —— C語言的擴充版。在圖形化使用者介面(GUI)日漸崛起的情況下,物件導向程式設計很好地適應了潮流。

James Gosling,Mike Sheridan 和 Patrick Naughton 於1991年6月發起了 Java 語言項目。Java 最初是為交互式電視而設計的,但它對於當時的數字有線電視行業來說太先進了。這種語言最初被稱為 Oak(橡樹),源於 Gosling 辦公室外的一棵 Oak。後來這個項目名為 Green,最後改名為 Java,來自 Java coffee。Gosling 使用 C / C ++ 風格的語法設計 Java,系統和應用程序程序員會覺得這種語法很熟悉。Sun Microsystems 於1996年發行 Java 1.0。

一、函數導向和物件導向的思想

物件導向和函數導向的思想有著本質上的區別,做為物件導向的思維來說,當您拿到一個問題時,您分析這個問題不在是第一步先做什麼,第二步再做什麼,這是物件導向的思維,您應該分析這個問題裡面有哪些類別和物件,這是第一點,然後再分析這些類別和物件應該具有那些屬性和方法,這是第二點。最後分析類別和類別之間具體有什麼關係,這是第三點。

物件導向有一個非常重要的設計思維:合適的屬性與方法應該出現在合適的類別裡面。

2018年11月1日 星期四

Java SE 入門教學 - 陣列

更新時間:11/01/2018

前言

如果要管理一個班級的成績,班級人數有30人,那麼我需要建立30個名字變數,30個國文成績,30個數學成績,30個英文成績等等...,光是宣告變數就要上百個,那...我需要怎麼管理程式?!

一、陣列的基本概念

陣列可以看成是多個相同類型數據組合,對這些數據的統一管理,數據類型可以是「基本型態」或「類別型態」。

陣列的元素起始位置從 0 開始,依序遞增(0, 1, 2, ...)。

二、一維陣列

JAVA 正規宣告陣列的方式與 C 語言完全不同,但後來也有加入一些宣告語法是仿 C 語言的。

2.1 一維陣列變數宣告

◉ 格式1:dataType[] arrayRefVar; (首選)

int[] a;
String[] str;

◉ 格式2:dataType arrayRefVar[]; (一樣可以作用,但非首選)

int a[];
String str[];

2018年10月31日 星期三

Java SE 入門教學 - 判斷式與迴圈

更新時間:10/31/2018

前言

人腦比電腦更具思考能力,但重複的工作時間一長,人類就比不上電腦了!繁雜的事情就交給電腦處理,如何安排工作就交給人腦吧!

一、判斷式

電腦執行是一個指令一個指令按照順序執行下去,是不會轉彎的~ 使用判斷式讓程式轉彎吧!

1.1 if 判斷式

◉ if{ }
◉ if{ ... }else{ ... }
◉ if{ ... }else if{ ... }
◉ if{ ... }else if{ ... }else if{ ... }
◉ if{ ... }else if{ ... }else if{ ... }else{ ... }
◉ 只有一句需要執行的語句時,可以省略{}

Java SE 入門教學 - 基礎語法

更新時間:10/31/2018

前言

Sun Microsystems(昇陽電腦)主要產品是工作站、伺服器和 UNIX 作業系統。1995年昇陽開發了 Java 技術,這是第一個通用軟體平台。1997年開發出 Java 2。其創始人為Bill JoyVinod KhoslaAndy BechtolsheimScott McNealy,昇陽這個名字來源於史丹福大學網路(Stanford University Network)的縮寫。

一、識別子

Java 對各種變量、方法和類別等要素命名時使用的字符序列稱為識別子。凡是自己可以起名字的地方都叫識別子,都遵守識別子的規則。

Java 識別子命名規則:

  • 識別子由字母、下底線(_)、錢記號($)或數字組成。
  • 識別子應以字母、下底線(_)、錢記號($)開頭。
  • Java 識別子大小寫敏感,長度無限制。

約定俗成:Java 識別子選取因注意「見名知意」且不能與 Java 語言的關鍵字重複名字。

合法的識別子 不合法的識別子
$bS5_c7 class
DataClass DataClass#
_987 98.3
HelloWorld Hello World

2018年10月29日 星期一

Java SE 入門教學 - 認識Java編程語言

更新時間:10/29/2018

前言

James Gosling 是加拿大計算機科學家,最著名的是 Java 編程語言背後的創始人和首席設計師。

James Gosling:「我看見窗戶外面有顆橡樹,所以將它取名為 Oak,但後來發現 Oak 這個名稱已經被註冊使用了,大家喝著咖啡邊討論新的名稱,才靈機一動的將之改名為"Java"。」



一、Java 語言的特性

Java 之所以被開發,是要達到以下五個目的:

  • 應當使用"物件導向"程式設計方法學
  • 應當允許同一程式在"不同"的電腦平台執行
  • 應當包括內建的對電腦網路的支援
  • 應當被設計成安全地執行遠端程式碼
  • 應當易於使用,並借鑑以前那些物件導向語言(如C++)的長處。

1.1 物件導向

「物件導向程式設計語言」的核心之一就是開發者在設計軟體的時候可以使用自訂的類型和關聯操作。程式碼和資料的實際集合體叫做「物件」。一個物件可以想像成繫結了很多「行為(程式碼)」和「狀態(資料)」的物體。

1.2 跨平台性

執行 Java 應用程式必須安裝 Java 執行時環境(Java Runtime Environment,JRE),JRE 包括 Java 虛擬機器(Java Virtual Machine,JVM),以及 Java 平台核心類和基礎 Java 平台庫。通過 JVM 才能在電腦系統執行 Java 應用程式(Java Application),這與 .Net Framework 的情況一樣,所以電腦上沒有安裝 JVM,那麼這些 java 程式將不能夠執行。

1.3 自動垃圾回收(Garbage Collection)

對象的建立和放置都是在記憶體堆疊上面進行的。當一個物件沒有任何參照的時候,Java的自動垃圾收集機制就發揮作用,自動刪除這個物件所佔用的空間,釋放記憶體以避免記憶體洩漏。

注意程式設計師不需要修改finalize方法,自動垃圾收集也會發生作用。但是記憶體洩漏並不是就此避免了,當程式員疏忽大意地忘記解除一個物件不應該有的參照時,記憶體洩漏仍然不可避免。

AlexaMaster 自動衝浪 自動賺錢 網賺

更新時間:10/29/2018

前言

我真的拿到錢了!!

緣由

因為平常玩遊戲掛網,所以電腦都不關機,無論白天或晚上,都是一直在工作,但又看著 CPU、記憶體 沒有跑滿跑好,便動腦筋到底還有什麼事情可以給電腦自動處理的,找來找去就找到 AlexaMaster ,可以賺點零用錢。看著它的教學與說明,非常輕易上手。如果您電腦平常不關機,那就來註冊試試看吧!

2018年10月27日 星期六

安裝 Notepad++

更新時間:10/27/2018

前言

微軟內建的 notepad 在不同作業系統的換行符號總是處理不好,對於 Unicode 的支持也是慢半拍,不過微軟在2018年終於更新了!但我還是不會使用微軟記事本,因為我已經習慣使用 notepad++ ,這款功能強大且附有許多插件的文件編輯軟體,怎麼能夠錯過呢?!

一、安裝 Notepad++

Notepad++ 是一套為自由軟體的純文字編輯器,在2003年由 Don Ho 基於相同是開放原始碼的 Scintilla 文字編輯元件並獨立研發完成,現由 GitHub 代管。

2018年10月26日 星期五

Java SE 入門教學 - 安裝與環境設定

更新時間:10/26/2018

前言

學習 Java 的第一步就是要搭建 Java 的學習環境,首先是要安裝 JDK , JDK 安裝好後,還需要在電腦上配置"JAVA_HOME"、"path"和"classpath"這三個環境變數才能夠把 Java 的開發環境搭建好。在沒安裝過 jdk 的環境下,path 環境變數是系統變數,本來就存在的,而 JAVA_HOME 和 classpath 是不存在的。

一、安裝 Java JDK

Java 程式原本是 sun 公司所有,後來 Oracle (甲骨文) 公司收購,故現在所有權為 Oracle (甲骨文) 公司。

開發人員必須在電腦中安裝用來寫程式的 Java Development Kit (JDK) 與用來執行 Java 程式的 Java Runtime Environment (JRE)。

  • JDK 為 Java 的編譯程式。
  • JRE 為 Java 的執行程式。

如果只是客戶要使用,那麼只要幫客戶安裝 JRE 即可。

1.1 下載教學:

下載 Java Development Kit (JDK) 開發工具,可以直接輸入原網址: http://java.sun.com ,或是輸入現在的網址:http://www.oracle.com/technetwork/java/index.html

Java SE 入門教學 - 開篇

更新時間:10/26/2018

目的

學習 Java 也有多年之久,斷斷續續的學習以至於很多概念學了又淡忘,趁著工作之餘,好好整理一下之前學習的 Java SE 基礎時的概念,當作是對 Java 基礎學習的一個總結。

內容

Java 是我完整學習的第一個物件導向語言,學習 Java SE 時,是在彰化巨匠電腦湯老師超雄的課程,老師鉅細靡遺地講解基礎觀念,扎深的學習觀念讓我很容易接受新概念並延伸以前所學習的內容。

我將會把每一個 Java 的知識都好好整理一番,加深印象,複習 Java SE 時,也順便整理資料以供日後的自己參考。

能有什麼作用?

雖然說是入門教學,其實這次整理的學習筆記主要是給自己看的,有需要的朋友也可以看看,我們可以多多交流。




2018年3月31日 星期六

給還是學生的一封信

給還是學生的您:

當過學生,才知道學生的苦;出過社會,才知道世俗的悶。
小時候常常被灌輸念好書、做好事,絕不可以像誰.誰.誰...一樣,毫無出息;你要像誰.誰.誰...一樣,他有多好,她有多棒...,而這些價值觀慢慢在心中建立,也為了贏得這些只比我們早出生了幾十年的「長輩」們的賞識,在小小孩時代能夠求得安穩。也因為這樣,我養成有許多必須要做的事情和絕對不能做的事情,苦著讀書、苦著被約束,壓抑著內心深處真正的聲音...。這是18歲以前還是學生的我。