課程名稱:程式設計II472205

指導老師:蔡佳麟

學生:吳佳恩

學號: 40207096

組別:4

次:第10-14 [回首頁]

 

Part I指定作業:

作業題目

3.JAVA參數傳遞有幾種方式?試舉例說明其差異?

4.何謂執行(Thread)試舉例說明兩個Java執行常用的方法。

回答內容

JAVA參數傳遞有幾種方式?

根據參考來源1:「

()概念:傳遞方式種類(非限定Java)

( I )參數種類:(parameter/argument)

(1)   形式參數(formal parameter)

假參數在程序或函數之定義區塊中參數列之參數(副程式頭-HEADing).

(2)   實際參數(actual parameter)

呼叫副程式時,在副程式名稱中的參數,參數之實際值在此時決定,呼叫時傳遞給副程式.

( II )參數傳遞之方式:

(1)   call by value傳值叫用的方式(傳值呼叫)

(pass)

1.      此種方法會把實質參數“(可能表示式的值)先計算出來(即右值)在傳給被叫用的程序之形式參數 → 形式參數是拷貝實際參數之值而來

2.      被呼叫程序將形式參數當做區域變數而使用於程序中。

3.      運轉後之結果並不會經由形式參數傳回實際參數。

4.      叫用之程序把實質參數的值算出來,把它的右值放至形式參數所在之記憶位址(即被叫用程序之ACTION RECORDfield)

5.      若欲影響到叫用之程序:需透過非局部性變數或pointer.swap為例。

(2)   call-by-address, call by Location, call by Reference, call-by-variable:傳位址叫用的方式

1.      叫用程序傳給被叫用程序的內容,是一個指向實際參數所在的記憶體位址之指標  呼叫與被呼叫二程式間透過一些己知位置(pointer)從事參數/資料之傳送。

2.       二種情況:

(1)   若實際參數為一變數,則傳遞左值(位址)本身。(將左值置入指標之中)

(2)   若實際參數為一expression(無左值),則此表示式將被計值(evaluated)而置於新位址中,然後將此位址再傳給被呼叫之程序。

          被叫用程序存取該位址所存放內容,加以運算

          array

(3)   copy-restore, value-result, copy-in, copy out, call by result:拷貝儲存連儲連繫方式

          呼叫前所有實際參數之位址已被決定

          傳遞方式:真正參數之值算出來(右值)拷貝給實際參數,而返回呼叫程時,形式參數之值將拷貝回真正參數之位址中。

(4)   call by name

          規則:以實際參數名稱替換形式參數名稱

          把程序當作集體指令處理,把程序主體代到叫用程序中叫用所在的地方,且把實際參數全部以字面上的意義代入形式參數(MARCO/in-Line Expansion)

          Lisp, c,某此ALGOL, PASCALcall by value

          PASCAL, FORTRAN77, PL/Icall by address

          某些FORTRANcall by result

          ALGOLcall by name

試舉例說明其差異?

根據參考來源2:「

數傳遞之比較範例:

procuder sub(var A, B, C, Dinteger)

begin

    B=A+A

    D=A+C

End

 

 

x=1

y=2

z=7

sub(X, X, X+Y, Z) 

write(Z)←??

(1)   call by value7(若無var)

B=2, D=4, Z=7 (NOT CHANGE)

(2)   call by reference5  

描述: 描述: http://mail.tmue.edu.tw/~lai/java/elearn/teach/para.h10.gif

  (3)   call by result4

(a)    SUB(1 , 1 , 3 , 7)

       A  B C D描述: 描述: http://mail.tmue.edu.tw/~lai/java/elearn/teach/para.h11.gif

(b)   B=1+1=2

D=1+3=4

 

Java參數傳遞方式

1.      call by value

一般primitive type之變數或某一陣列之元素(primitive type)皆使用call by value

描述: 描述: http://mail.tmue.edu.tw/~lai/java/elearn/teach/para1.gif       

2.      call by reference

凡是object(array of Object之某一元素)皆以call by reference傳遞,因此物件若被呼叫之method改變將不是暫態的。 

何謂執行(Thread)

根據參考來源3:「

Program,Process,Thread

在介紹Thread之前,我們必須先把ProgramProcess這兩觀念作一個清。

  • Program:一群程式碼的集合,用以解決特定的問題。以物件導向的觀念來類比,相當於Class
  • Process:Program所產生的執行個體,一個Program可以同時執行多次,產生多個Process。以物件導向的觀念來類比,相當於Object。每一個Process又由以下兩個東西組成
    • 一個Memory Space。相當於Objectvariable,不同ProcessMemory Space也不同,彼此看不到對方的Memory Space
    • 一個以上的ThreadThread代表從某個起始點開始(例如main),到目前為止所有函數的呼叫路徑,以及這些呼叫路徑上所用到的區域變數。當然程式的執行狀態,除了紀錄在主記憶體外,CPU內部的暫存器(Program Counter, Stack Pointer, Program Status Word)也需要一起紀錄。所以Thread又由下面兩項組成
      • Stack:紀錄函數呼叫路徑,以及這些函數所用到的區域變數
      • 目前CPU的狀態

由上面的描述中,我們在歸納Thread的重點如下

  • 一個Process可以有多個Thread
  • 同一Process內的Thread使用相同的Memory Space,但這些Thread各自擁有其Stack。換句話說,Thread能透過reference存取到相同的Object,但是local variable卻是各自獨立的。
  • 作業系統會根據Thread的優先權以及已經用掉的CPU時間,在不同的Thread作切換,以讓各個Thread都有機會執行。

試舉例說明兩個Java執行常用的方法。
根據參考來源4:「

Javajava.lang.Thread這個類別來表示ThreadClass Thread有兩個Constructor:

1.     Thread()

2.     Thread(Runnable)

第一個Constrctor沒有參數,第二需要一個Runnable物件當參數。

Runnable是一個interface,定義於java.lang,其宣告為

public interface Runnable {

      public void run();

  } 

使用Thread()產生的Thread,其進入點為Thread裡的run();使用Thread(Runnable)產生的Thread,其進入點為Runnable物件裡的run()

run()結束時,這個Thread也就結束了;這和main()結束有相同的效果。其用法以下面範例說明:

public class ThreadExample1 extends Thread {

      public void run() { // override Thread's run()

          System.out.println("Here is the starting point of Thread.");

          for (;;) { // infinite loop to print message

              System.out.println("User Created Thread");

          }

      }     

public static void main(String[] argv) {

          Thread t = new ThreadExample1(); // 產生Thread物件

          t.start(); // 開始執行t.run()

          for (;;) {

              System.out.println("Main Thread");

          }

      }

  } 

以上程式執行後,螢幕上會持續印出"User Created Thread""Main Thread"的字樣。

利用Runnable的寫法如下

public class ThreadExample2 implements Runnable {

      public void run() { // implements Runnable run()

          System.out.println("Here is the starting point of Thread.");

          for (;;) { // infinite loop to print message

              System.out.println("User Created Thread");

          }

      }     

public static void main(String[] argv) {

          Thread t = new Thread(new ThreadExample2()); // 產生Thread物件

          t.start(); // 開始執行Runnable.run();

          for (;;) {

              System.out.println("Main Thread");

          }

      }

  }

 

參考來源

根據參考來源1&2參數

 根據參考來源3&4Thread(執行)

 

Part II 10-14學習心得彙整

10

11

12

13

14

截圖

Ex.1 期中考第3(應用程式)

Ex.2 寫入檔案

Ex.3 讀取檔案

Ex.1 11_ex1

Ex.2 2.3.套件製作-打包-使用

Ex.3執行

Ex.1 多執行

Ex.2 實作2多執行

Ex.3 實作3多執行

Ex.1集合(呼叫類別:mySet)

Ex.2介面Set (13-Ex2)

Ex.3介面Set (13-Ex3)

Ex.4介面List (13-Ex4)

Ex.1集合2(呼叫類別:myQueue)

Ex.2 集合3(呼叫類別:集合3)

Ex.3集合4 (呼叫類別:集合4")

課後心得

聽得懂

還算簡單

很有趣

有點難

比上禮拜難一點

 

15

16

截圖

課後心得