發表文章

目前顯示的是 2017的文章

求1000和495的最大公因數

就想踢館這連結( https://zh.wikipedia.org/wiki/%E6%9C%80%E5%A4%A7%E5%85%AC%E5%9B%A0%E6%95%B8 )中的Java寫法, 想用最直覺方式求值,覺得連結中的有點高級或是太假掰XD, /**  *  * @author lucrecia  */ public class Hk3_1 {     public static void main(String[] args) {         int m = 1000;         int n = 495;         List<Integer> list = new ArrayList<Integer>();         for (int i = 1; i < 1000; i++) {             if (m % i == 0 && n % i ==0) {                 list.add(i);             }         }         int maxValue = Collections.max(list);         System.out.println(maxValue);     } }

從Ant、Maven到Gradle

最近還沒能找到空檔了解這3樣工具, 先keep下來(連結依學習順序放): http://www.codedata.com.tw/java/understanding-gradle-1-ant/ http://www.codedata.com.tw/java/understanding-gradle-2-maven/ http://www.codedata.com.tw/java/understanding-gradle-3-getting-started/ http://www.codedata.com.tw/java/understanding-gradle-4-gradle-script/ http://www.codedata.com.tw/java/understanding-gradle-3-gradle-task-abc/ http://www.codedata.com.tw/java/understanding-gradle-4-java-project-build-script-customization/ http://www.codedata.com.tw/java/understanding-gradle-7-java-project-dependencies/

differences between app server & web server

剛好看到, 這篇講得滿好的 http://www.javaworld.com/article/2077354/learn-java/app-server-web-server-what-s-the-difference.html

更多了解superclass和subclass的互動

第一個可多了解的是: 當subclass需要用到superclass的method, 並想再對這method額外加上自己的行為 時(也就是說subclass不想完全override掉superclass的method)? --> ans. 可使用super這個關鍵字       e.g.       public void walk() {           super.walk();                         --> 先執行super版的walk()           // subclass's own walk stuff   --> 再回來執行sub版自訂的行為/功能       } 第二個可多了解的是superclass的"存取權限(access level)": --> 共有4種權限(權限最受限制到最不受限制為由左到右排):       PRIVATE -> DEFAULT -> PROTECTED -> PUBLIC --> 這些存取權限控制誰可以接觸什麼, 目前先討論public & private:       public的member會被繼承       private的member不會被繼承

設計繼承步驟 & IS-A test

如何設計繼承的步驟分為5個: step 1: 找出具有共通屬性&行為的物件 step 2: 設計代表共通狀態&行為的class step 3: 決定subclass是否需要有特殊設計的method(也就是讓某行為具有特定不同的表現方式) step 4: 透過尋找使用共通行為的subclass來找到更多抽象化的機會 step 5: 最後完成class的繼承階層 IS-A test: 此測試是適用繼承階層的任一地方, 也就是說, 如果繼承階層樹被設計地很好, --> 則所有的subclass皆應通過任一個上層superclass的IS-A test。 e.g. (繼承順序由上到下) class Animal:     makeNoise()     eat()     sleep()     roam() -->     class Canine:         roam()     -->         class Wolf:             makeNoise()             eat() 寫好繼承階層樹後, 開始做IS-A test: 1. Canine extends Animal    --> 通過 2. Wolf extends Canine    --> 通過 3. Wolf extends Animal    --> 通過 4. Canine IS-A Animal    --> 通過 5. Wolf IS-A Canine    --> 通過 6. Wolf IS-A Animal    --> 通過 可以這麼說: --> Wolf是一個Canine, 所以Canine能做的事Wolf都能做 --> 而且Wolf也是個Animal, 所以Animal能做的事Wolf也都能做 注意: 當我們說"如果X IS-A Y合理"時, 有以下這些可能性:     1. 這兩者或許存在於同一個繼承架構下     2. 這兩者根本是相同的, 或剛好擁有相同的行為 需要記得"X IS-A Y" --> 隱含X可做出任何Y可做的事

繼承簡介

當我們說"a class繼承自b class" --> 以Java方式說: subclass extends the superclass --> 意為subclass繼承了superclass的成員(member) 那什麼是"member"? --> 一個class的member包含:        1. instance variable       2. method subclass可以: 1. 新增自有method 2. 覆蓋(override)過superclass所提供的method, 以改善或延伸superclass原本method內容 最後, 為何instance variable不能被override掉? --> 因instance variable沒有被定義特殊的行為,所以並不需要這麼做。 如果今天subclass需要某instance variable是別的內容, 可以直接在subclass中將該instance variable賦予自己想要的值就好。 e.g.      superclass中, int size = 2;     subclass中, 直接寫int size = 3;  

指定自己使用到的class完整名

class完整名稱: e.g. java.util . ArrayList  (黃底: package名稱; 藍底:class名稱) 有兩種方法能指定class, 第一種是我想要的那種: import java.util.ArrayList; 第二種是隨時用到該class時便要打出全名, e.g. java.util.ArrayList<Egg> list = new java.util.ArrayList <Egg>(); --> 標橘底是全名 p.s. 只有來自於java.lang這個package不用指定全名。  -->  因為java.lang經常被使用到,所以是個會被預先引用的package

mapping between Java & SQL data type (in JDBC)

有兩個參考連結: http://www.service-architecture.com/articles/database/mapping_sql_and_java_data_types.html https://www.ibm.com/support/knowledgecenter/zh-tw/SSGU8G_11.70.0/com.ibm.jccids.doc/src/tpc/imjcc_rjvjdata.htm

如何在mac版的Eclipse workspace中找到.metadata?

圖片
如果有寫過JSP, 會知道它會編譯成.java和.class檔, 而要看到它們要到.metadata裡找, 但是mac不像Windows會顯示出.metadata檔案夾, 而是需要去終端機(terminal)下指令才能顯示: 下面截圖是我在終端機下完指令後出現的樣子: 以下是顯示步驟: 1. 打開terminal 2. 輸入: /Applications/Utilities 3. 接著     有分版本: (參考連結: http://osxdaily.com/2009/02/25/show-hidden-files-in-os-x/ )  擷取連結重點如下 -->     Enter the proper command exactly as shown below, choosing for your version of MacOS or Mac OS X: a.) For showing hidden files and folders in OS X El Capitan 10.11, Yosemite 10.10, and OS X Mavericks 10.9, use the following command string to show hidden files: defaults write com.apple.finder AppleShowAllFiles TRUE;killall Finder b.) For showing hidden files in Mac OS X 10.8 Mountain Lion, OS X 10.7 Lion, Mac OS X 10.6 Snow Leopard, and before, use this defaults command string instead: defaults write com.apple.Finder AppleShowAllFiles TRUE;killall Finder 再輸入(因為我的mac符合a條件):  defaults write com.apple.finder AppleShowAllFiles TRUE;killall Finder 完成, .metadata就找到了

如何在macbook pro上安裝Eclipse、tomcat、mariadb、MySQLWorkbench?

圖片
因為之前為了搶時間學JSP, 所以採取windows 10下完成這4個軟體的安裝, 所以今天下午花了5hr左右在mac 10.12.3(macOS Sierra)安裝完所有所需軟體... 覺得比在Windows下更難安裝好, 因為完整安裝資源介紹少很多... (p.s. 圖片部分點選皆能放大顯示) mac本身有內建jre, 如果想確認真的有無內建或jre版本: 在終端機(terminal)打: java -version 自己也在 mac 中找到它內建的位置如下圖 : 首先先安裝Eclipse neon 2(單純是現在最新版), 安裝檔連結: https://www.eclipse.org/downloads/download.php?file=/oomph/epp/neon/R2a/eclipse-inst-mac64.tar.gz 這裡沒有任何安裝難度。 接著要安裝tomcat v.9.0(單純是現在最新版), 安裝前要確認的東西如下: 確認有jre(這在安裝Eclipse有先做確認了) 因為安裝時需要在終端機打sudo的指令, 也因此我為自己的root帳號設了密碼,        —> 原因和解法請見這兩個連結:                https://support.apple.com/zh-tw/HT202035               https://support.apple.com/zh-tw/HT202860 確認上述需要條件皆有滿足, 可以進入安裝tomcat的正題了, 以下3個連結可以交互參照, 以確保能走完全部的tomcat安裝流程(看連結的優先度是最上面po出的連結參考價值最高,價值依po的順序遞減): https://marcelochong.wordpress.com/2015/03/27/mac-os-10-%E5%AE%89%E8%A3%9D-tomcat-8/ http://iphone4.tw/forums/showthread.php?t=159261 https://wolfpaulus.com/mac/tomcat/ 最後

eclipse相關環境設定除錯

今天整晚都在處理eclipse相關問題, 不是eclipse突然打不開或一直閃退, 就是終於解決能進入eclipse後, java檔找不到jre路徑, 然後終於解決能在java檔中找到jre後, 又發生jsp找不到String Class(因找不到jre), 只能不斷告訴自己要有: 愛心+耐心+細心, 終於都解決了, 把找到的連結po上: 不是eclipse突然打不開或一直閃退的solution:  http://blog.csdn.net/dean_deng/article/details/6655784 又發生jsp找不到String Class的solution (連結中的問題是解決找不到tomcat的問題, 我是用同理可證的思考,用同樣方式去解決找不jre的問題): https://zhidao.baidu.com/question/127946255.html 雖然今晚都沒練到如何寫jsp, 但至少環境問題都解決了(希望明早醒來eclipse不要又突然掛掉QQ)

System.in & System.out & System.err

從這篇連結擷取自己想要的部分:  https://blog.yslifes.com/archives/821 Java的輸出及輸入控制大都定義在java.io.*裡, Java IO大概分成2大類: 1. byte的讀取與寫出,可讀取寫入二位元binary的資料; 2. char的讀取與寫入,提供文字的讀取與寫入。 System類別並不屬於java.io的套件,而是屬於java.lang套件,在使用時預設載入,所以並不需要特別去import它。 1. System.in --> 通常是指鍵盤的輸入,為java.io.InputStream類別 System.in: System.in為InputStream串流類別,可直接使用: - read(byte[]) 來取出輸入內容 - read() 取出每次輸入的ascii數字(再轉換成字元char) - 利用 BufferedReader 來直接讀取一行內容等等 p.s. 鍵盤的輸入完成預設為enter鍵,也就是\r\n。 (char)read(): 因對於中文字部份無法判別,需要先把讀入的字元全部放進一個char 陣列,再利用 new String(char[]) 來使中文字正常 (p.s 請見連結內的example code: 連結: https://blog.yslifes.com/archives/821 ) 2. System.out --> 通常是指Console螢幕輸出,為java.io.PrintStream類別 3. System.err --> 同System.out,主要是用在系統出錯時輸出至Console螢幕 (p.s. Java本身在處理字串時均是使用utf8 uncode的方式,不過在Windows的Console(螢幕)字串的顯示與輸入都是使用ISO-8859-1編碼,所以需要先把字串轉換成Big5再行輸出,在Linux上則不會有這種問題。) 文章參考來源:  https://blog.yslifes.com/archives/821

ArrayList

ArrayList的相關方法:     - add(Object elem) : 新增物件參數到ArrayList        p.s. add(Int, Object) --> 可依指定索引值去新增物件     - remove(int index) : 從索引參數移除對應的物件     - remove(Object elem) : 移除物件(如果該物件有在ArrayList裡的話)     - contains(Object elem) : 如果有該物件參數, 則返回true     - isEmpty() : 如果ArrayLista沒有元素時, 則返回true     - indexOf(Object elem) : 如果有找到該物件的索引值,則返回其索引值; 如果沒有找到該物件的索引值,則返回-1     - size() : 返回目前在ArrayList中有多少個元素     - get(int index) : 返回目前該索引值所對應的物件 p.s. Java 5.0中的ArrayList是參數化的(parameterized):       e.g. ArrayList<Egg> myList = new ArrayList<Egg>();             --> 代表建構出Egg型別的ArrayList       e.g. ArrayList<String> myList = new ArrayList<String>();             --> 代表建構出String型別的ArrayList p.s. ArrayList和一般陣列不同,       --> 如在刪除某元素時,             在ArrayList的操作: myList.remove(1);             在一般陣列的操作: myList[1] = null;       --> 如想知道是否含有b元素,             在ArrayList的操作:                 boolean isIn = myList.contains(b);             在一

轉貼JS blog文: socket介紹

畢竟是Java中的socket介紹, 所以轉貼一下 連結:  https://lucrelin.blogspot.tw/2017/03/socket.html

如何建立建構子(constructor)?

連結:  http://pydoing.blogspot.tw/2010/11/java-constructor.html 這篇寫的簡潔明白, 無法擷取, 都是重點...

cast運算元

用途: 用於強制型別轉換 之前在講到primitive時, 有說過較小型別的primitive不能裝在較大型別的primitive, 但是如果要硬來, 把較大型別的primitive塞進較小型別的primitive, 就用cast達到目的。 e.g. long y = 40002; short x = (short) y;  // x = -25534; p.s. short的值域: -32768到32767 e.g. float f = 3.14f; int x = (int) f;  // x = 3; 以上標橘底為cast運算元。

加強版的for loop

從Java 5.0 (Tiger)開始有加強版的for loop, 優點: 可對"陣列"或"其他集合(collection)"的元素做輪巡(loop through) 寫法: for (String name: nameArray) {} --> 如果以中文解釋上面在做啥: "對nameArray中的每個元素執行一次" 編譯器會如何判定上述寫法: a. 建立名稱為name的String變數 (注意: 此變數型別要和陣列元素相容) b. 把 nameArray的第一個元素值指派(assign)給name (注意: ":"代表"in") c. 執行重複的內容(也就是{}中的statements) d. 指派下一個元素值給name e. 重複執行到所有元素都被輪巡完為止

使用==比較兩個primitive或判別兩個reference是否參照同一個物件

當使用==比較兩個primitive, 我們不在意兩個型別是否一樣, 只在意兩個位元組合是否相等, e.g. int a = 3; byte b = 3; if (a == b)  {  // true  } 當使用==比較兩個reference是否參考同一個物件, 我們不在意兩個物件上意義是否相等, 只在意兩個reference是否參考、指向同一個物件, e.g. Foo a = new Foo(); Foo b = new Foo();  --> 又和記憶體要一個新空間, 所以和 a 要的原本的記憶體空間是不同的, 也因此是新的物件 Foo c = a; if (a == b) {  // false  } if (a == c) {  // true  } if (b == c) {  // false  } p.s. 真的要看兩個物件意義上是否相等, 用equals()看。

instance variables v.s. local variables

兩者差別: 1. instance variables是宣告在class內, 而非method內 2. local variables是宣告在method內 3. local variables在使用前必須初始化過。    e.g.      class Foo {        public void go() {            int x = 2;   --> 錯誤寫法: int x; (這樣編譯器會報錯)            int z = x + 3;        }    } 注意: local variables沒有預設值, 而instance variables一定有預設值(不管開發者有沒有設)

實體變數(instance variables)永遠都有預設值

integers(包括char) 預設值為0 floating points 預設值為0.0 booleans 預設值為false references(物件參考) 預設值為null (注意: null代表沒有操作對象的"指位標", 它是個參考, 而非物件本身) 以下這麼寫仍會有預設值: e.g. int size; String name;

隱藏資料--封裝的基本原則

封裝的基本原則: 將instance variables標示為private 將getters與setters標示為public --> 利用getters和setters控制存取動作 這樣能維持安全性 e.g. class GoodDog { private int size; public int getSize() { return size; } public void setSize(int s) { size = s; } void bark() { if (size > 60) { System.out.println("Wooof! Wooof!"); } else if (size > 14) { System.out.println("Ruff! Ruff!"); } else { System.out.println("Yip! Yip!"); } } } class GoodDogTestDrive { public static void main (String[] args) { GoodDog one = new GoodDog(); one.setSize(70); GoodDog two = new GoodDog(); two.setSize(8); System.out.println("Dog one: " + one.getSize()); System.out.println("Dog two: " + two.getSize()); one.bark(); two.bark(

argument可以是"值"或"變數"

argument可以是"值"或"變數" e.g. 當作值傳入: void go() {     TestStuff t = new TestStuff();     t.takeTwo( 3, 7 ); } void takeTwo(int x, int y) {     int z = x + y;     System.out.println("Total is " + z);              // Total is 10 } e.g. 當作變數傳入: void go() {     TestStuff t = new TestStuff();     int foo = 7;     int bar = 3;     t.takeTwo( foo, bar ); } void takeTwo(int x, int y) {     int z = x + y;     System.out.println("Total is " + z);              // Total is 10 }

argument(引數) & parameter(參數)

這兩者的差別, 在JavaScript與Java是相同的, argument是傳給method的值。 而當argument傳入method後就成了parameter。 而parameter等同於"區域變數(local variable)"。 重點: 如果某method需要parameter, 那麼我們一定得傳argument給它。 e.g. Dog d = new Dog(); d.bark( 3 );                                          // 3為argument void bark( int numOfBarks ) {                //numOfBarks = 3 --> 此時3為parameter(注意型別要相對應)     while ( numOfBarks > 0) {               // 在此numOfBarks當一般區域變數使用         System.out.println("ruff");         numOfBarks = numOfBarks - 1;     } }

原始型別(Primitive Types)的大小和範圍

Java的變數分為兩種: 1. primitive 2. object reference 現在只看primitive部分-- boolean (JVM決定位元數) : true/ false char 16bits : 0~65535(為值域) 數值(帶正負號):     integer         byte  8bits : -128~127(為值域)         short  16bits : -32768~32767(為值域)     int  32bits : -2147483648~2147483647(為值域)     long  64bits : -很大~+很大(為值域) 浮點數:     float  32bits : 範圍規模可變(為值域)     double  64bits : 範圍規模可變(為值域)

如何產生全域(global)變數&全域method?

對於全域變數: --> 任何變數只要冠上public、static、final都可變成全域取用的常數。 對於全域method: --> 在任何class中的任何程式都可存取public static的method p.s. 在Java的OO觀念中沒有"全域"這件事, 但在實際操作時會需要被任何程式存取的情形, 因而有"全域"的說法。 p.s. 宣告在method中的變數叫"區域變數(local variable)"。

main()的兩個用途

之前有稍微介紹過main(), 用途1: 測試真正的class 用途2: 啓動你的Java程式(當作應用程式的起跑點) 注意: 真正的OO應用程式是"物件與物件之間的互動(互動是指相互叫用的method)", 而main()只是用來啓動真正的Java應用程式

class & object

類別(class) !== 物件(object), class是object的藍圖或模子。 object也可視為是個實體(instance)。 object本身可分為:     1. 本身已知的事物(代表物件的狀態資料), 稱: instance variable(實體變數) -> state     2. 可以執行的動作,稱: method -> behavior object帶有讀取/操作instance variable的method是很常見的。 以下舉一個object例子: e.g. ShoppingCart object: --> state: cartContents --> behavior: addToCart()                      removeFromCart()                      checkOut()

System.out.print v.s. System.out.println

這兩者差別在於, System.out.println 會讓後續的輸出以新的一行開始, 但 System.out.print 的後續輸出仍會和之前的輸出同一行(也就是新的輸出不會另起新行)

main()

一支程式(不管有多少個class)只要一個main()作為程式的起跑點。 e.g. public class MyFirstApp {     public static void main (String[] args) {   // 標黃底就是main(), 為程式的起跑點         System.out.print("I Rule!");     } }

Java的程式結構

class存於原始檔(副檔名: .java)中, 檔案內容中寫: public class Dog {       // 最外層是class: class用來表示程式的一個組件     void bark() {           // 次層是method: method需宣告在class內, 表示方法 (可將method想成是一個函數或程序)         statement 1;       // 內層是statements: 表示方法應執行的指令         statement 2;      // 內層是statements: 表示方法應執行的指令     } }

我的另個舊網誌-- 關於JavaScript的那些事

為何想叫"小步舞曲"? 因爲我還是以寫JavaScript為主... 所以Java為輔, 是因為工作需要所以開始開新網誌, 就像寫code希望能在自己能力範圍切割好每個function功能, 所以不想將JavaScript和Java寫在同個網誌, 關於JavaScript的那些事連結:  https://lucrelin.blogspot.tw/

在我的Macbook Pro寫java

這兩篇一起看可以在Macbook Pro寫java 目前自己的Macbook Pro是OSX 10.12.3版本 http://subowxd.becoder.org/2016/03/01/java-macosx-terminal/ http://appsgaga.com/%E5%88%86%E4%BA%AB-%E5%A6%82%E4%BD%95%E5%9C%A8-mac-%E9%9B%BB%E8%85%A6%E4%B8%8A%E9%9D%A2%E5%AF%AB-java-%E7%9A%84%E7%A8%8B%E5%BC%8F/