PIXNET Logo登入

Kalin的部落格

跳到主文

歡迎光臨Kalin在痞客邦的小天地

部落格全站分類:不設分類

  • 相簿
  • 部落格
  • 留言
  • 名片
  • 10月 16 週日 200505:51
  • MSN Space + Windows media player

1.修改 MSN Space 的時候,在 URL 後面加上 &powertoy=musicvideo 就可以.
2.比方: 原先的 URL 應該是:
http://spaces.msn.com/members/你的名稱/PersonalSpace.aspx?_c02_owner=1&_c=
只要在這個後面加上 &powertoy=musicvideo 
所以變成: 
http://spaces.msn.com/members/你的名稱/PersonalSpace.aspx?_c02_owner=1&_c=&powertoy=musicvideo
然後你會發現在"自訂","模組"裡就多了一個 Windows media player, 將它新增就可以了.
(繼續閱讀...)
文章標籤

Kalin 發表在 痞客邦 留言(0) 人氣(10)

  • 個人分類:Music
▲top
  • 10月 09 週日 200505:00
  • EJB 簡介


何謂EJB:
 
Eenterprise JavaBean 很簡單. ㄟ~ 至少比自己寫一個具延展性(scalable), 交易性(transctional), 安全性(secure), 又能支援多人多工(concurrent) 能力的企業級伺服器相比的話. ps: 但是它"不保證"負載平衡(load-balance), 容錯(fail-over), 和叢集(clustering).
 
使用EJB, 可以研發出像積木一樣的EJB Component, 這可以讓你或其他人組合出新的或是重組到不同應用程式的元件. 你可以利用宣告的方式來設定和客制化bean (透過XML為基礎的佈署描述檔 Deployment Descriptor; DD) 來改變執行時期bean的特性. 換句話說, 就是在部署時期透過改變XML文件來改變一個bean使用底層服務的方式. EJB 不單只是寫一次到處跑(write once run anywhere), 而是寫一次到處裝(write once deploy anywhere)
 
EJB 讓人專注在商業邏輯上, 而將所有底層的服務交給EJB伺服器的供應商(Server Vendor)來解決. EJB Server提供了一堆services, such as 交易管理(Transaction management), 安全控管(Security), 多人多工(Concurrency), 網路通訊(Networking), 資源管理(Resource management), 存續管理(Persistence), 訊息服務(Messaging), 佈署時期的客制化(Deploy-time customization).
 
 
Q: EJB和J2EE有什麼不同?
A: J2EE和EJB都是對伺服器的規範, 實際上EJB是J2EE的子集合, 換句話說, 一個J2EE伺服器裡面包含一個EJB Container. 所以每個 J2EE Server 必須包含一個 EJB Container 和一個 Web Container(to run JSP & Servlet).
 
Q: 可以在Java類別裡撰寫商業邏輯程式碼, 然後在 bean 裡去呼叫這些商業邏輯方法, 這樣我就可以再利用這些商業邏輯嗎?
A: 可以, 如果你的 bean 呼叫一個不是 bean 的 Java 類別上的方法, 那個方法還是在 Container 的控制範圍之下, 所以只要關係到了 Container, 那些非 bean 的方法也會變成 bean 的一部分功能.
 
Q: 一般 javabean 和 enterprise javabean 有何不同?
A: 一般 javabean 是指一些根據命名原則所撰寫且可以被開發工具使用的可在利用元件. 且絕大部分都被利用在開發時期, 主要是為了讓一個 bean 的 event 更簡單快速的聯接上別的 bean 的方法, 或是改變instance variable value. 就像其他一般的 class 一樣, 可以在 JVM 裡面執行. 可利用在 Swing, Jini, Servlets...等, 但是一個 enterprise javabean 必須在一個 EJB Container 的控制下執行, 且在執行時期才會被交出來. 在一個 EJB 裡面絕大部分的方法都是 Container 自己去呼叫的. 而這些方法到了 Server 外就變得沒有意義了.
 
 
EJB Server 裡面的三大部分: 
 
1. EJB Object: 會干涉所有對 bean 的呼叫, 所以用戶端永遠不能跟 bean 直接交談. The EJB object is the bodyguard for the bean... it intercepts the calls coming from the client and passes the request to the Container. 這使得 server 或 container 有機會介入並加入一些底層的服務(container services).
 
2. Container services: The Container services are the things you’re paying for... the reason you’re using EJB in the first place - transactions, security, persistence, etc.
 
3. EJB: The bean has the real business logic. It has the actual functionality (method code) to do whatever it is this remote service is supposed to do (track your shopping cart, do a big calculate, update a customer’s address, etc.
 
 
 
三種 bean:
 
1. Entity: 使用一個 entity bean 來代表在永續儲存體(persistence store) 裡面的一個東西, 通常會來代表資料庫裡的某個東西, 而一個 entity bean 的一個實體(instance) 代表 table 裡的一筆資料. 一個典型的 entity 範例就是 Customer, 其中一個實體可能代表 Bo Olean(ID# 343) 而另一個 instance 可能代表 Trixia Lin (ID# 870).
 
2. Message-driven: 當你需要一個 JMS 用戶時就可以使用 message-driven bean. 換句話說, 它可以監聽來自 JMS 信息服務的信息. 就如同規範一樣, 用戶端永遠不可能直接呼叫 message-driven bean, 但是 message-driven bean 沒有 EJBObject, Client 必須發送一個信息給信息服務, server 會直接從信息服務取得用戶端的請求.
 
3. Session: entity bean 通常代表一個東西, 而 session bean 代表一個處理程序(process). 除了上述所有的事情以外, 都使用 session bean. 幾乎所有型態的後端服務都可以, 也通常應該要由一個 session bean 起始. 這是因為通常會使用到一種叫做 Session Facade 的 Design Pattern.
 
兩種 Session bean:
 
3-1. stateful 的 session bean: 可以在方法呼叫的過程中記住交談狀態(conversational state, 就像購物車).
 
3-2. stateless bean 一旦等到被呼叫的方法完成了以後就會直接把這個 client 給忘掉. 不過這不代表用戶端不會持續的呼叫這個 bean 來記住與前一次的方法呼叫有關的狀態. 一個stateless bean 還是可以有 instance variable, 它只是無法用來維持屬於某個特定用戶的值.
 
雖然 stateless session bean 比 stateful session bean 要來的延展性(scalable)(因為這跟 Contaniner 如何管理 stateless session bean ),  但是當你需要交談狀態時, 你應該考慮 stateful session bean, 還有就是當使用替代方法來保存時所造成的效能影響比 stateful session bean 還大的時候.
ps: 這裡指的保存狀態像是讓用戶端來保存狀態, 或用 servlet 來保存狀態, 甚至使用資料庫來保存這個用戶端災呼叫每個方法與方法之間的狀態. 
 
* Entity bean 可能代表的是在酒吧裡賣的各種飲料及每個客戶, 但是沒有調酒師, 飲料對客戶有什麼意義? 你需要有個人把實體的東西(飲料與客戶) 透過某種意義連結在一起, 那就是 session bean 要做的事情!
 
 
 
建立一個 EJB 要做的五件事情:
 
1. 撰寫具有商業邏輯的 bean class.
 
package headfirst;
import javax.ejb.*;
public class AdviceBean implements SessionBean
{
 private String [] adviceStrings = {"test", "test1", "test2", "test3"};
 public void ejbActivate() //必須實作來自 SessionBean 的 method
 {
  System.out.println("ejb activate");
 }
 public void ejbPassivate() //必須實作來自 SessionBean 的 method
 {
  System.out.println("ejb passivate");
 }
 public void ejbRemove() //必須實作來自 SessionBean 的 method
 {
  System.out.println("ejb remove");
 }
 public void setSessionContext(SessionContext ctx) //必須實作來自 SessionBean 的 method
 {
  System.out.println("session context");
 }
 
 public String getTheMessage() //來自 component 的真正的商業邏輯, 也是 Client 想呼叫的東西
 {
  System.out.println("in get advice()");
  int random = (int)(Math.random()*adviceStrings.length);
  return adviceStrings[random];
 }
 public void ejbCreate() //不來自 SessionBean, 但是是一個 EJB 規則, 必須要有這個 method
 {
  System.out.println("in jeb create()");
 }
}
 
2. 為這個 bean 寫兩個 interface (Home & Component).
 
HOME 介面: Client 使用 home interface 來要求一個對 component interface 的參照. 這個 home 是 client 為了要取得一個對 bean reference 的起始點(或至少 client 會認為這是一個 bean ). 我們可以先把 home 想像為某個製造和散佈 bean 的 reference 給 client 的工廠.
 
package headfirst;
import javax.ejb.*;
import java.rmi.RemoteException;

public interface AdviceHome extends EJBHome
{
 //create() 必須回傳一個 component interface 型態
 public Advice create() throws CreateException, RemoteException;

}
 
COMPONENT: 所有商業邏輯宣告的地方. 換句話說, 就是把所有 client 想呼叫的 method 都放在這裡.
 
package headfirst;
import javax.ejb.*;
import java.rmi.RemoteException;

public interface Advice extends EJBObject
{
 //實際的商業邏輯 必須對應到 bean class 裡面的 method
 public String getTheMessage() throws RemoteException;
}
 
Q: 為何 bean class 必須要有和 component interface 相同的 method 卻不去實作 component 呢?
 
A: 規範裡不建議這樣做, 因為:
 
1) component extends EJBObject, 而 EJBObject 不是一個標誌介面, 它是具有一些方法的, 這意味著任何一個實作 component 的 bean 也必須實作 EJBObject 的所有方法. 而且, EJBObject extends java.rmi.remote interface, 所以如果 bean 真的 implements component, 那也代表 bean 將成為一個 remote class, 這永遠都不該發生! 因此除了 server 本身以外, 永遠不應該用任何東西, 任何方式去存取 bean.
 
2) 雖然對 client 來說, 好像是直接呼叫 bean class 的 method, 但是真正來說, 是呼叫 component 的 method, 換言之, client 真正呼叫的是 EJBObject, 這是 server 在 deploy 時實作出來的. client 永遠, 永遠, 永遠不會直接跟 bean 互動.
 
3) 透過 component interface 的 implements EJBObject(由 server 製作出來的 EJBObject ), 也就是 remote object, 它會干預所有對這個 bean 的 business logic method 的呼叫. 
 
4) 所以我們透過 server 來檢查 component interface 與 bean class 的 method 是互相吻合的.
 
 
重點來了!!
1. component interface  has to implements EJBObject.
2. this bean has to implement SessionBean, and can't implements component.
3. verify the same methods of bean & component via a deployment tool.
 
3. 建立一個 XML 的 Deployment Descriptor; DD, 來告訴 server:  是哪一種 bean, 和如何管理它. 必須將它命名為 ejb-jar.xml. DD 必須放在一個稱為 META-INF 的目錄下.
 
4. 將這個 bean, 兩個 interface, 和 Deployment Descriptor 放進一個 ejb-jar檔(一個 ejb-jar 檔案裡面可能會有一個以上的 EJB, 但是只會有一個 DD). 
 
ps: 以上4個步驟都是 Bean Provider (bean 開發人員) 需要做的.
 
5. 利用 server vendor 所提供的工具把這個 bean deploy 到 server 上. 其實這步驟包含了兩各步驟:
5-1. 組成應用程式(Application Assembly): 整合不同的 bean 跟一個 DD 放在一個全新的 ejb-jar 檔. 在整合的階段, 也需要加入一些 Bean Provider 不知道的事情到 DD 裡面.
5-2. 佈署(Deployment): deployment 的兩個關鍵部份就是:
5-2-1) 命名 bean, 所以 client 會知道如何找到 bean.
5-2-2) 讓 bean 進入到 container 的控管範圍.
 
 
 
EJB 參與人員的腳色與責任:
 
Bean Provider:
應交付事項: ejb-ja 檔案.
責任: 撰寫 bean 的原始碼.
特性: 知道 business logic.
 
Application Assembler:
應交付事項: ejb-ja 檔案(加上 bean provider 資訊成為應用程式組合資訊). 同時也有可能建立 client 和定義與其他元件的互動關係, 如: JSP.

責任: 結合一個或多個 EJB 到一個更大的應用程式. 有時會扮演 bean provider 的腳色, 將新的和現存的 bean 混合在一起建立一個 application. 並為這個 application 定義安全控管和交易特性.

特性: 知道 business logic. 但不需要像 bean provider 寫那麼多的程式.

 


Deployer:

應交付事項: 對特定的運作環境客制化 EJB, 然後 deploy 到 server.

責任: 將 Application Assembler 交付的東西拿來研究裡面的佈署敘述, 然後解決任何依賴到外部的東西. 如果 bean 依賴在某個資源上, 這各 deployer 必須從 bean provider 對應的邏輯名稱再對應到這個 server 上真正的資源名稱. 簡單的說: 當 Bill 撰寫 bean 的原始碼時候並不知道它會被放到 Dick 的 server 上. Bill 為 Database server 捏造了一個假的名稱, 而 Dick 必須將這個假的 Database 名稱連接到真實的東西上.

特性: 知道 server 裡的設定, 還必須知道如何將 bean provider 和 application assembler 提供的 Deployment descriptor 做怎樣的修正.

 


Container 和 Server Vendor:

應交付事項: EJB 共容伺服器, 佈署工具, EJB 執行環境.

責任: 按規範實作出相容的 Container 或 Server.

特性: 分散式物件與交易, 和底層低階系統服務的專家.

 
 
 
Client 必須要做的 5 件事:
 
1. 取得一個對 JNDI InitialContext 的 reference.
 
2. 使用 InitialContext 去 lookup 那個 bean 的 home interface. 換句話說, 就是使用在 deploy 時所給的 JNDI 名字去 lookup.
 
3. Narrow 和 Cast 我們透過 lookup 傳回來的東西, 而這個東西實作了 home interface.
 
4. 呼叫在這個 home interface 上的 create(), 去取得一個對 component interface 的 reference.
 
5. 呼叫 component interface 上的 business logic method.
 
 
 
 
 
 
Reference : Head First EJBtm scbcd 專業認證指南 
 
(繼續閱讀...)
文章標籤

Kalin 發表在 痞客邦 留言(0) 人氣(2,455)

  • 個人分類:EJB
▲top
  • 10月 03 週一 200519:53
  • 重複運用Classes (Composition & Inheritance)

兩種方法可以重複運用Classes:
1. composition(複合): 在新的Class中產生既有的Class物件, 這種情形只是單純的重複運用既有程式碼的功能, 而非重複運用其形式.
2. inheritance(繼承): 讓新的Class成為既有Class的一類, 可以實際接收既有Class的形式, 並加入新碼.
 


 
Composition: 只要將object references 置於新的classes即是.
 
"vm不會為每個reference產生預設物件"是有意義的, 因為這麼做會在許多情況下造成不必要的負擔, 但是如果希望初始化這些references, 可以在3個地點進行:
 
1. 物件定義處. 這表示它們一定能在"constructor被呼叫前完成初始化動作".
2. 在constructor裡.
3. 在實際需要用到該物件的地方. 這種方式被稱為lazy initialization(緩式初始化), 這種做法可以降低額外負擔.
 
以下程式用了這三種作法:
 
//Constructor initialization with Composition
class Soap
{
 private String s;
 Soap()
 {
  System.out.println("Soap()");
  s = new String("Constructed");
 }
 /*********************************************************
 if declaring with this way: String toString(), it can't compile via vm
   
 toString() in Soap cannot override toString() in java.lang.Object;
 attempting to assign weaker access privileges; was public String toString()
    *********************************************************/
 public String toString()
 {
  return s;
 }
};
public class Bath
{
 //Initializing at point of definition:
 private String
  s1 = new String("Happy"),
  s2 = "Happy",
  s3,
  s4;
 Soap castille;
 int i;
 float toy;

 Bath()
 {
  System.out.println("Inside Bath()");
  //intialization with constructor
  s3 = new String("Joy");
  i = 47;
  toy = 3.14f;
  castille = new Soap();
 }
 void print()
 {
  //Delayed Initialization:
  if (s4 == null)
  {
   s4 = new String("Joy");
  }
  System.out.println("s1 = "+s1);
  System.out.println("s2 = "+s2);
  System.out.println("s3 = "+s3);
  System.out.println("s4 = "+s4);
  System.out.println("i = "+i);
  System.out.println("toy = "+toy);
  System.out.println("castille = "+castille);
 }
 public static void main(String[] args)
 {
  Bath b = new Bath();
  b.print();
 }
}
 

---------- java ----------
Inside Bath()
Soap()
s1 = Happy
s2 = Happy
s3 = Joy
s4 = Joy
i = 47
toy = 3.14
castille = Constructed
Normal Termination
輸出完成 (耗費 0 秒)。

 
 
Inheritance:
1. 繼承後, derived class 自動獲取了base class 的所有資料成員與成員函式.
2. 為了繼承著想, base class 一般原則是將所有資料成員宣告成private, 將所有函式成員宣告為public.
3. 實施繼承時, 不一定非得使用base class 函式不可, 也可將新的method 加置derived class.
4. 即使沒有明確指出要繼承某個class, 仍會繼承Java 標準根源類別Object.
 
//Inheritance syntax & properties
class Cleanser
{
 private String s = new String("Cleanser");
 
 public void append(String a)
 {
  s += a;
 }
 public void dilute()
 {
  append(" dilute()");
 }
 public void apply()
 {
  append(" apply()");
 }
 public void scrub()
 {
  append(" scrub()");
 }
 public void print()
 {
  System.out.println(s);
 }
 public static void main(String[] args)
 {
  Cleanser x = new Cleanser();
  x.dilute();
  x.apply();
  x.scrub();
  x.print();
 }
};
 
public class Detergent extends Cleanser
{
 //change a method:
 public void scrub()
 {
  append(" Detergent.scrub()");
  //call bass-class version:
  super.scrub();
 }

 //add method to the interface:
 public void foam()
 {
  append(" foam()");
 }
 //test the new class:
 public static void main(String[] args)
 {
  Detergent x = new Detergent();
  x.dilute();
  x.apply();
  x.scrub();
  x.foam();
  x.print();
  System.out.println("Testing base class");
  Cleanser.main(args);
 }
}
 
 
(Kalin's 讀後心得1)
cleanser (n) 清潔工(跟每天叫我起床的cleaner一樣); 清潔劑(在這篇紀錄裡面應該是指清潔劑)
di'lute (v) 稀釋; 沖淡; 減輕 (a)沖淡的; 褪了色的
scrub (v) 擦洗
de'terge (v) 洗淨
det'ergent (n) 清潔劑 (a)有清淨力的
foam (v) 起泡沫 (n)泡沫
 
 
 
base class 的初始化: 建構動作會由base class"往外"擴散, 所以base class會在derived class 建構式取用它之前, 先完成本身的初始化動作.
 
//Constructor calls during inheritance
class Art
{
 Art()
 {
  System.out.println("Art constructor");
 }
};

class Drawing extends Art
{
 Drawing()
 {
  System.out.println("Drawing constructor");
 }
};

public class Cartoon extends Drawing
{
 /*
 Cartoon ()
 {
  System.out.println("Cartoon constructor");
 }
 */

 public static void main(String[] args)
 {
  Cartoon x = new Cartoon();
 }
}

 
---------- java ----------
Art constructor
Drawing constructor
Normal Termination
輸出完成 (耗費 0 秒)。

 
由執行class Cartoon 的結果看來, 即使並未撰寫Cartoon()建構式, vm也會為我們合成一個default 建構式, 並在其中呼叫base class 的建構式.
 
帶有引數(arguments)的建構式: 如果base class不具備default建構式, 或者想呼叫帶有引數的base calss constructor, 便得運用關鍵字super, 並搭配適當的引數列. 而且必須是derived class建構式的第一件要做的事情, 否則vm會提醒錯誤發生: call to super must be first statement in constructor.
 
//Constructor calls during inheritance
class Art
{
 Art(int i)
 
{
  System.out.println("Art constructor : "+i);
 }
};
class Drawing extends Art
{
 Drawing(int i)
 {
  super(i);
  /**********************************************
  假如沒有super(i), 編譯時會出現一個錯誤:
  Art(int) in Art cannot be applied to ()
  **********************************************/
  System.out.println("Drawing constructor : "+i);
 }
};
public class Cartoon extends Drawing
{
 
 Cartoon ()
 {
  super(11);
  /**********************************************
  假如沒有super(1), 編譯時會出現一個錯誤:
        Cartoon.java:23: cannot resolve symbol
        symbol  : constructor Drawing ()
  **********************************************/
  System.out.println("Cartoon constructor");
 }
 
 public static void main(String[] args)
 {
  Cartoon x = new Cartoon();
 }
}
 
---------- java ----------
Art constructor : 11
Drawing constructor : 11
Cartoon constructor
Normal Termination
輸出完成 (耗費 0 秒)。

 
 
Reference : Thinking in Java
(繼續閱讀...)
文章標籤

Kalin 發表在 痞客邦 留言(0) 人氣(2,038)

  • 個人分類:Java
▲top
  • 10月 01 週六 200504:28
  • 兄弟分酒

有一壺酒8公升, 一對兄弟想分, 可是他們只有一個3公升跟5公升的杯子,
請問要如何利用這3個杯子將酒分成4公升4公升?
 
from Zhao
(繼續閱讀...)
文章標籤

Kalin 發表在 痞客邦 留言(5) 人氣(41)

  • 個人分類:腦筋急轉彎
▲top
  • 9月 27 週二 200508:56
  • My country

My country, my city
 
http://beb.anyday.com.tw/scenic_spots/panorama.php#url=http://140.118.29.4/jerome/20041202-a2a.jpg&iw=2173&ih=640&vf=1&sec=60&ornt=0&mode=0
 
 
When I saw the picture, so many memories jumped into my head...
 
(繼續閱讀...)
文章標籤

Kalin 發表在 痞客邦 留言(0) 人氣(5)

  • 個人分類:心情筆記
▲top
  • 9月 21 週三 200510:22
  • static & instance variable & base class


以下程式碼與說明擷取自 JavaWorld, 並加以改編 :
 
session 1)
 
資料成員有分 static/non-static。
instance variable => non-static field(field: data member)
class variable => static field

 




class Insect
{
    int x1=prt("static Insect.x1 initialized");
 
    int prt(String s)
    {
        System.out.println(s);
        return 47;
    }
}
 
public class Beetle extends Insect
{
    public static void main(String[] args)
    {
    }
}

---------- java ----------
Normal Termination
輸出完成 (耗費 0 秒)。


 
將 x1 跟 prt() 重新改寫為 static.
 
class Insect
{
    static int x1=prt("static Insect.x1 initialized");
 
    static int prt(String s)
    {
        System.out.println(s);
        return 47;
    }
}
 
public class Beetle extends Insect
{
    public static void main(String[] args)
    {
    }
}
---------- java ----------
static Insect.x1 initialized
Normal Termination
輸出完成 (耗費 0 秒)。

 
我們可以將資料成員宣告為static,被宣告為static的資料成員,它是屬於類別所擁有,而不是個別的物件,我們可以將static視為個別物件所擁有、共享的資料成員。
 
static資料與函式的作用之一,是提供公用類別函式,例如將數學常用常數或計算公式,以static宣告並撰寫,之後我們可以透過類別名稱來管理與取用這些函式,例如像Math.Exp、Math.Log()、Math.Sin()等等的static常數或函式等,事實上,像PI這個常數,在Math.PI就有定義,我們可以直接呼叫使用。
 
由於static成員是屬於類別而不是物件,所以當您呼叫static函式時,並不會傳入物件的位置參考,所以static函式中不會有this參考,由於沒有this參考,所以在Java的static函式成員中不允許使用非static成員,因為程式沒有this來參考至物件位址,也就無法辨別要存取哪一個物件的成員,事實上,如果您在static函式中使用非static資料成員,在編譯時就會出現以下的錯誤訊息:



1

non-static variable test cannot be referenced from a static context

或者是在static函式中呼叫非static函式,在編譯時就會出現以下的錯誤訊息:


1

non-static method showMe() cannot be referenced from a static context

如果以c++來說 就是固定一個記憶體位置給宣告成 static 的成員或函式,
不管你 new 幾個物件, static 的成員或函式始終指向同樣的記憶體位置,
所以當你更改 static 的成員的值時
所有 new 出來的物件中的static 的成員的值就都會變了

 
1. 最常見的就是 main(),宣告為 static 可在任何物件存在之前被呼叫。
2. 在需要建立多個 class 使用的公用 method 時: 如 Math 類別,目的在公用,而不需要擁有自己的狀態,用 public static 會較方便,其它像是: java.lang.System、java.swing.SwingUtilites…等。
3. 建立只在 class 中使用的「外包工作用的 method」: 避免被一些 實體 method 任意存取 實體variable/field。因為 static method 沒有 this,不能擅自呼叫 實體method 或 實體variable。

object 以 member access operator 來 access static member,這和透過 class name 來取得 static member 兩者感覺起來一樣,但語意上不太一樣,至少對 sun 的編譯器來說是不一樣的。前者的寫法會使得 object reference 被 push 進 stack 隨即又 pop 掉,所以會平白犧牲掉一點效率,後者則不會。
 
Code Convention也不建議這麼寫
都是建議使用ClassName.staticMember

 
類別包含"資料"和"操作"(或稱方法, 函式).
當產生N個物件時, "資料"被產生N分, 但操作還是只有一份.
因此, "操作"只是被共用來操作N個物件的資料用.
問題是, "一般的操作"只有在物件產生時才可以呼叫,
而"static操作"則在物件產生前就可以呼叫.

 
(Kalin's 心得)
回歸Beetle...
第二個Beetle印出字串static Insect.x1 initialized, 那是因為執行Beetle時, 雖然在main()裡沒有做任何事, 但是Beetle extends Insect, 而prt()這個method被宣告為static , 所以在執行Beetle時會先跑base class (Insect)的prt()這個mathod.





 
session 2)
 

" base class 建構完成之後,其 instance variable(譯注:亦即資料成員,相對於 class variable)會以其出現次序被初始化 ... "


 


再次複習一下 :


instance variable => non-static field(field: data member)
class variable => static field


 
 
class Insect
{
    int i=9;
    int j;
 
    Insect()
    {
        prt("i="+i+",j="+j);
        j=39;
    }
 
    static int x1=prt("static Insect.x1 initialized");
 
    static int prt(String s)
    {
        System.out.println(s);
        return 47;
    }
}
 
public class Beetle extends Insect
{
    Beetle()
    {
        System.out.println(prt("j="+j));
    }
    public static void main(String[] args)
    {
        Beetle b = new Beetle();
    }
}
---------- java ----------
static Insect.x1 initialized
i=9,j=0
j=39
47
Normal Termination
輸出完成 (耗費 0 秒)。

 
(Kalin's 心得)
 
接上一個部份,
 
step 1 :
執行Beetle時, 會先到父類別Insect執行static method prt(), 而印出 static Insect.x1 initialized,
 
step 2 :
因為Beetle的main()裡面new了自己, 所以先去始執行父類別Insect的constructor, 印出 i=9,j=0, 然後把39給class variable j,
 
step 3 :
再接著執行自己的constructor, Beetle() 裡面是System.out.println(prt("j="+j));, 所以先執行了prt("j="+j), 所以利用了super印出了j=39, 最後執行System.out.println(prt("j="+j));, 因為Insect的prt()是return 47, 所以最後印出了47.
 


 
 
session 3)
 
最後再練習一次...
 
class Insect
{
    int i=9;
    int j;
 
    Insect()
    {
        prt("i="+i+",j="+j);
        j=39;
    }
 
    static int x1=prt("static Insect.x1 initialized");
 
    static int prt(String s)
    {
        System.out.println(s);
        return 47;
    }
}
 
public class Beetle extends Insect
{
    int k=prt("Beetle.k initialized");
    Beetle()
    {
        System.out.println(prt("k="+k));
        System.out.println(prt("j="+j));
    }
    public static void main(String[] args)
    {
        Beetle b = new Beetle();
        prt("Beetle constructor");
    }
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
---------- java ----------
static Insect.x1 initialized
i=9,j=0
Beetle.k initialized
k=47
47
j=39
47
Beetle constructor
Normal Termination
輸出完成 (耗費 0 秒)。

 
(Kalin's 心得)
 
幹! 本來是要寫作業的, 竟然花了那麼久的時間來釐清 static... 嗚~
(繼續閱讀...)
文章標籤

Kalin 發表在 痞客邦 留言(1) 人氣(377)

  • 個人分類:Java
▲top
«12

自訂側欄

自訂側欄

個人資訊

Kalin
暱稱:
Kalin
分類:
不設分類
好友:
累積中
地區:

熱門文章

  • (214)EJ B 架構
  • (26)Yi na ba yu ddia (朋友你好嗎)
  • (23)This is a war! (口水篇)
  • (13)Megadeth, Ashes in Your Mouth
  • (10)十二生肖的由來
  • (8)煙火
  • (7)My fxxking Beans
  • (7)雪雪雪!!!
  • (5)陳綺貞, 華麗的冒險, Self
  • (5)實踐01: 引數以 by value 方式傳遞, 而非以 by reference 方式傳遞

文章分類

  • 心情筆記 (1)
  • 腦筋急轉彎 (1)
  • EJB (2)
  • Practical Java (1)
  • 娛樂 (1)
  • Music (4)
  • Study in UEA (1)
  • Java (3)
  • 生活 (2)
  • 未分類文章 (1)

最新文章

  • 十二生肖的由來
  • My fxxking Beans
  • This is a war! (口水篇)
  • Yi na ba yu ddia (朋友你好嗎)
  • 雪雪雪!!!
  • 煙火
  • Megadeth, Ashes in Your Mouth
  • 實踐01: 引數以 by value 方式傳遞, 而非以 by reference 方式傳遞
  • EJ B 架構
  • 陳綺貞, 華麗的冒險, Self

最新留言

  • [08/09/17] [string not found (whatsnew.missing.displayname)] 於文章「雪雪雪!!!...」留言:
    We are sure that you cant get ...
  • [08/04/21] [string not found (whatsnew.missing.displayname)] 於文章「雪雪雪!!!...」留言:
    World Of Warcraft gold for che...
  • [07/06/12] TC 於文章「兄弟分酒...」留言:
    1、先把3L裝滿 2、把3L的倒進5L 3、再把3L裝滿...
  • [06/02/19] 子 於文章「十二生肖的由來...」留言:
    hello your school is beautif...
  • [06/02/11] Anita 於文章「十二生肖的由來...」留言:
    真是有趣的故事 !! ...
  • [06/01/05] Claire 於文章「My fxxking Beans...」留言:
    我是說真的...=.= 良心的建議,不要選羅撥.......
  • [06/01/03] Kalin 於文章「My fxxking Beans...」留言:
    哈哈... 學姐, 先謝謝啦! 有了第一學期的經驗後, ...
  • [06/01/02] Claire 於文章「My fxxking Beans...」留言:
    看了,很有趣.... 等你回台灣,有沒有興趣到我的Team來...
  • [05/12/13] Jamie 於文章「This is a war! (口水篇)...」留言:
    辛苦了, 大家在撐一下就放假了!...
  • [05/11/21] GAYA 於文章「陳綺貞, 華麗的冒險, Self...」留言:
    想問你..如果我想把這個http://switchboard...

動態訂閱

文章精選

文章搜尋

誰來我家

參觀人氣

  • 本日人氣:
  • 累積人氣: