天天看點

java學習筆記(一)程式基本結構

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++)

{.........}//可以列印出一個直角三角形的數字矩陣