[Java] 介面及抽象類別的差異

介面是和抽象類別很像的東西,就把想到的打在下面,以免忘記。

(1)本身具有資料成員及抽象函式,必須以interface來宣告。

interface 介面名稱
{
  資料成員;
  抽象方法;
}

(2)資料成員必須初使化,本身為public static final 型態,亦可省略不宣告,由系統自動幫忙宣告。

(3)介面中若有多個函式,則必須同時宣告為abstract型態,且修飾子只能宣告為public或不宣告。

class 類別名稱 implements 介面1(,介面2,.....)
{
}

(4)介面不可使用new 運算子產生物件,而利用介面A打造新的類別B的過程,稱之為B實作介面A。

(5)可使用類別B實作多兩個以上的介面,但不可使用類別B繼承兩個以上的抽象類別。

>class 類別名稱 implements 介面1(,介面2,.....)
{
}

(6)介面和類別一樣,都具有繼承的功能,但一個子介面可繼承多個父介面,但一個子類別不可繼承多個父類別。

interface 介面名稱 extends 介面1(,介面2,.....)
{
}

(7)介面通常用來描述外部的能力,如機車的輪胎型狀等。

(8)需要使用迂迴的方式去找出實體類別間的對應關係,所以與抽象類別的速度相比之下,較為緩慢。

[Java] 什麼是抽象類別 (abstract class)呢?

Java 中有所謂的抽象類別,在他的API中,亦大量使用抽象類別,而抽象類別是什麼呢?海芋就將他整理如下:

(1) 目的:讓程式設計師能依據此類別,來修改或建立新的類別。

(2) 格式:

abstract class 類別名稱
{
資料成員;
抽象方法;
實體方法;
}

其中,抽象方法不能定義處理方法,且其修飾子亦不能為private,否則子類別無法繼承,進而無法改寫;而資料成員亦可不必初始化,可以由子類別實做並初使化。

(3) 子類別可繼承自抽象類別,並改寫抽象類別中,未定義的處理方式的抽象方法,或是已定義處理方式的方法或變數,但仍然要遵守單一繼承的規定。而抽象類別亦可以存取被子類別物件中,被子類別改寫的成員。

(4) 抽象類別不能用來直接建立物件,因為其定義未有明確的定義。

(5) 若子類別未能改寫父抽象類別中所定義的抽象方法,則此子類別亦需宣告為抽象類別。

(6) 抽象類別比較常用在產品的內部,如USB的接頭是固定的,但是傳輸速度可能會所差異,傳輸速度便可宣告為抽象類別,再由子類別去實做。

(7) 不需要使用迂迴的方式去找出實體類別間的對應關係,所以與介面的速度相比之下,較為快速。

剩下的有想到再補吧!有錯也歡迎指正唷!

[Java] 將字元、字串轉成大寫或小寫

我們可以透過Java中的 Character 這個 Class 底下的method,將字元轉成大寫或小寫,當然前提是要判斷他是不是英文字母。首先,我們先判斷他是不是英文字母的函式為:

public static boolean isLetter(char ch)

 

接下來,是要轉成大小寫的函式為

public static char toUpperCase(char ch)
public static char toLowerCase(char ch)

 

所以,如果要將一個字元 id 轉成小寫的字母,可以用以下的程式碼:

if(Character.isLetter(id)){
   id=Character.toLowerCase(id);
}

 

反之,如果要將一個字元 id 轉成大寫的字母,可以用以下的程式碼:

if(Character.isLetter(id)){
   id=Character.toUpperCase(id);
}

 

如果要將字串全部轉成大寫,也是一樣用「toUpperCase」,用法如下。

String str="Welcome";
str = str.toUpperCase();

結果就是:

WELCOME

 

如果要將字串全部轉成小寫,也是一樣用「toLowerCase」,用法如下。

String str="Welcome";
str = str.toLowerCase();

結果就是:

welcome

[Java] 產生亂數整數的方法

在 Java 中產生亂數有幾種方法,一般人最常用的就是 Math.random() 這個method,這個函式就是回傳一個正的double數值,他是介於 0.0~1.0 之間,但不包含 1.0的值。聰明的你一定想得到,如果我們要產生一個 1~42 的亂數,該怎樣做呢?答案其實很簡單,因為 Math.random()是回傳0.0~1.0之間的值,所以我們可以把 Math.random() 乘以42後,即會變成 0.0~42.0 的值,但不包含 42,再強制轉換成 int 型態後,再加上 1 即可。

用程式碼來說明,即是下列程式碼:

(int)(Math.random()*42+1)

 

第二種方法是使用 Random 這個 Class,以亂數產生整數而言,裡面有兩個函式,分別如下:

public int nextInt(int n)
public int nextInt()

 

就 nextInt(int n) 的原始碼如下:

public int nextInt(int n) {
   if (n <= 0)
     throw new IllegalArgumentException("n must be positive");

   if ((n & -n) == n)  // i.e., n is a power of 2
     return (int)((n * (long)next(31)) >> 31);

   int bits, val;
   do {
       bits = next(31);
       val = bits % n;
   } while (bits - val + (n-1) < 0);
   return val;
 }

 

nextInt() 的原始碼如下:

public int nextInt()
{
    return next(32);
}

 

舉例來說,如果要產生 1~100 的值,我們則可以使用 nextInt(int n) 這個函式,寫法如下:

Random r=new Random();
System.out.println(r.nextInt(100));

 

但如果要產生 0~232 的亂數,則必須要使用 nextInt() 了。

[Java] Polymorphism 多型定義

Polymorphism 又稱為多型,他的討論要在類別間有繼承關係才有意義,而他的定義很少發現有人能一次說得很清楚,所以海芋就以幾句話來帶過他。簡單來說,多型是指子類別繼承父類別時,同時改寫父類別的函式或變數,而我們可以宣告一個屬於父類別的變數,去存取子類別中改寫自父類別的函式或變數,這我們稱之為多型 Polymorphism 。

舉個生活一點的例子,若有一個父類別是動物,那麼有一個子類別鳥繼承自動物這個類別,當我們看到鳥的時侯,可以說牠是一隻鳥,也可以說牠是一隻動物。同樣的東西,卻有不同的表示型態。

舉個程式碼而言:

class Animal { 
 public int getLegs(){
 return legs;
 }
}
class Bird extends Animal{
public int getLegs() {
return legs*2;
}

public String getBirdCall() {
return birdCall;
}

public class MainProgram{
public static void main(String args[]){
Animal animal = new Bird();
animal.getLegs();
//animal.getBirdCall(); it's not ok
}
}

而在此例子中,animal是宣告給父類別,所以他只能認識父類別擁有的函式或變數,所以他能存取「getLegs()」這個函式。

而另一個要記的重點是,父類別若轉成子類別需要靠強迫轉型,子類別轉成父類別則是屬於自動轉型,而兄弟類別之類亦可以使用強迫的方式來轉型喔!

[Java] Overloading (多載) 和 Overriding (覆寫)

Overloading 和 Overriding 這兩個物件導向的名詞,常常讓人剪不斷,理還亂,可是偏偏大大小小的考試又愛考,老師在說又聽不懂,對於這兩個名詞只能說是霧裡看花。

 

但是,如果寫程式只是單單考名詞,那大概程式設計師會掛一半,因為大部份的人都是會寫程式,但不知道自己已經悄悄用到物件導向內的「觀念」,所以我就用我的認知,就 Overriding 和 Overloading 做一個簡單的區分及解說,當然如果有不對的地方,還是請各位程式設計師及專家學者們,多多指教及包涵。

 

Overloading有人將他稱為「多載」,是指說在「相同類別」中,定義「名稱相同」,但是「引數個數不同」,或是「引數型態不同」的函式,這樣JAVA就可以根據引數的個數,或是引數的型態,呼叫到對應的函式。Overriding 則是覆寫掉父類別中的函式。

 

首先,先舉例一下 Overloading,而 Overloading 就以JAVA中最常見也是最常用的 Arrays 類別為例子,引數不同,但函式名稱相同為必要條件。

static int binarySearch(byte[] a, byte key);
static int binarySearch(byte[] a, int fromIndex, int toIndex, byte key);

Read More

如何在 Windows 內安裝字型?

有些人擁有了字型光碟,卻不知道怎麼安裝字型,包括海芋一開使接觸 Windows 也一樣。儘管目前市面上的字型光碟都有很棒的安裝程式,但如果我們是從網路下載下來的免費字型,要如何安裝至 Windows 呢?這篇就以Windows XP為例,教大家如何安裝字型。

 

Step 1.
打開檔案總管,或按〔視窗鍵+E〕,並切換到「C:WINDOWSFonts」底下,或者進【控制台】,再打開【字型】即可。。

Read More

完全解析 Blogger 程式碼

從這一篇起,海芋將一連幾篇,慢慢解釋blogger的程式碼,讓您能迅速看懂並修改,而在做任何修改以前,您必須先到後台備分您的程式碼,或是開一個新的blog做實驗,另外建議使用EmEditor、PSPad、Notepad++等編輯器,以免找程式碼找到頭昏眼花喔!

 

好了,現在要開始進入程式碼的講解了,你準備好了嗎?準備好了就走吧!

 

首先,在修改大量程式碼之前,您必須做的一件事,就是將要修改的地方註解起來,萬一改壞了,您可以再還原回去,而在JavaScript和CSS中,註解有兩種型態,分別如下:

/*我是註解*/
//我是註解

其中,「我是註解」為讓您加上註解的部份。

但是,在HTML中,註解就不是這麼回事了,HTML的註解為以下的型態,相信眼尖的您,一定有發現那裡不一樣了吧!

<!-- 我是註解 -->

 

在聊完註解之後,接下來我們就要開始進入Template的部份了。而在此,海芋是以Blogger所提供的Template來講解。

 

首先,網頁的組成分為兩大部份,一個是頭,一個是身體,頭就是我們所謂的<head>,身體就是所謂的<body>,這些通通稱為網頁的標記(Tags),在頭的部份,包含了一開始就要執行的程式碼,身體則是包含了要提供給讀者的資訊,如果您對這些名詞很陌生,不妨先去找一下相關的HTML書籍觀看。

 

而在<head>中,有一個<title>的欄位,則是提供了這個網站的名稱,即在瀏覽器上會顯示的名稱,而在這裡,Blogger是用以下的程式碼來包裝。

<title><data:blog.pageTitle/></title>

 

其中,<data:blog.pageTitle/>所代表的意義為您在後台所設定的網誌名稱。

 

聊完了<title>之後,接著我們看到<b:skin>的項目,這到底是什麼呢?在這裡海芋偷偷告訴您一個小技巧,您可以將b看為blogger,skin很直覺地翻譯,即是皮膚、外皮,所以他就是blogger的外表,而這裡面確實也定義了許多的CSS,我們就簡單舉一下例子好了。

<Variable name="bgColor" description="Page Background Color" type="color" default="#efefef" value="#efefef">

 

其中他有幾個變數,blogger help分別描述如下:

  • name: 此名稱只能包含字母或數字,而且範本中的每一個名稱必須是獨一無二的
  • description – 可以是較具描述性的名稱,且可包含空格。 此變數會出現在 [字型和顏色] 標籤中。
  • type: 可以是「字型」或「顏色」,字型即為「font」,顏色即為「color」,另外也可以為自動,如「automatic」。
  • default: 預設值。 針對顏色,此變數應包含十六進位顏色代碼,例如 #FF0066。 針對字型,此變數會是 font-tyle font-weight font-size font-family 格式的清單。
  • value:為您對這個屬性所設定的值。

 

而這些值,被<Variable>包夾起來,即定義了一個名稱為「$name」的變數。以上例而言,我們定義了「bgColor」這個變數,他的值為「#efefef」,型態為「顏色」,而我們該如何存取這個值呢?

 

在Blogger中,亦提供了像PHP存取變數的方式,只要在存取變數的前面,加上「$」這個符號,即可存取了,以一段小程式而言:

body {
background: $bgColor;
margin: 0;
padding: 0px;
font: x-small Verdana, Arial;
text-align: center;
color: $textColor;
font-size/* */:/**/small;
font-size: /**/small;
}

 

而這段為CSS的程式碼,他亦必須包含在中。

 

好了,大概講完頭部的東西了,接下來的文章,海芋將再慢慢介紹給你其它的項目,敬請鎖定喔!

[PHP] include_once 和 require_once

include_once 和 require_once都是PHP的函式,主要是要包含其它的檔案進來,而且萬一該檔案被包含過了,則不會重新再包含一次。

而基於PHP不可能開發同一個函式的情況下,去試了一下他的不同之處,在於include_once萬一遇到錯誤,則會持續執行,但require_once則會停止執行,並產生Fatal Errors。

以程式碼說明如下:

檔名:test.php

<?php
  require_once("a.php");
  require_once("c.php");
  echo dirname(__FILE__)." in test.php\n";
?>

 

檔名:a.php

<?php
  echo dirname(__FILE__)." in a.php"."</br>";
  require_once("b.php");
?>

 

檔名:b.php

<?php
  echo dirname(__FILE__)." in b.php"."</br>";
?>

 

Read More

[Java] 將浮點數和整數數值轉為字串

前面分別講過如何將字串轉為浮點數和整數,而這一篇則是介紹如何反其道而行,將浮點數和整數數值轉為字串。

首先,我們分別看到Integer、Float、Double三個Class中,都有一個method,叫做「toString()」,而我們來看他的函式原型。

public static String toString()

而這個類別的用法也很簡單,也是同樣用一個範例來說明,Integer和Float的用法則也是類似。

 double a = 123.456;
Double.toString(a);

Read More