星期一, 10月 07, 2013

2013IT鐵人賽-22-Java08-Java轉型練習

2013IT鐵人賽-22-Java08-Java轉型練習




前一篇的文章 2013IT鐵人賽-21-Java07-Java算術運算子 我們進行算術運算子的練習, 今天我們來練習轉型的練習.


今天我的練習在第2個裝置練習(請見 2013IT鐵人賽-16-git04-git基礎練習git pull 與第2裝置使用 的內容).


首先進入我們的 git 資料夾 /home/max/2013ironman (請按自己的設定調整 git 所在資料夾)
>cd   /home/max/2013ironman


將 GitHub  上面的資料同步回來
> git  pull  origin master
From https://github.com/sakanamax/2013ironman
* branch            master     -> FETCH_HEAD
Already up-to-date.


這邊就可以觀察到, 如果兩邊都是最新的, 那系統就會顯示 up-to-date.


首先整理下資料型態轉換的相關訊息
資料型態轉換
  • 範圍較小轉換為範圍較大的可以, 反之不行
  • 如果要將有效範圍較大轉成有效範圍較小的變數,要使用 "型態轉換運算子" 來達成
    • 型態轉換運算子 語法為
    • (資料型態)  運算式;
  • 注意, 轉換型態只針對 值 來轉換型態, 不針對變數本身轉換型態
  • 自動資料型態轉換
    • 必須是數值
    • 只會將佔用空間較小的型態轉成佔用空間較大的型態
    • 整數會自動轉成浮點數, 浮點數不會自動轉成整數  


至於資料型態以及大小, 在之前的 2013IT鐵人賽-14-Java04-Java命名規則與變數 內有提到, 如果忘記了, 可以到前面那篇查詢.


那我們就開始練習吧 ^_^


進入到 java 的練習資料夾
> cd   /home/max/2013ironman/java/


建立一個 java 原始檔如下
> cat   Basic_008_autoCasting.java
// 這個練習, 我們練習java 的自動資料型態轉換
class Basic_008_autoCasting {


public static void main(String[] args){
//宣告一個 inum 變數為整數 integer, 值為160
int inum = 160;
//使用 System.out.println 顯示出來
System.out.println("身高為" + inum + "公分");
//宣告一個 double 變數, 使用 inum 指定過去
double dnum = inum;
//使用 System.out.println 顯示出來
System.out.println("身高為" + dnum + "公分");
//觀察輸出的結果, 會顯示 160.0 公分, 因為double 的佔用空間比較大
//所以使用佔用空間比較小的 int 指定到double 這樣是沒有問題的, 且會自動轉型
}
}


編譯我們剛剛寫的 java 程式
> javac Basic_008_autoCasting.java


執行剛剛的程式
> java   Basic_008_autoCasting
身高為160公分
身高為160.0公分


剛剛是把資料型態小的資料指定到資料大的型態, 接下來我們把他反過來


建立一個 java 原始檔如下
> cat   Basic_009_forceCasting.java
// 這個練習, 我們練習java 的強制資料型態轉換
class Basic_009_forceCasting {


public static void main(String[] args){
//宣告一個 dnum 變數為double, 值為160
double dnum = 160;
//使用 System.out.println 顯示出來
System.out.println("身高為" + dnum + "公分");
//宣告一個 integer 變數, 使用 dnum 指定過去
int inum = dnum;
//使用 System.out.println 顯示出來
System.out.println("身高為" + inum + "公分");
//這個在編譯的過程就會有問題
//觀察輸出的結果, 因為double 的佔用空間比較大
//所以使用佔用空間比較大的 double 指定到int 這樣有問題的
}
}



接下來嘗試進行編譯的動作


> javac   Basic_009_forceCasting.java
Basic_009_forceCasting.java:10: error: possible loss of precision
int inum = dnum;
          ^
 required: int
 found:    double
1 error


就會看到系統提出錯誤訊息 possible loss of precision 可能會失去精準度


接下來我們修改原來的程式, 並使用強制轉型的方式來進行


> cat   Basic_009_forceCasting.java
// 這個練習, 我們練習java 的強制資料型態轉換
class Basic_009_forceCasting {


public static void main(String[] args){
//宣告一個 dnum 變數為double, 值為160
double dnum = 160;
//使用 System.out.println 顯示出來
System.out.println("身高為" + dnum + "公分");
//宣告一個 integer 變數, 使用 dnum 指定過去
//這邊使用強制轉型, 加上 (int) 轉成int資料型態
int inum = (int) dnum;
//使用 System.out.println 顯示出來
System.out.println("身高為" + inum + "公分");
//這個在編譯的過程就會有問題
//觀察輸出的結果, 因為double 的佔用空間比較大
//所以使用佔用空間比較大的 double 指定到int 這樣有問題的
//所以我們會使用強制轉型 (型態) 的方式來解決這個問題
}
}


接下來嘗試進行編譯的動作
> javac   Basic_009_forceCasting.java


執行剛剛的程式
> java   Basic_009_forceCasting
身高為160.0公分
身高為160公分


在進行轉型的時候, 還是要注意到一些相關細節的, 不管是相同型態還是不同型態.
所以接下來我們再來練習另外一個例子.


建立一個 java 原始檔如下
> cat  Basic_010_noticeCasting.java
//這個範例我們來觀察如果進行轉型要注意的小地方
class Basic_010_noticeCasting {
public static void main(String[] args){
//宣告兩個 int 變數, 並指定值
int num1 = 5;
int num2 = 4;
System.out.println("num1= " + num1);
System.out.println("num2= " + num2);
//宣告一個double 變數 div
double div = num1 / num2;
//顯示 div 輸出的結果, 但是由於 num1,num2 是整數, 所以輸出的值,
//不是我們期待中的1.25 而是整數所能輸出的1 然後再指定給div
System.out.println("double div is  num1 / num2= "+ div);
//宣告一個double 變數 div2, 並於 num1 以及 num2 前進行強制轉型
double div2 = (double) num1 / (double) num2;
//觀察輸出的結果
System.out.println("double div2 is (double) num1 / (double) num2= " + div2);
}
}


接下來嘗試進行編譯的動作
> javac   Basic_010_noticeCasting.java


執行剛剛的程式
> java   Basic_010_noticeCasting
num1= 5
num2= 4
double div is  num1 / num2= 1.0
double div2 is (double) num1 / (double) num2= 1.25




準備將相關檔案傳送到 GitHub 上面
> cd  /home/max/2013ironman/
> git  add   java/*
> git  commit  -m "Add java Casting files"
[master 987b9df] Add java Casting files
6 files changed, 54 insertions(+)
create mode 100644 java/Basic_008_autoCasting.class
create mode 100644 java/Basic_008_autoCasting.java
create mode 100644 java/Basic_009_forceCasting.class
create mode 100644 java/Basic_009_forceCasting.java
create mode 100644 java/Basic_010_noticeCasting.class
create mode 100644 java/Basic_010_noticeCasting.java



> git  push  origin  master
Username for 'https://github.com': 您的帳號
Password for 'https://sakanamax@github.com': 您的密碼
Counting objects: 11, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (9/9), done.
Writing objects: 100% (9/9), 3.14 KiB, done.
Total 9 (delta 2), reused 0 (delta 0)
To https://github.com/sakanamax/2013ironman.git
  eb1990c..987b9df  master -> master



完成今天 java 轉型的練習



Fun with Day 22 ~

沒有留言: