2015年7月20日 星期一

JAVA SL-110_07/19

Java SL-110 2015/07/19
##########################################################################
JAVA 構成的要件分為幾項:屬性、方法、類別、建構子。
以下列程式為例:

public class Puggy{                     //類別
        String name = "小黑";           //物件變數
        static String type = "拉布拉多";//類別變數

        void skill(){                   //物件方法
                String s1 = "拿報紙";   //區域變數
                System.out.println(s1);
        }

        static void skill_1(){          //類別方法
                System.out.println("拎施鞋");
        }
        Puggy()[]                       //建構子
}

##########################################################################
註解:
1. //           單行註解
2. /*.....*/    多行註解
3. /**...*/     文件註解,編譯指令:javadoc -verbose -private O.java

##########################################################################
練習『文件註解』:Puppy.java

/**這是寵物的類別*/
public class Puppy{
        /**寵物的名稱*/
        public static String name = "小黃";
        /**寵物的品種*/
        public static String type = "拉布拉多";
        /**寵物的顏色*/
        public static String color = "黃色";
        /**寵物的技能*/
        public static void skill(){
                System.out.println("拿施鞋");
        }
}

cmd:
javadoc -verbose -private Puppy.java

點開 index.html 可以看到說明文件。
##########################################################################
// package 與 import

// package 程式,路徑 C:\java\water\Fish.java
package water;
public class Fish{
        public static String name = "小金";
        public static String type = "金魚";
        public static String color = "金";
        public static void skill(){
                System.out.println("吐泡泡");
        }
}

// 主程式,路徑 C:\java\PetStore.java
public class PetStore{
        public static void main(String args[]){
                String fishname = water.Fish.name;
                String fishtype = water.Fish.type;
                String fishcolor = water.Fish.color;
                System.out.println("我有一隻優雅的" + fishtype + "牠的名字叫" + fishname + ",牠身上的顏色是:" + fishcolor + "色");
                System.out.println("每當牠生氣的時候都會");
                water.Fish.skill();
        }
}

cmd:
javac PetStore.java
java PetStore

// 猜猜哪個 import 寫法,效能較快?
// 1.
import java.io.File;
File f;
f = new File("test.txt");

// 2.
import java.io.*;
import java.awt.*;
File f;
f = new File("test.txt");

// 3.
import java.io.*;
File f;
f = new File("test.txt");

// 4.
java.io.File f;
f = new java.io.File("test.txt");

// 答:以上四種的執行效能都一樣。
// 程式撰寫優先: package > import > classpath
##########################################################################
存取修飾元:

private         同一個 class 下才可進行存取。
default         同一個 package 下的 class 才可進行存取。
protected       不同 package 可以透過繼承。
public          皆可存取。

一般類別只有 public 和 default 兩種存取權限,『內部類別』才有四種存取權限。
##########################################################################
Java 命名規則:

1. 第一個字必須是英文字母、_ 或 $。
2. Java 有大小寫之分。
3. 不可以是關鍵字。

因此推薦使用駝峰式大小寫命名,例: AppStore
##########################################################################
資料型態        bytes   bit     範圍                            預設值
char            2       16      '1u0000'~'1uFFFF'(0~65535)      '1u0000'
byte            1       8       -128~127                        0
short           2       16      -32768~32762                    0
int             4       32      -2031次方~(2031次方-1)          0

char c = '中';          //可以
char c1= '1u4E2D';      //可以 Unicode 編碼
char c2= 65;            //可以 ASCII 編碼
char c3= '\0';          //可以 \0 為空字元
byte b = 255;           //不行,超出資料範圍
short a = 'A';          //可以,會轉換成數字
int a = '爪';           //可以,會轉成 ASCII 數字
int b = '哇';           //可以,會轉成 ASCII 數字
int c = a+b;            //可以,會轉成 ASCII 數字

// Java 預設值
整數    int
浮點數  double

資料型態        bytes   bit     範圍                            預設值
long            8       64      -2063次方~(2063次方-1)          0L
float           4       32      -3.4E+38~3.4E+38                0.0f
double          8       64      -1.7E+308~1.7E+308              0.0
boolean         1       8       true/false                      false

long l = 10;            //不行,因為 long 宣告要有 L
float f = 2.5;          //不行,因為 float 宣告要有 f
double d = 2.5f         //可以,因為 dobule 的資料範圍大於 float
boolean b = 0;          //不行,Java 的布林值只有 true / false
##########################################################################
資料態的轉換:

1. 小轉大:無風險,自動轉換


2. 大轉小:風險大,手動 coding
(欲轉換的型態)變數名稱;
(float)b;

// 判斷 compile 會不會過?
int i = 1;
double d;
d = i;
i = d;
//答:i=d; 會有問題,必須改成 i = (int)d;

// 判斷 compile 會不會過?
byte b=3;
short s=5;
short c=b+s;
//答:compile 會錯,因為整數預設為 int ,
//所以整數運算 short c=b+s; 必須改為 int c=b+s;
##########################################################################
陣列:
[]      >       指的是陣列中元素的位置或陣列物件的長度

int a[]=new int[5]{1,2,3,4,5];  \\這是錯誤的,已設有初值,不能再設長度。
int a[]=new int[]{1,2,3,4,5];

int B[]=new int[5];
B[0]=3;
B[1]=2;

//陣列取長度:
陣列變數.length         //陣列取長度是一種屬性。
字串變數.length();      //字串取長度是一個方法,後面有括號。

//比較 String 與 chat

                String                  char
資料型態        參考資料型態            基本資料型態
圈住符號        " "                     ' '
比較運算        == 或 equals()          ==
抽象表現        是一個 class            16-bit unicod

補充,參考資料型態有三種:String, Array, Object.
##########################################################################
算數運算子:

+       正加            //正或負為單元運算子
-       負減
*
/
%
++
...

//---------------------------
byte x=1, y=2, z;
z = x+y;
//這是錯的,要先相加再做轉換:z=(byte)(x+y);
//---------------------------
int a=0, b=0;
b = a++ + ++a - a++;
a= 3
b= 0
//Ans:b = 0(1) + 2(2) - 2(3)
//---------------------------
int a=0, b=0;
b= a-- + --a - a--;
a= -3
b= 0
//Ans:b = 0(-1) + -2(-2) - -2(-3)
##########################################################################
關系運算子:

>
<
>=
<=
==
!=

int a=1, b=2;
a==b    False
a>b     False
a<b     Ture
a>=b    False
a<=b    Ture
##########################################################################
邏輯運算子:                    短路 short-circuit
不論是 T 或 F 都會執行
&                               && 第一組邏輯是 F 時,就跳出
|                               || 第一組邏輯是 T 時,就跳出

int a=1, b=2;
(a<b) && (a>0);         T,T     Ture
(a<b) & (a>0);          T,T     Ture
(a>b) | (a<0);          F,F     False
(a>b) || (a<0);         F,F     False
!(a>b);                    F,NOT     Ture
(b>a) | (a<0);          T       Ture    | 後面不執行
(b>a) || (a<0);         T,F     Ture
(a<b) & (a<0);          T,F     False

//---------------------------
int a=1, b=2;
if((a<b) | (++a>0))
a=2
//---------------------------
int a=1, b=2;
if((a<b) || (a++>0))
a=1
##########################################################################
指定運算子:
=
+=
-=
*=
/=
%=
&=
//---------------------------
int a=2;
a=a*2-3;
a=1
//---------------------------
int a=2;
a*=2-3;
a=-2
//---------------------------
String s1="JAVA";
String s2="SCJP";
int i=1;
int j=2;
System.out.println(i+j);        //印出 3
System.out.println(s1+j);       //印出 JAVA2
//---------------------------
String s1="420";

s1+=42;
System.out.println(s1);         //印出 42042
//---------------------------
X = 5*3 < 20 & 3+7 > 9-1 || 20 >= 20 -30 && False
       T     &    T      ||   跳出
##########################################################################
流程控制:

條件式流程控制  if-else, switch-case
迴圈式          for, while, do-while, foreach
例外控制        try-catch-finally, throws
特定控制單元    break, continue, label
label 為流程控制記號,不能改變程式執行流程的順序。

//---------------------------
//if_else

int a=1;
if(a>0)
        System.out.println("A");
//      System.out.println("B");
else
        System.out.println("C");
        System.out.println("D");

輸出:
A
D
//---------------------------
//switch case

1. case 的比對不可以重複
2. switch(x)
        x 必須是 int 以下的值域和 String (int, char, byte, short)
3. default 關鍵字可以單獨存在
4. default 只能有一個

為何需要 break?
因為 case 不能改變程式執行的流程,它只是一個記號,所以需要 break 來改變目前流程>。

語法:
switch(x){
        case 1:
        ......
        break;
        case 2:
        ......
        break;
        default:
}
//---------------------------
//for

public class Fest{
        public static void main(String avgs[]){
                for(int i=1;i<=10;i++){
                        if(i==8)
                                break;
                        if(i%3==0)
                                continue;
                        System.out.println(i);
                }
        }
}

輸出:12457

2015年7月14日 星期二

程式設計概論0705

# 二維陣列
宣告

資料型態 陣列名稱[][] = 資料型態[列的個數][行的個數];

# 對等宣告
int arr[][] = new [3][4];
int arr[][] = {{1,2,3}, {4,5,6}};

# 不對等宣告
int arr[][] = new [3][];
arr[0] = new int [4];   // 宣告 arr[0] 列,有 4 行
arr[1] = new int [3];   // 宣告 arr[1] 列,有 3 行
arr[2] = new int [4];   // 宣告 arr[2] 列,有 4 行

int arr[][] {{第 0 列初值}, {第 1 列初值}, {第 2 列初值}...{ 第 n 列初值}};

# 取得陣列的列數
陣列名稱.length();

# 取得特定列的元素個數
陣列名稱[列的索引值].length;


## 函數
把相同的程式碼撰寫在函數中,簡化程式中的程式碼達到程式模組化。

語法
public static 傳回值 方法名稱 (型態 引數, 型態 引數)

2015年6月28日 星期日

QEMU VFIO實作

實作VFIO首先要先確定你的硬體是否有支援
  • Intel的CPU要有支援VT-D
  • AMD的CPU要有支援AMD-VI
  • 主機板也是要選用有支援VT-D/AMD-VI功能,才可以使用VFIO功能
我的電腦是Intel的E3-1230V2,以下用Intel的CPU為例
直接去Intel官網查CPU型號,找到以下技術且為YES就表示你的CPU有支援VT-D


 
接下來就要看主機板有沒有支援VT-D/AMD-VI,以國內4家華碩、微星、技嘉、華擎來說
依我使用的是Z77/H77晶片為例
  • 華碩:BIOS完全沒有支援VT-D功能,要X79、X99等級以上才有
  • 微星:BIOS大部份都有支援VT-D
  • 華擎:BIOS大部份都有支援VT-D
  • 技嘉:BIOS少部份支援,如UD5H、D3H等,剩下也是要X79、X99等級以上才有
以上主機板是我從網路找出來稍微整理的,所以除非你要買到伺服器級的主機板
不然BIOS想要有VT-D功能建議買微星或華擎的

#確定你硬體都有支援後在開始實作VFIO功能

########################################################

1. 把核心有關VFIO的都編譯起來之後重開機

2. 在/etc/modules加入以下模組

pci_stub
vfio
vfio_iommu_type1
vfio_pci
kvm
kvm_intel

3. 在/etc/default/grub加入以下參數
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on vfio_iommu_type1.allow_unsafe_interrupts=1"

4. 執行以下指令
# update-grub

5. 重新開機
# shutdown -r now

接下來要設定給QEMU使用的顯卡

1. 使用 lspci -nn 觀察你所安裝的顯卡
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation G98 [GeForce 8400 GS Rev. 2] [10de:06e4] (rev a1) <-- HOSTGPU: 8400GS
02:00.0 VGA compatible controller [0300]: NVIDIA Corporation Device [10de:13c2] (rev a1) <-- GUESTGPU: GTX 970
02:00.1 Audio device [0403]: NVIDIA Corporation Device [10de:0fbb] (rev a1) <-- GTX 970 aduio

2. 在/etc/initramfs-tools/modules加入QEMU要用的GPU,如下指令
pci_stub ids=10de:13c2,10de:0fbb

3. 再執行以下指令
# update-initramfs -u

4. 重新開機
# shutdown -r now

5. 輸入 dmesg | grep pci-stub 指令後,會看到底下訊息
[    1.834707] pci-stub: add 10DE:13C2 sub=FFFFFFFF:FFFFFFFF cls=00000000/00000000
[    1.834715] pci-stub 0000:02:00.0: claimed by stub
[    1.834720] pci-stub: add 10DE:0FBB sub=FFFFFFFF:FFFFFFFF cls=00000000/00000000
[    1.834724] pci-stub 0000:02:00.1: claimed by stub

6. /etc/vfio-pci.cfg 建立這檔案,並加入在上面使用 lspci -nn 查到的顯卡
0000:02:00.0
0000:02:00.1

7. 接下來建立啟動虛擬機的script檔,我的script檔叫vm1
#!/bin/bash

configfile=/etc/vfio-pci.cfg
MEMORY=4096
HDA=win8.img
MAC="DE:AD:BE:CF:EC:B9"
BRIDGE=br10
VGA=02:00.0


vfiobind() {
    dev="$1"
        vendor=$(cat /sys/bus/pci/devices/$dev/vendor)
        device=$(cat /sys/bus/pci/devices/$dev/device)
        if [ -e /sys/bus/pci/devices/$dev/driver ]; then
                echo $dev > /sys/bus/pci/devices/$dev/driver/unbind
        fi
        echo $vendor $device > /sys/bus/pci/drivers/vfio-pci/new_id


 }

modprobe vfio-pci

cat $configfile | while read line;do
    echo $line | grep ^# >/dev/null 2>&1 && continue
        vfiobind $line
done

qemu-system-x86_64 -enable-kvm -m $MEMORY -cpu host,kvm=off \
-smp 4,sockets=1,cores=4,threads=1 \
-vga none  \
-boot c \
-device vfio-pci,host=$VGA,x-vga=on \
-device vfio-pci,host=02:00.1
-drive file=win8.img,format=raw \
-net nic,macaddr=$MAC -net nic,model=e1000 -net bridge,br=$BRIDGE

8. 把vm1權限改成755
# chmod 755 vm1

9. 這樣就可以直接執行vm1
# ./vm1

程式設計概論0628

# 上上週課程複習
# 輸入窗
import javax.swing.*;
// input is String
        BufferedReader buf;
        String str1;
        buf=new BufferedReader(new InputStreamReader(System.in));
        str1=JOptionPane.showInputDialog("Input Integer Num. :");
// str1 to integer(a)
        int a;
        a=Integer.parseInt(str1);
// show dialog
JOptionPane.showMessageDialog(null,"Input Error, range 0~100");

# 邏輯運算子
# && and 所有為真即為真
# || or 只要有一個真就是真

A && B  T || F
T    T  F    T

# 0 以下;100 以上
# 50~59 之間要補考
a < 0 || a > 100
a < 60 && a > 49

# 結樣設計
循序性
由上至下

開始
 |
敘述1
 |
敘述2
....|
敘述n

# 選擇性結構
根據判斷條件成立與否,決定程式該執行哪一個敘述。
if_else
switch_case

# 重複性結構
根據判斷條件成立與否,決求程式執行的次數。
for
while
do-while

# 條件運算子 ?:
# 此為 if-else 的簡潔版
傳回值 = (判斷式)?true:false;

# for 迴圈
for (設定初值;判斷條件;設定增減量)
{
        程式敘述;
}

# while 迴圈
設定初值;
while(判斷條件){
        程式敘述;
        設定增減量;
}

# do-while 迴圈
設定初值;
do
{
        程式敘述;
        設定增減量:
}while(判斷條件);

# break 敘述,跳離迴圈外
for(.....){
        程式敘述;
        ...
        break;
        ...
        程式敘述(不會執行);
}

# continue 敘述,跳至迴圈初始
for(.....){
        程式敘述;
        ...
        continue;
        ...
        程式敘述(不會執行);
}

# switch_case
switch(運算式)
{
        case1:
        敘述;
        break;

        case2:
        敘述2;
        break;

        ...

        default;
}

# 陣列
存放相同資料型態的資料。

# 陣列宣告:
資料型態 陣列名稱[] = new 資料型態[個數]

 (1) 宣告陣列名稱。
 (2) 利用 new 配置記憶體區塊。
 (3) 下面三種位置都能宣告,但不能在 int 前面。
int arr[];
int[] arr;
int []arr;

# 陣列初值設定
# 假設有間旅館 arr,有五個房間,房間編號 0,1,2,3,4,分別五個客人{1,2,3,4,5}
int arr[]={1,2,3,4,5};

# 也可以先設定好陣列數,但不放資料。
int arr[]=new int[5];
arr[0]=3;
arr[1]=7;
arr[2]=8;
# 沒宣告初值的陣列會自動補資料 0,所以 arr[3]=arr[4]=0

# 陣列長度
陣列名稱.length;

2015年6月27日 星期六

Bluetooth 藍芽配對連接

Debug 在置底。

---------------------------------------------------------------------
說明:筆者使用於筆電之內建藍芽與藍芽機械式鍵盤進行配對 。

*** 規格 ***
系統: Debian Jessie 8.0
核心:3.16.7
筆電:Acer v3-772g
鍵盤:ZIPPY BW7050
---------------------------------------------------------------------
查看無線驅動:
lspci -k|grep -iA2 Network
0d:00.0 Network controller: Qualcomm Atheros AR9462 Wireless Network Adapter (rev 01)
Subsystem: Foxconn International, Inc. Device e052
Kernel driver in use: ath9k
---------------------------------------------------------------------
檢查驅動:
lsmod |grep ath9k
lsmod |grep bluetooth
---------------------------------------------------------------------
安裝 bluetooth 套件:
apt-get update
apt-get install bluetooth bluez
apt-get upgrade -y
---------------------------------------------------------------------
啟動服務:
systemctl enable bluetooth.service
systemctl start bluetooth.service
systemctl status bluetooth.service
---------------------------------------------------------------------
設定檔:vi /etc/default/bluetooth
# Defaults for bluez-utils

# This file supersedes /etc/default/bluez-pan. If
# that exists on your system, you should use this
# file instead and remove the old one. Until you
# do so, the contents of this file will be ignored.

# start bluetooth on boot?
# compatibility note: If this variable is not found bluetooth will
# start
BLUETOOTH_ENABLED=1

# This setting will switch HID devices (e.g mouse/keyboad) to HCI mode, that is
# you will have bluetooth functionality from your dongle instead of only HID.
# Note that not every bluetooth dongle is capable of switching back to HID
# mode, see http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=355497
HID2HCI_ENABLED=1
HID2HCI_UNDO=1
---------------------------------------------------------------------
常用指令:
hciconfig: 顯示本機藍芽裝置
hciconfig -a: 顯示本機藍芽裝置詳細資訊
hciconfig hci0 up/down: 啟用 / 關閉第一個藍芽裝置 ( hci0 )
hcitool dev: 顯示本機所有藍芽裝置address
hcitool scan: 搜尋周邊欄芽裝置
---------------------------------------------------------------------
無線裝置軟/硬體開關 (blocked:no 為裝置開啟):
sudo rfkill list
0: acer-wireless: Wireless LAN
Soft blocked: yes
Hard blocked: no
1: acer-bluetooth: Bluetooth
Soft blocked: no
Hard blocked: no
2: phy0: Wireless LAN
Soft blocked: yes
Hard blocked: yes
3: hci0: Bluetooth
Soft blocked: no
Hard blocked: no
sudo rfkill block all -----------> 關閉全部無線裝置
rfkill unblock bluetooth--------> 只開啟 bluetooth
---------------------------------------------------------------------
使用 bluetoothctl 指令配對連線:
bluetoothctl -----------> 進入 bleutoothctl 指令模式 exit 或 quit 可離開

以下為 [bluetooth]# 下的指令:
help
version
power on -------------> 開啟藍芽
list --------------------> 查看本機 Bluetooth
discoverable off -------> 筆電藍芽不開放給別人看到
pairable off ------------> 筆電藍芽不開放給別人配對
scan on ----------------> 開啟掃描,此時會抓到我的鍵盤 BT address
[NEW] Device AB:CD:EF:00:11:22 我的鍵盤 BT Address

開始連線 ( [bluetooth]# 下):
info AB:CD:EF:00:11:22 -----> 查看鍵盤藍芽裝置
pair AB:CD:EF:00:11:22 -----> 配對
trust AB:CD:EF:00:11:22 -----> 加到信任
unblock AB:CD:EF:00:11:22 -> 不阻擋
connect AB:CD:EF:00:11:22 -> 連線

此時沒意外話,可以連上鍵盤了。
---------------------------------------------------------------------
Debug

善用幾個指令 debug 看系統訊息,方便至 google 爬文。
dmesg | grep -i bluetooth
sudo grep bluetooth /var/log/syslog
systemctl status bluetooth
---------------------------------------------------------------------
Debug1

核心驅動問題
cd /usr/src/linux
make menuconfig

進入 -*- Networking support  ---> <M>   Bluetooth subsystem support  --->
--- Bluetooth subsystem support
  │ │    [ ]   Bluetooth 6LoWPAN support
  │ │       RFCOMM protocol support
  │ │    [*]     RFCOMM TTY support
  │ │       BNEP protocol support
  │ │    [*]     Multicast filter support
  │ │    [*]     Protocol filter support
  │ │       CMTP protocol support
  │ │       HIDP protocol support
  │ │          Bluetooth device drivers  --->

進入 -*- Networking support  ---> <M>   Bluetooth subsystem support  ---> Bluetooth device drivers  -->
 HCI USB driver 
  │ │     HCI SDIO driver
  │ │     HCI UART driver
  │ │    [*]   UART (H4) protocol support
  │ │    [*]   BCSP protocol support
  │ │    [*]   Atheros AR300x serial support
  │ │    [*]   HCILL protocol support
  │ │    [*]   Three-wire UART (H5) protocol support
  │ │     HCI BCM203x USB driver
  │ │     HCI BPA10x USB driver
  │ │     HCI BlueFRITZ! USB driver
  │ │     HCI DTL1 (PC Card) driver
  │ │     HCI BT3C (PC Card) driver
  │ │     HCI BlueCard (PC Card) driver
  │ │     HCI UART (PC Card) device driver
  │ │     HCI VHCI (Virtual HCI device) driver
  │ │     Marvell Bluetooth driver support
  │ │       Marvell BT-over-SDIO driver
  │ │     Atheros firmware download driver

save ---> exit
time make-kpkg --initrd --revision=$version kernel_image -j $CORE
dpkg -i linux-image-$version_amd64.deb
reboot
.
.
.
其他驅動問題,參考 http://ubuntuforums.org/showthread.php?t=2251009

至 http://drvbp1.linux-foundation.org/~mcgrof/rel-html/backports/ 下載對應核心之 backport 檔,接著做:
cd Desktop/backports-3.18-rc1-1
make defconfig-ath9k
make
sudo make install
sudo reboot
---------------------------------------------------------------------
Debut 2

hciconfig ------> 無輸出
hcitool dev ----> 無裝置
hcitool scan ---> 無輸出

查看無線 WiFi/Bluetooth 卡是不是 Atheros 的?
lspci -k |grep -i network

參考 http://unix.stackexchange.com/questions/146097/bluetooth-device-not-working-debian-wheezy
可以試試安裝
apt-get install firmware-atheros
---------------------------------------------------------------------
Debug 3

因本人在編譯其他軔體時,不小心誤將 Bluetooth 的其中一個 firmware 刪除或覆蓋,因此在開機的時候,就顯示如下圖:



使用以下指令也可以看到此錯誤訊息:
dmesg | grep -i bluetooth

使用下列指令去尋找 ar3k 這個資料夾:
find / -name ar3k

確實裏面找不到 ramps_0x11020100_40.dfu 這個檔案

可以到以下網址去下載:
http://git.kernel.org/cgit/linux/kernel/git/firmware/linux-firmware.git/tree/ar3k

將所缺失的檔案載入,就ok了。

然後在 reboot 。
---------------------------------------------------------------------



Reference:
https://wiki.debian.org/BluetoothUser




2015年6月15日 星期一

設定指令優先權(Java 安裝為例)



update-alternatives --install <連結> <名稱> <路徑> <優先權>
update-alternatives --config <指令>



範例來說明:
當我們想裝最新版本的 Java,但又本身電腦裝有舊版時,
但想要兩者皆保留,而目前需要使用的是最新版本。

1. 查看目前版本,下面 "1.7.0_79" 是舊版:
java -version
java version "1.7.0_79"
OpenJDK Runtime Environment (IcedTea 2.5.5) (7u79-2.5.5-1~deb8u1)
OpenJDK 64-Bit Server VM (build 24.79-b02, mixed mode)

2. 下載最新版本:
Java SE Development Kit 8u45

這邊我是選擇下載 jdk-8u45-linux-x64.tar.gz

3. 解壓縮
sudo tar xfva jdk-8u45-linux-x64.tar.gz -C /opt

4. 設定 PATH (一般USER)
cd ~
vi .bashrc
PATH=$PATH:/opt/jdk1.8.0_45/bin
source .bashrc

5. 新增優先權選項
sudo update-alternatives --install "/usr/bin/java" "java" "/opt/jdk1.8.0_45/bin/java" 1

6. 設定 /urs/bin/java 這指令優先權
sudo update-alternatives --config java
  選項       路徑                                          優先權  狀態
------------------------------------------------------------
* 0            /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java   1071      自動模式
  1            /opt/jdk1.8.0_45/bin/java                        0         手動模式
  2            /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java   1071      手動模式
選擇 1 ; enter

7. 檢查版本,要可以看到最新版
java -version
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)