Java語言基礎

(一)Java編譯運行過程

 編譯期:Java源文件經過編譯生成.class位元組碼文件
 運行期:JVM加載.class並運行.class
 特點:跨平台,一次編譯到處使用(跨平台特性如下圖)

(二)JVM、JRE、JDK

 JVM:(Java Virtual Machine),Java虛擬機
 JRE:(Java Runtime Environment),Java運行環境,除包含JVM外還包含運行Java程序所必須的環境,JRE = JVM + Java系統類庫
 JDK:(Java Development Kit),Java開發工具包,JDK = JRE + 編譯運行等命令工具

  • 說明:
    • 運行Java程序最小環境為JRE
    • 開發Java程序最小的環境為JDK

(三)變量的命名

 在程序執行過程中,其值能被改變的量稱為變量,其值不能改變的量稱為常量。變量與常量的命名都必須使用合法的標識符。

    變量的命名應遵循以下規則:
      -只能包含字母、數字、_和$符,並且不能以數字開頭
      -嚴格區分大小寫
      -不能使用關鍵字
      -允許中文命名,但不建議,建議"英文的見名知意"、"小駝峰命名法"

(四)代碼注釋

  通過在程序代碼中添加註釋可以提高程序代碼的可讀性和可維護性,幫助程序員更好的閱讀和理解程序。Java語言提供 3 種添加註釋的方法,分別為單行注釋、多行注釋和文檔注釋。

  • 單行注釋
    「//」為單行注釋標記,從符號「//」開始直到換行為止的所有內容均為注釋而被編譯器忽略。語法如下:

        //注釋內容
    
        例如,以下代碼為聲明 int 型變量添加註釋:
        int age;    //聲明 int 變量用於保存年齡信息
    
  • 多行注釋
    「/* */」為多行注釋標記,符號「/*」與「*/」之間的所有內容均為注釋內容。注釋中的內容可以換行。語法如下:

      /*
      注釋內容 1
      注釋內容 2
      ...
      */
    
      //多行注釋中可以嵌套單行注釋,但是多行注釋中不可以嵌套多行注釋
    
  • 文檔注釋

    「/** */」為文檔注釋標記,符號「/**」與「*/」之間的所有內容均為注釋內容。注釋中的內容可以換行。在文檔注釋出現在聲明(如類的聲明、類的成員變量的聲明、類的成員方法的聲明、類的成員方法的聲明等)之前時,會被Javadoc文檔工具讀取作為Javadoc的文檔內容。文檔注釋的格式與多行注釋的格式相同。

(五)Java數據類型

1、Java語言提供了四類八種基本數據類型:

  整數類型:byte、short、int、long
  浮點數類型:float、double
  布爾類型:boolean
  字符類型:char

2、簡述java的8種基本數據類型:

byte:     位元組型,用於存儲整數,佔用 1 個位元組,範圍 -128 ~ 127,默認值是 0
short:   短整型,用於存儲整數,佔用 2 個位元組,範圍 -32768 ~ 32767,默認值是 0
int:     整型,用於存儲整數,佔用 4 個位元組,範圍 -2^31 ~ 2^31-1,默認值是 0
long:    長整型,用於存儲較大的整數,佔用 8 個位元組,範圍 -2^63 ~ 2^63-1,默認值是 0L
float:    單精度浮點數,用於存儲小數,佔用 4 個位元組,不能表示精確的值,默認值是 0.0F
double:  雙精度浮點數,用於存儲小數,佔用 8 個位元組,不能表示精確的值,默認值是 0.0D
boolean: 布爾型,用於存儲 true 和 false,佔用 1 個位元組,默認值是 false
char:    字符型,採用 Unicode 字符集編碼,用於存儲單個字符,佔用 2 個位元組,範圍 0 ~ 65535
  舉個栗子:
  byte a = 100;byte b = -50;

  short s = 1000;short r = -20000;

  int a = 100000;int b = -200000;  //1)整數直接量默認為int類型,但不能超出範圍,若超出範圍則發生編譯錯誤 2)兩個整數相除,結果還是整數,小數位無條件捨棄 3)運算時若超出範圍,則發生溢出,溢出是需要避免的

  long a = 100000L;Long b = -200000L;  //長整型直接量需要在數字後加 L 或者 l,運算時若可能溢出,建議在第一個數字後加L

  //浮點數直接量默認為double類型,若想表示float,需在數字後加F 或 f
  //double 或 float型數據參與運算時,有可能出現舍入誤差,精確場合不能使用
  float f = 3.14F;   //3.14F為float型直接量

  double d = 3.14;    //3.14為浮點數直接量,默認為double型

  boolean b1 = true;boolean b2 = false;  //true 和 false 都是布爾類型的直接量

  char letter = 'A';  //char類型,字符型直接量必須放到單引號裏面,單引號裏面必須有字符,只能有一個字符,特殊符號需要通過\來轉義,例如:char c = '\\' 表示字符 \ ;

3、數據類型間的轉換

  • 小到大依次為:byte-short/char-int-long-float-double
  • 自動/隱式類型轉換:由小到大
  • 強制類型轉換:語法(要轉換成為的數據類型)變量,由大到小,強轉有可能發生溢出或丟失精度
  int a = 5;
  long b = a; //自動類型轉換
  int c = (int) b; //強制類型轉換

  long d = 5;
  double e = 5;
  long f = 10000000000L;
  int g = (int) f;
  System.out.println(g);  //1410065408    強轉有可能會內存溢出
  double h = 23.34545;
  int i = (int) h;
  System.out.println(i);  //23    強轉有可能會丟失精度

  //整數直接量可以直接賦值給byte、short、char,但是不能超出範圍
  //byte、short、char型的數據參與運算,系統會將其自動轉換為int再運算
  byte b = 3;
  byte b1 = 5;
  byte b2 = (byte) (b + b1);
  System.out.println(b2);

  System.out.println('2' + '2');//100.'2'的碼50 加上 '2'的碼50 ,得100

(六)Java中的運算符

  • 算數運算符:+、——、*、/、%、++、–
  • 關係運算符:>、<、>=、<=、==、!=
  • 邏輯運算符:&&、||、!
  • 賦值運算符:=、+=、-=、*=、/=、%=
  • 字符串連接符:+
  • 條件運算符:boolean ? 數1 : 數2
  算數運算符自增(++)、自減(--)使用的兩種不同情況:
  單獨使用時:在前在後都是會使值自增1
  被使用時:a++/a--  ————————先賦值,再運算
            ++a/--a   ————————先運算,再賦值
        
public class OperatorDemo {
    public static void main(String[] args) {
            //自增、自減運算演示

            //單獨使用時,都會自增/自減1
            int a = 5, b = 10;
            a++;
            b++;
            System.out.println("a = " + a); //6
            System.out.println("b = " + b); //11

            //被使用時。運算符在前,先運算後賦值;運算符在後,先賦值後運算
            int c = 20, d = 20;
            int e = c++;
            int f = ++d;
            System.out.println("e = " + e); //20
            System.out.println("f = " + f); //21
    }
}

(七)Java中的流程控制

1、程序結構

  • 順序結構:按照書寫順序執行的語句構成的程序段,從上往下執行,每句必走
  • 分支結構:有條件的執行不同的語句,並非每句都走
  • 循環結構:循環條件滿足的情況下,反覆執行一段相同或相似的代碼

2、if條件語句
 主要用於告訴程序在某個條件成立的情況下執行某段語句。語法結構和執行過程如下:

1)語法:
     if(boolean){
        語句塊;
      }
2)執行過程:
      判斷boolean的值:
      若為true,則執行語句塊(if結束)
      若為false,則if直接結束

3、if…else語句
 如果滿足某種條件,就進行某種處理,否則就進行另一種處理。語法結構和執行過程如下:

1)語法:
    if(boolean){
       語句塊1
    }else{
       語句塊2
    }
2)執行過程:
    判斷boolean的值:
    若為true,則執行語句塊1(整個結束)
    若為false,則執行語句塊2(整個結束)
3)說明:
    語句塊1和語句塊2,必走其中之一-----------2選1

4、if…else…if語句
 針對某一事物的多種情況進行處理,通常表現為「如果滿足某種條件就進行某種處理,如果滿足另一種條件就進行另一種處理」。語法結構和執行過程如下:

1)語法:
    if(boolean-1){
       語句塊1
    }else if(boolean-2){
       語句塊2
    }else if(boolean-3){
       語句塊3
    }else{
       語句塊4
    }
2)執行過程:
     判斷boolean-1,若為true則執行語句塊1(結束),若為false則
     再判斷boolean-2,若為true則執行語句塊2(結束),若為false則
     再判斷boolean-3,若為true則執行語句塊3(結束),若為false則執行語句塊4(結束)
3)說明:
     語句塊1/2/3/4,只能執行其中之一---------多選1

5、switch…case語句
 根據不同的值給出輸出語句,實現多選一的效果。相比較而言,效率高,結構清晰,但是只能對整數判斷相等。swich…case能作用在byte、short、int、char、String、枚舉等類型的變量上。語法如下:

switch(用於判斷的參數){
case 常量表達式1:	語句1;	break;
case 常量表達式2:	語句2;	break;
...
case 常量表達式n:	語句n;	break;
default:    語句n+1;	break;
}

6、while循環語句
 利用一個條件來控制是否要繼續反覆執行一個語句。先判斷後執行,有可能一次也不執行。語法如下:

1)語法:
    while(boolean){
      語句塊-------------反覆執行的代碼
    }
2)執行過程:
     先判斷boolean的值,若為true則執行語句塊,
     再判斷boolean的值,若為true則再執行語句塊,
     再判斷boolean的值,若為true則再執行語句塊,
     如此反覆,直到boolean的值為false時,while循環結束

7、do…while循環語句
 類似於while語句。但是do…while語句是先執行再判斷,語句塊至少執行一次。語法如下:

語法:
    do{
       語句塊-------------反覆執行的代碼
    }while(boolean);

8、for循環語句
 用來重複執行某條語句,知道條件得到滿足(應用率最高)。語法如下:

1)語法:
  //   1     2    3
  for(要素1;要素2;要素3){
     語句塊/循環體--------------反覆執行的代碼  4
  }
2)執行過程:
  1243243243243243...2
說明:break 和 continue 關鍵字的區別:
    break:跳出循環,結束整個循環,開始執行循環之後的語句。可應用在Switch和循環語句中。
    continue:跳過循環體中剩餘語句,進入下一次循環,只能應用在循環中。

(八)數組

  • 數組是一種引用類型,是相同數據類型元素的集合
   //聲明整型數組arr,包含10個元素,每個元素都是int類型,默認值為0
   int[] arr = new int[10];
  • 初始化:—-初始化數組中的數據
   int[] arr = new int[3]; 
   int[] arr = {1,4,7}; 
   int[] arr = new int[]{1,4,7}; 
   int[] arr;
   //arr = {1,4,7}; //編譯錯誤,此方式只能聲明同時初始化
   arr = new int[]{1,4,7}; //正確
  • 訪問:—-訪問的是數組中的元素
    通過(數組名.length)可以獲取數組的長度(元素個數)
   int[] arr = new int[3];
   System.out.println(arr.length); //3
  • 通過下標/索引來訪問數組中的元素,下標從0開始,最大到(數組長度-1)
   int[] arr = new int[3];
   System.out.println(arr[0]); //0,輸出第1個元素的值
   arr[0] = 100; //給第1個元素賦值為100
   arr[1] = 200; //給第2個元素賦值為200
   arr[2] = 300; //給第3個元素賦值為300
   //arr[3] = 400; //運行時會發生數組下標越界異常
   System.out.println(arr[arr.length-1]); //300,輸出最後一個元素的值
  • 數組的遍歷/迭代:從頭到尾挨個走一遍
    int[] arr = new int[10];
    for(int i=0;i<arr.length;i++){ //遍歷arr數組
      arr[i] = (int)(Math.random()*100); //給每個元素賦值為0到99之間的隨機數
      System.out.println(arr[i]); //輸出每個元素的值
      //arr[i]:代表的是arr中的每一個元素
    }
  • 數組的複製
    System.arraycopy(a,1,b,0,4);
    int[] a = {10,20,30,40,50};
    int[] b = new int[6]; //0,0,0,0,0,0
    //a:源數組
    //1:源數組的起始下標
    //b:目標數組
    //0:目標數組的起始下標
    //4:要複製的元素個數
    System.arraycopy(a,1,b,0,4); //靈活性好
    for(int i=0;i<b.length;i++){
        System.out.println(b[i]);
    }
  • 數組的擴容
    int[] b = Arrays.copyOf(a,6);
    a = Arrays.copyOf(a,a.length+1);
    //數組的擴容
    int[] a = {10,20,30,40,50};
    //數組的擴容(創建了一個更大的新的數組,並將數據複製進去了)
    a = Arrays.copyOf(a,a.length+1);
    for(int i=0;i<a.length;i++){
        System.out.println(a[i]);
    }
  • 數組的排序: Arrays.sort(arr);
    int[] arr = new int[10];
    for(int i=0;i<arr.length;i++){
        arr[i] = (int)(Math.random()*100);
        System.out.println(arr[i]);
    }
    Arrays.sort(arr); //對arr進行升序排列
    System.out.println("排序後:");
    for(int i=0;i<arr.length;i++){  
        System.out.println(arr[i]);
    }
Tags: