Java程式設計的基本結構
1.一個簡單的Java應用程式(要十分注意java的大小寫)
關鍵字class表明Java的全部程式都在類中(這裡有一個對于類的有意思定義:将類看做是加載程式邏輯的容器,程式邏輯定義了應用程式的行為)
********************************************************************
public class FirstSample //這一行是表明了類的類型
{
public static void main(String[] args) //在所有包含主線程的程式中都會出現
{
System.out.println("HelloWorld"); //在螢幕上列印出“HelloWorld”
}
}
在類名以及關鍵字方面的限制:
類名必須以字母開頭,但是在後面的命名就可以随意的采用數字或者是字母,而且沒有長度的限制。類名最好采用駱駝命名法(這樣顯得專業)
注意:
1>
所謂的駝峰命名法就是以單詞組成你的函數名(方法名),變量,但是每個單詞的首字母都要大寫
例如: FirstSample isPrime
2>
System.out.print()這個方法在輸出之後不換行,緊緊地跟随在最後一個字元的後面
System.out.println()這個方法在列印進行的時候,會進行換行
2.注釋
注釋一共有三種類型:
一。行注釋以//開始,到一行的末尾結束
第二就是塊注釋以結尾,同樣的在Java中不能再進行嵌套其他的注釋符
第三就是用來自動的生成文檔用法就是
3.資料類型
a.整型
整型一共有四種類型:
标準整型int(範圍是正負二十億)、
短整型short(範圍是正負三萬兩千多)、
長整形long(反正是8個位元組,大的很)、
byte(127)
注意:
1>
長整形的後面有l或L, 16進制有0x的字首,八進制有字首0(不過不容易與進制進行區分)
2>
從Java 7 開始就可以在數字的字面量的前面加上0b/0B,并且在數字中加上下劃線例如1_000_1111,編譯器在後期會把它删除,不用管。
3>
在Java中沒有無符号類型
b.浮點類型
浮點類型就隻有兩類單精度和雙精度(float/double),大部分在工程中的應用都是雙精度的。注意如果要使用單精度的時候(在單精度變量的後面加上F/f字尾,雙精度是預設的)
浮點數值用十六進制進行表示
注:
在十六進制表示法中,使用p表示指數而不是e
用于表示出錯情況和溢出的三個特殊的浮點數值:正無窮大、負無窮小、NaN(不是數字)
能不能檢測一個資料是不是非數值的一種方法(NaN的判斷的方法)
//例如正整數除以0就是NaN
if(Double.isNaN(x))
//檢測一個值是不是NaN
c.字元類型(char)
推薦盡量不要使用
d.變量
1>
變量的定義、變量的初始化
int variable = 100; //所有的變量都要進行指派
double Dvariable = 100.0;
2>
常量的定義 在Java中利用final來訓示常量,該變量隻能被指派一次,用大寫
可以使用一個常量類static final 定義的數值可以在一個類中的多個“函數”使用。一般定義于main方法的外部。如果一個常量聲明為public,其他的類的“函數”也可以使用這個常量。
4.運算符
a一般的具體運算符
+ - * / %
b.在Math類中包含各式各樣的數學函數:
計算數值的平方根sqrt() 例如 double y = Math.sqrt(x);
******************************************
具體的可以使用牛頓疊代法實作:
public static double sqrt(double c)
{
if(c < 0) return Double.NaN;
double err = 1e - 15;
double t = c;
while(Math.abs(t - c / t) > err * t) //abs是絕對值的方法
t = (c / t + t) * 2.0;
return t;
}
************************************************
進行幂運算所要用的pow()
例如 double y = Math.pow(x,a); //傳入兩個double參數,而且最後的計算結果也是double
進行取餘運算的floorMod(position+adjustment,12)得到0到11内的數
一些三角函數方法:Math.sin()、Math.cos()、Math.tan()、Math.atan()、Math.atan2()、
指數函數Math.exp、反函數Math.log、以10為底的對數Math.log10、
圓周率Math.PI,e的常量Math.E
注:
(調用這些數學方法的方法:在源檔案的頂部加上這些代碼 import static java.lang.Math.*,就可以使用了)
c.數值類型轉換(略)、強制轉換(略)
注:
進行舍入運算就是找到最為接近的整數,調用Math.round方法
double x = 9.997;
int nx = (int)Math.round(x); //保留為最近的整數,仍然得強制轉換為整型
d.結合指派(強制跟随被指派對象的類型)、自增/自減運算符(不要用)、關系運算符(略)、位運算符(P43)、括号/運算符級别(會細講這個問題)
5.字元串
a.子串
使用String類的substring方法從一個大的字元串中提取一個字串
String greeting = “Hello”;
String s = greeting.substring(0,3); //建立Hel
Substring的第二個參數是不想複制的第一個位置,在String類中字元串都是從0開始計算
b.拼接
在Java中可以使用“+”進行連接配接,在連接配接的時候單詞與單詞之間的空格不計
進行字元串與非字元串進行拼接時,将非字元串轉換為字元串
int age = 13;
String rating = “PG”+age; //結果為PG13
将多個字元串連接配接在一起,使用分界符分割,并且使用靜态的join方法
String all = String.join(“/”,”S”,”M”,”L”,”XL”);//輸出S/M/L/XL
c.不可變字元串
在Java的String類中沒有提供可以修改字元串的方法,可以先将目标字元串提取出來,再進行連接配接
d.檢查字元串是否相等
使用equals方法進行字元串,字元的比較
s.equals(t); // 檢測兩個s,t字元串是否相等
如果比較兩個字元串相等與否(不區分大小寫)
“Hello”.equalsIgnoreCase(“hello”);
不要使用==運算符進行字元串是否相等的判斷
e.空串與Null串
空串就是長度為0的字元串,可以用來檢測一個字元串是不是為空
調用方法:
if(str.length()==0) if(str.equals(“”)) //用來判斷字元串是不是空
注:
空串是一個java對象,有自己的串長度(0)和内容(空)
不過有一個特殊的值,null,這個變量沒有任何對象與之關聯
檢測方法:
if(srt == null) //檢測一個字元串是不是null
if(str != null && str.length() != 0)
//檢測一個字元串既不是空字元串,也不是null
f.碼點和代碼單元
1>
length方法傳回采用UTF-16編碼方式的代碼長度(字元串所需的代碼單元的數量)
String greeting = “Hello”;
int n = greeting.length(); //傳回5
2>
得到實際的長度就是碼點的數量
int cpCount = greeting.codePointCount(0,greeting.length());
3>
調用s.charAt(n)傳回位置n的代碼單元
char first = greeting.charAt(0); //傳回Hello的第一個字元H
使用codePoint的方法來周遊字元串
int cp = sentance.codePointAt(i);
if(Charcter.isSupplementaryCodePoint(cp)) i += 2;
else i++;
g.建構字元串
連接配接許多小段字元串用StringBuilder類
步驟:
建構一個空的字元串建構器
StringBuilder builder = new StringBuilder();
當每次添加一部分内容的時候
builder.append(ch);
builder.append(str);
在需要建構字元串的時候調用toString類,得到一個String對象
String completedString = builder.toString();
6.輸入輸出
A.
讀取輸入(Scanner定義在java.util.*包中,在使用之前必須将它用import加載進來)
進行标準輸入流System.in,首先構造一個Scanner對象,并與System.in相關聯
Scanner in = new Scanner(System.in);
使用Scanner類的方法進行輸入的操作
****************************************************
nextLine方法輸入一行(在輸入的行中可能存在空格)
System.out.println(“What your name?”);
String name = in.nextLine();
讀取一個整數,調用nextInt方法
System.out.println(“How old are you?”);
int age = in.nextInt();
想要讀取下一個浮點數,調用nextDouble方法
int num = in.nextDouble();
使用Java中的Console這個類進行密碼的輸入
Console cons = System.console();
String username = cons.readLine(“User name :”);
char[] passwd = cons.readPassword(“Password :”);
注:
傳回的密碼是存放在一維數組中,對密碼進行處理之後吧應該立刻用填充值來覆寫這個密碼的值
B.格式化的輸出
利用Java SE 中的C語言庫函數中的printf方法
double x = 10000.0/3.0;
System.out.printf(“%8.2f”,x);//可以用8個字元寬度,以及可以小數點後兩位
在printf的方法中可以使用多個參數
System.out.printf(“Hello,%s . Next year ,you will be %d ”,name,age);
System.out.printf(“Hello,”+name+”. Next year ,you will be ”+(age+1));
//對比這兩句話上面的在名字,年齡的地方進行了替換
注:
每一個以%開頭的格式說明符都用相應的參數進行替換,f表示浮點數,d表示整數,s表示字元串
System.out.printf(“%,.2f”,10000.0/3.0);//輸出3,333.33
printf方法中時間和日期的表達方法(本來可以直接使用java.time包)
格式包括兩個字母,以t開始以轉換表中的任意一個轉換符為結束System.out.printf(“%tc”,new date());
//列印出目前的日期和時間 Mon Feb 09 18:05:19 PST 2015
System.out.printf(“%tF”,new date()); //列印ISO8601日期
C.檔案輸入與輸出*
想要對檔案進行讀取,就需要用File對象構造一個Scanner對象
Scanner in = new Scanner(Path.get(“myfile.txt”),”UTF-8”);
//指定了采用UTF-8編碼形式的名為myfile的txt檔案,就是生成了一個檔案叫做myfile
如果檔案中包含反斜杠“\”,必須在每個反斜杠之前再加一個額外的反斜杠“\”
“C:\\mydirectory\\myfile.txt”
想要寫入檔案,就需要構造一個PrintWriter對象,在構造器中,隻需要提供檔案名
PrintWriter out = new Scanner(“myfile.txt”,”UTF-8”);
//如果該檔案不存在,就會建立該檔案,然後就可以正常的使用print,println,printf
注:
如果用一個不存在的檔案建構一個Scanner,或者用一個不能被建立的檔案名,系統就會抛出異常
public static void main(String[] args) throws IOexception
{
Scanner in = new Scanner(Path.get("myfile.txt"),"UTF-8");
}
當發生異常的時候,紅色字型的部分的功能就是抛出這個異常的原因與形式
//**********************************************
API
* java.util.Scanner
Scanner(File f) //構造從指定檔案中讀取資料的Scanner
Scanner(String data) //構造從給定字元串中讀取資料
* java.io.PrintWriter
PrintWriter(String fileName) //将資料寫入檔案中,名字自己起
* java.nio.Paths
static Path get(String pathname) //根據給定的路徑名,構造一個Path,就是指路
//*********************************************************************
7.控制流
A.塊作用域
一對大括号括起來的多條Java語句(在嵌套的塊中不能定義同名的變量---就是括号
套括号的情況下)
B.條件語句(與C++一樣略)
C.循環(略與C++一樣)
注:
for循環進行浮點數比較的時候,由于舍入否認操作有可能永遠無法繼續進行下面步驟
for(double x = 0;x != 10;x += 0.1;)
在循環體内部定義的變量不能再定義到外部
switch語句與C++完全一樣(略)
在Java中switch的标簽case
*可以是char、byte、short、int的常量表達式
*枚舉常量
*case标簽還可以是字元串字面常量
***********************************
String input;
Switch(input.toLowerCase())
{
case "yes" :
.........
break;
}
D.中斷控制流程語句
break語句
正常的不帶标簽的break語句
while(years <= 100)
{
balance += payment;
double interest = banlance * interestRate / 100;
balance += interest;
if(balance >= goal) break;
years++;
}
使用case的标簽跳轉語句(就是在你想要跳轉的地方放置一個标簽,然後使用break語句+你的标簽)
注:所有的置在外面的标簽的值必須放在最外層循環之前,加上冒号
read_data:
while(......)
{ ........
break read_data;
}//作用就是傳回上一個放置标簽read_data的地方(最外層)
如果輸入有誤的話,break就會跳轉到帶标簽語句塊的末尾,是以當循環中帶有break标簽的時候必須檢測循環能不能正常進行
continue語句
将語句控制轉到最内層的循環
*******************************************
Scanner in = new Scanner(System.in);
while(sum>goal)
{.........
if(n<0) continue;
statement.....
}//直接跳出目前循環的剩餘部分,直接跳到循環的首部(在沒有for語句的情況下)
//for語句的話,就是直接跳轉到for語句的“++部分”
還有帶标簽的continue語句,就是跳到帶有标簽的循環塊的首部
大數值
使用java.math包中的BigInteger BigDecimal (就是處理超出範圍的數的方法)
調用包的格式:
import java .math.*; //使用math這個包
BigInteger實作了對于任意精度的整數進行計算
BigDecimal實作了對于任意精度的浮點數的計算
BigInteger a = BigInteger.valueOf(100);
//将100轉為精度不受限制的大數值
不能繼續使用通常的“+”“*”進行一般的算術運算
BigInteger c = a.add(b); //将大數值a和b進行相加
BigInteger d = c.multiply(b.add(BigInteger.valueOf(2))); //d=c*(b+2)
BigInteger k = d.divide(b); //k=d/b
在Java中裡面用一個包的方法必須先:包名 變量名 =包名.方法名(參數)
//****************************************************************
API
* java.math.BigInteger
BigInteger a .add(BigInteger b) //a+b
BigInteger a.multiply(BigInteger b) //a*b
BigInteger a.divide(BigInteger b) //a/b
BigInteger a.mod(BigInteger b) //a%b
BigInteger a.subtract(BigInteger b) //a-b
int a.compareTo(BigInteger b) //a,b相等傳回0,a<b傳回負數,a>b傳回正數
BigDecimal (和BigInteger一樣的用法)
//*************************************************************************
9.數組
A.數組的基本概念
聲明數組:
int[] a; //聲明一個變量名為a的整型數組
對數組進行初始化操作
int[] a = new a[100]; //建立一個可以儲存100個元素的數組,并且将數組初始化為0
對數組進行循環指派
for(int i= 0;i<100;i++)
a[i] = i; //填充數組從0到99(fills the array with numbers 0 to 99)
*建立一個數字數組時,初始化為0
int[] a = new a[100];
*建立一個boolean數組,初始化為false
*建立一個對象數組,初始化為null(表示在這些元素中啥也沒有)
String[] names = new String[10];
for(int i=0;i<10;i++)
names[i] = “ ”; //指定元素為空串
想要擷取數組中字元的個數,使用array.length方法
for(int i=0;i<array.length;i++)
B.for each循環
定義一個變量暫時存放集合中的每個元素,并執行相應的語句或是語句塊
for(int element: a)
System.out.println(element); //周遊a中的每一個元素,執行相應的語句
可以利用Arrays類中的toString方法直接就進行輸出
System.out.println(Arrays.toString(a));
//将a中的所有元素以逗号進行分割,并且放在括号裡列印出來
C.數組的初始化以及匿名數組
int[] smallPrimers = {2,3,4,5,6};
//不用調用new
new int[] {34,45}; //直接開辟匿名數組
int[] smallPrimers = new int[] {34,45}
//使用匿名數組給已知數組重刷
int[] annoymous = {23,45};
smallPrimer = annoymous; //直接就可以用數組來初始化數組(重刷,確定類型一緻
注:Java中數組可以為0長度
D.數組拷貝
在Java中可以将一個數組變量拷貝給另外的一個數組變量(就是用數組聲明數組)
int[] a = smallPrimer;//smallPrimer也是一個數組變量
将整個數組的所有的值進行拷貝,使用Arrays類的copyOf方法
int[] copiedLuckyNumber = Arrays.copyOf(LuckyNumber,LuckyNumber.length);
//方法中的參數就是數組名,數組長度
可以使用這樣的拷貝方法增加數組的長度
int[] LuckyNumber = Arrays.copyOf(LuckyNumber,2*LuckyNumber.length);
注:
如果數組時數字型的,多餘的數字就會被置為0
如果數組時boolean類型,多餘的元素就會被置為false
如果你将要進行拷貝的目标數組的位寬小,拷貝的數組就會截斷
E.指令行參數
每一個Java程式都帶有String arg[]參數的main方法,表明main方法接受一個字元串數組
**************************************
public class Massage
{
public static void main(String[] args)
{
if(args.length == 0 || args[0].equals("-h"))
System.out.print("Hello ");
else
if(args[0].equals("-g"))
System.out.print("Goodbye ,");
for(int i = 0;i < args.length;i++)
System.out.print(" "+args[i]);
}
}
如果在指令行界面輸入
java Massage -g cruel world
//這個數組包含以下的内容
-g
cruel
world
然後運作這個程式
Goodbye,cruel world
***********************
注:
你在同時必須要注意,所謂的java Massage 并不包含在args數組當中
F.數組排序
1>
對數值型數組進行排序用Arrays類中的sort方法
int[] a = new int[100];
Arrays.sort(a);
2>
産生随機數
調用Math.random方法傳回一個0到1之間的随機浮點數
int r = (int)(Math.random() * n);
//用傳回的這個浮點數乘以n就可以得到0 到n- 1之間的一個整數了
API
static type copeOf(type[] a,int length) //拷貝數組,後面的是長度
static type sort(type[] a) //對數組進行排序
static void fill(type[] a.type v) //将數組全部置為v,類型随前面
static boolean equals(type[] a,type[] b)
//數組a,b大小相同,下标元素相同傳回true ***********************************************************
G.多元數組(和c++完全一緻)
二維數組初始化
int[][] a = {
{1,2,3,4},
{2,3,4,5},
{3,4,5,6},
{4,5,6,7}
}
for each循環不能自動的處理多元數組,需要進行嵌套
for(double[] row:a) //周遊二維數組的行變量
for(double[] value:row) //周遊二維數組的列變量,其中把上一個的中間變量作為下一個的周遊數組
快速列印二維數組
System.out.println(Arrays.deepToString(a))
H.不規則數組
建立不規則數組
int[][] odds = new int[MAX+1][];
對行,以及列進行建立
for(int i = 0;i<odds.length;i++)
odds[i] = new int[i+1];
對數組進行指派
for(int i = 0;i < odds.length;i++)
for(int k = 0;k < odds[i].length;k++)
{.........}//可以列印出一個直角三角形的數字矩陣