此外JVM的技術不斷進步, 諸如Just In Time(JIT) Compiler, 或HotSpot等技術都可以讓Java程式以非常接近原生碼(Native Code)的速度執行。因此不要因為某些偏頗的報告或直覺, 就不使用Java了。
開發Java應用程式的工具中,最常見的是由Java的原創公司Sun Micro所出版的JDK(Java Development Kit)。JDK可以免費下載。以Text Editor寫好的Hello.java原始檔:
public class Hello {
public static int gvar;
public static void say(String s) {
int x = 10;
System.out.print(s+x);
}
public static void main(String[] argv) {
float y = 0;
say("Hello, world\n");
}
}
這程式的C版本如下
#include <stdio.h>
int gvar;
void say(char[] s) {
int x = 10;
printf("%s%d", s, x);
}
int main(int argc, char** argv) {
float y = 0;
say("Hello, world\n");
}
優先權
種類 運算符號 結合順序
group (op) left to right
postfix [] . (params) op++ op-- right to left
prefix ++op --op +op -op ~ ! right to left
creation or casting new (type)op right to left
multiplicative * / % left to right
additive + - left to right
shift << >> >>> left to right
relational < > <= >= instanceof == left to right
equality == != left to right
bitwise and & left to right
bitwise exclusive or ^ left to right
bitwise inclusive or | left to right
logical and && left to right
logical or || left to right
conditional ? : right to left
assignment = += -= *= /= %= &= ^= |= <<= >>= >>>= right to left
seperator , left to right
public class BreakContinueExample {
public static void main(String[] argv) {
int i, j;
outerLoop:
for (i = 0; i < 100; i++) {
innerLoop:
for (j = 0; j < 100; j++) {
if (j == 50 && i == 50) {
break outerLoop;
}
}
}
System.out.println("Loop have been terminated.");
}
}
public class StringTest {
public static void main(String[] argv) {
int x = 5;
float y = 1.5;
System.out.println("x = " + x + ", y = " + y);
}
}
會翻譯成:
public class StringTest {
public static void main(String[] argv) {
int x = 5;
float y = 1.5;
System.out.println((new StringBuffer("x = ")).append(x).append(", y = ").append(y).toString());
}
}
Java語言的寫作風格
寫作Java程式時,請注意下列幾種風格
Class Name請首字大寫
Variable Name和Method Name請首字小寫
如果名稱由數個英文字組成,第二個英文字以後首字大寫
內縮四個空格
註解部分如要變成說明文件,請遵照javadoc這個工具的寫作規則
/**
* 第一行的兩個**用來告訴javadoc此部份註解要變成HTML文件的一部份
* 這段註解裡的所有文字都會變成此類別一開頭的說明
*/
public class Hello { // Class Name首字大寫
/**
* 此段註解會變成描述main方法的一部分
* @param argv 使用@param註記會產生參數(parameter)argv的相關說明
* @return 傳回值的意義說明
*/
public static void main(String[] argv) { // Method Name首字小寫
// argv: array of references to String object
int myVariable; // 變數宣告
int i, sum;
for (i = 1, sum = 0; i <= 100; i++) {
sum += i;
}
System.out.println("summation from 1 to 100 is "+sum);
}
作者: mm117777 時間: 2012-6-21 00:10:13
運算符號範例
攝氏溫度轉華氏溫度
public class Example {
public static void main(String[] argv) {
float degree = 100.0;
System.out.println("100C=" + (degree * 9.0 / 5.0 + 32.0));
}
}
華氏溫度轉攝氏溫度
怎麼寫呢?
1 + 2 + ... + n的總合
public class Example {
public static void main(String[] argv) {
int n = 100;
System.out.println("1+2+...+"+n+" = " + ( n * (n + 1) / 2));
}
}
public class Example {
public static void main(String[] argv) {
double x = 20.6;
System.out.println(x + " 四捨五入成為 " + (int)(x+0.5));
System.out.println(x + " 四捨五入成為 " + round(x));
}
static int round(double y) {
return (int)(y + 0.5);
}
}
迴圈範例
寫一程式輸入5個整數數字,計算其總合和平均。解析:
需要1個變數紀錄到目前為止所有inputNum的總和,稱此變數為sum,其初始值為0
以迴圈執行5次,每次輸入數字加總到sum,迴圈執行的次數以變數i來代表
平均數為sum/5
如何讀入資料?
import java.util.Scanner;
public class Example {
public static void main(String[] argv) {
int sum = 0, i = 0;
Scanner in = new Scanner(System.in);
while (i < 5 && in.hasNextInt()) {
sum = sum + in.nextInt();
i++;
}
System.out.println("sum is "+sum", average is "+(sum/5.0));
}
}
寫一函數輸入參數int n,傳回1 + 2 + 3 ... + n的總合。解析:
要想辦法拜訪1,2,3...n的每一個數字一次
可用for(i=1; i <= n; i++)的形式達成上述目標
拜訪到這些數字時,就把它們加起來
public class Example {
public static int sum(int n) {
int total = 0; // 紀錄到目前為止的總和
for (int i = 1; i <= n; i++) {
total += i;
}
return total;
}
public static void main(String[] argv) {
System.out.println(sum(100));
}
}
寫一函數於螢幕上畫出九九乘法表。解析:
總共有i = 1..9 列, j = 1..9 行, 對第i列第j行元素來說, 其數值為i*j
public class Example {
public static void main(String[] argv) {
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= 9; j++) {
System.out.print(" " + (i * j));
}
System.out.println();
}
}
}
輸入參數int size,並在螢幕上印出正方形,size=3的樣子如下
***
***
***
解析
螢幕上的游標只能由上而下,由左而右,無法回頭。
此圖形共有1..size列,每列有size個*,因此可用兩層迴圈來做。
要讓一個敘述執行size次,可用for(i = 1; i <= size; i++)的形式來達成
public class Example {
public static void print(int size) {
int i, j; // 第i列,第j行
for (i = 1; i <= size; i++) { // 印出第i列
for (j = 1; j <= size; j++) { // 第i列有size個*
System.out.print("*");
}
System.out.println();
}
}
public static void main(String[] argv) throws Exception {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
print(Integer.parseInt(in.readLine()));
}
}
寫一函數求兩個整數的最大公因數,解析:
此函數需要兩個參數x,y
當y不能整除x時,將x設成為y,y設為x%y, 重複此步驟直到x%y為0
此時y就是這兩個數的最大公因數
public class Example {
public static void main(String[] argv) {
System.out.println(gcd(12,18));
}
public static int gcd(int x, int y) {
int tmp;
// 如果x < y 則下面的迴圈執行第一次時就會交換x,y了
while (x % y != 0) {
tmp = y;
y = x % y;
x = tmp;
}
return y;
}
}
寫一函數求兩個整數的最小公倍數
怎麼寫?
寫一函數求費氏數,解析:
F(n)=n, if n<=1;
F(n)=F(n-1)+F(n-2), otherwise
可定義兩變數fn_1,fn_2表示最近兩個找出的費氏數
下一個費氏數依定義為fn_1 + fn_2
找到最新的費氏數後,最近的兩個費氏數就變成了fn_1+fn_2以及fn_1
以變數i紀錄目前要求的是哪一個費氏數
以變數tmp作為更新最新兩個費氏數所需的記憶體空間
public class Example {
public static void main(String[] argv) {
System.out.println(fab(5));
}
public static int fab(int n) {
int fn_1 = 1, fn_2 = 0; // 紀錄最近找到的兩個費氏數
int i, tmp; // i表示目前要找F(i)
if (n <= 1) return n;
for (i = 2; i <= n; i++) {
tmp = fn_1; // 先把fn_1紀錄在tmp
fn_1 += fn_2; // 最新的費氏數是前面兩個相加
fn_2 = tmp; // 第二新的就是原先的fn_1
}
return fn_1;
}
}
遞迴(recursion)範例
求1+2+3+...+n
解析
邊際條件是n=1時,總合為1
該函數可定成int sum(int n)
sum(n) = n + sum(n - 1)
public class Example {
public static void main(String[] argv) {
System.out.println(sum(100));
}
public static int sum(int n) {
if (n == 1) {
return 1;
}
return n + sum(n - 1);
}
}
以遞迴計算1*2+2*3+3*4+…+(n-1)*n之和
怎麼寫?
利用遞迴求得A的B次方
public class Example {
public static void main(String[] argv) {
System.out.println(power(2, 6));
}
public static int power(int a, int b) {
switch(b) {
case 0: return 1;
case 1: return a;
default: return (a * power(a, b - 1));
}
}
費氏數列的定義為F(n)=n, if n<= 1
F(n) = F(n-1)+F(n-2), if n > 1。
public class Example {
public static void main(String[] argv) {
System.out.println(fab(5));
}
public static int fab(int num) {
if (num <= 1) {
return num;
}
return fab(num - 1) + fab(num - 2);
}
}
Ackerman函數
A(m, n)定義為
n + 1, if m = 0
A(m - 1, 1), if n = 0
A(m - 1, A(m, n - 1)), otherwise