java基礎學習筆記上

2021-05-06 07:00:04

Java概述與環境搭建

Java歷史

sun(Stanford University Network),1995年推出Java物件導向的程式設計語言

2014年由Oracle釋出Java8.0(較為主流)

Java之父:詹姆斯·高斯林

oracle甲骨文公司,oracle資料庫、MySQL資料庫都是旗下產品

Java語言特點

  • 物件導向(貼近人類思維模式)
  • 簡單(相對於c、c++、c#,不易造成記憶體溢位,減少程式碼量,程式碼可讀性強)
  • 跨平臺(windows、linux(讀:裡訥克斯/'linэks/)、macos、unix)

Java的jvm,能夠幫助Java程式可以支援不同的平臺

Java執行機制

image-20210501120151900

Java程式編譯後生成.class位元組碼檔案,通過jvm在不同平臺上給予不同的解釋,可以滿足很多地方同時執行

image-20210501120355078

編譯型語言和解釋型語言的執行流程

  • 編譯執行:c、c++

    編譯的結果直接交給cpu執行,效率極高,不能跨平臺

  • 解釋執行:Java、c#、PHP、python

    編譯結果需要通過直譯器解釋之後再交給cpu執行,效率較低

    Java通過JIT技術達到類和c++相近的效率

JVM

Java Virtual Machine

使用軟體在不同的作業系統中,模擬相同的環境

JRE

Java Runtime Environment

包含jvm和直譯器,完整的Java執行環境

JDK

Java Development Kit

包含jre,類庫,開發工具包(編譯器+偵錯工具)

安裝jdk

下載jdk8

image-20210501134527389

安裝路徑儘量不要選擇C槽,安裝路徑一定不要有中文

image-20210501134734108

jdk檔案

  • bin目錄

    binary二進位制目錄

    都是二進位制可以執行檔案,包含.exe檔案

    java.exe,javac.exe,javap.exe,javadoc.exe

  • db

    jdk自帶小型資料庫(用處不大)

  • include

    系統介面目錄

  • jre

    java執行環境,java runtime environment

  • lib

    資源庫目錄,存在一些.jar檔案,jar包

  • src.zip

    java的完整原始碼

image-20210501135351314

環境變數設定

  1. win+e開啟資源管理器

    我的電腦-屬性-高階系統設定-高階-環境變數

    image-20210501140516434

    使用者變數只針對當前使用者,系統變數是全部

  2. 設定變數

    系統變數修改:

    新建:
    變數名:JAVA_HOME
    變數值:D:\Program Files\Java\jdk1.8.0_211

    新建:
    變數名:CLASS_PATH
    變數值:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar

    修改:
    變數名:path
    新增內容:
    ;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

    注意:標點符號為英文半形

  3. 切換jdk版本

    Java無法做到python,同時擁有兩個版本,環境只能有一套

    切換時直接更改環境變數設定,也就是JAVA_HOME

    設定環境變數時這麼做也是方便修改

    本機java位置:

    8:E:\Program\Java

    14:C:\Program Files\Java\jdk-14.0.2

  4. 安裝完畢後,測試

    java --version

    image-20210501142749496

    即為設定成功

亂碼問題解決

安裝完畢後,發現輸入命令會有亂碼,可能有電腦編碼問題有關,之前flask執行不起來,更改了電腦的編碼

image-20210501142819894

解決方法:

設定一個系統環境變數

image-20210501143008708

JAVA_TOOL_OPTIONS
-Dfile.encoding=UTF-8

退出cmd,重新進入

image-20210501143100053

問題解決

dos命令

  • rd刪除目錄
  • del直接刪除檔案
  • echo輸出
  • cls清理螢幕
  • exit退出

基本規範

Java一切皆是物件

簡單Java程式碼

FirstJava.java

class FirstJava {
    public static void main(String[] args) {
        System.out.println("welcome to java world!!!");
    }
}

儲存檔名與類名相同

注意大小寫及拼寫問題

編譯執行

javac 原始檔名.java

編譯之後會生成一個FirstJava.class檔案

.class位元組碼檔案,二進位制檔案,需要藉助jvm執行解釋

預設編譯成功不會有輸出,和linux一樣沒有錯誤就是正確,因為更改了字元所以有一行字元的提示

image-20210501155143135

執行

image-20210501175341469

註釋

單行註釋

// 單行註釋

多行註釋

/* 多行註釋 */

檔案註釋

/** 檔案註釋 */

語法規則

  • 可以有字母,數位,_,$組成,不能以數位開頭
  • 不能與關鍵字,保留字重名

參考AJCG阿里巴巴Java開發規約

識別符號

類名,方法名,變數名

AJCG規範

  • 識別符號可以使用的字元範圍,英文字母(A-Z,a-Z)數位(0-9)唯一可以使用的標點符號_

  • 識別符號要求必須英文字母開頭

  • 識別符號嚴格區分大小寫

  • 識別符號沒有嚴格的長度限制,但是會根據實際需求來限制識別符號的長度

  • 識別符號需要做到見名知意,動賓結構,如getStudentAge

  • 使用駝峰命名法和下劃線命名法

    小駝峰【適用於變數名、方法名】:多個單詞構成識別符號時,第一個單詞首字母小寫,之後的單詞首字母大寫

    大駝峰【適用於類名、介面名】:識別符號所有的單詞首字母大寫

    下劃線:所有字母都是大寫的情況下,為了區分單詞的間隔,使用下劃線命名法,如JAVA_HOME

  • 已經被Java使用的關鍵字和保留字不得用於自定義識別符號使用(也就是在編譯器中變色的的不能用)

變數型別

Java是強型別語言,變數的型別必須與資料的型別一致

注意:變數未定義不能使用,未賦值不能使用(只能先賦值)

宣告方式

三種宣告方式

  1. 先宣告,在賦值

    資料結構 變數名;

    變數名 = 值;

  2. 宣告並賦值(推薦)

    資料結構 變數名 = 值;

  3. 多個同型別變數的宣告與賦值(不推薦)

    資料型別 變數1,變數2 = 值1,變數3,變數4 = 值2;

基本資料型別

Java有2種型別,8種基本資料型別

image-20210501164645968

整型

image-20210501165334720

小數、浮點數

image-20210501165718131

布林型別

image-20210501165800053

字元型別

image-20210501170029767

問題:資料型別不相容
  • float
        /*浮點型變數*/
        /*float floatNumber = 3.14; 會報錯*/
        double doubleNumber = 0.618;

        /*浮點型資料展示*/
        System.out.println(floatNumber);
        System.out.println(doubleNumber);

計算機為了保證資料的精度,同時為了資料後期的延展性,預設為double型別,double佔用的記憶體空間是8位元組,而float是4個位元組

image-20210501180604693

解決方法:在float小數後面加上大寫F

float floatNumber = 3.14F; 

image-20210501181048044

  • long

long型別的資料需要在常數後加上一個大寫的L,明確告知計算機這裡使用的是一個long型別的資料

賦值案例

class VariableTest {
    public static void main(String[] args){
        /*整形資料*/
        byte byteNumber = 10;
        short shortNumber = 20;
        int intNumber = 20;
        long longNumber = 40L;
        
        /*整形資料展示*/
        System.out.println(byteNumber);
        System.out.println(shortNumber);
        System.out.println(intNumber);
        System.out.println(longNumber);

        /*浮點型變數*/
        /*float floatNumber = 3.14; 會報錯*/
        float floatNumber = 3.14F; 
        double doubleNumber = 0.618;

        /*浮點型資料展示*/
        System.out.println(floatNumber);
        System.out.println(doubleNumber);

        /*
        字元型變數
        字元常數:單引號包含的單個字元元素'a'
        */
        char ch1 = 'A';
        char ch2 = '中';

        System.out.println(ch1);
        System.out.println(ch2);

        /*布林型別*/
        boolean ret1 = true;
        boolean ret2 = false;

        System.out.println(ret1);
        System.out.println(ret2);
        
        /*
        int num;
        System.out.println(num);
        會報錯,java在沒有賦值的情況下,不能使用
        */
    }
}

image-20210501182113326

字元型常數

​ 字元常數:單引號包含的單個字元元素 如:‘a’

使用要求:

​ 有且只允許使用字元本身,如’a’,‘A’,不建議使用’97’,‘65’

優勢:

  1. 閱讀型好
  2. 保證資料型別一致化
  3. 減少了沒有必要的歧義

跳脫字元

\ 反斜槓

將帶有特定含義字元轉換為無意義字元,或者將無意義字元,轉換成帶有一定含義字元

只能跳脫後邊的一個字元

\'
\"
\n	換行
\t	tab
\\	一個反斜槓
\\\\	兩個反斜槓
class Demo3 {
    public static void main(String[] args){
        char ch = '\'';
        
        System.out.println(ch);
        System.out.println("test\ttest");
        System.out.println("test\ntest");
        System.out.println("test\ntest");
        System.out.println("test\\test");
    }
}

image-20210501195006842

字串

羊肉和羊肉串的關係

字串特定標記

​ " "英文雙引號包含的所有內容都是字串本身,並且是一個常數,不可以修改

String

型別轉換

自動型別轉換:

  • 小變大
  • 兩種型別相互相容
  • 目標型別大於源型別

如:

short s = 123;
int i = s;

強制型別轉換:

  • 大變小
  • 兩種型別相互相容
  • 目標型別小於源型別

如:

short s = 123;
byte b = (byte) s;

不推薦使用:會導致資料精度的丟失

強制型別轉換在物件導向開發中,可以用來操作物件

運運算元

算數運運算元

+  -  *  /  %  ()
+=  -=  *=  /=  %=
  • 從左到右計算
  • 先乘除後加減
  • 右括號先處理括號裡面的內容
  • 除數不能為0

關係運算子

>	大於
<	小於
>=	大於等於
<=	小於等於
==	等於
!=	不等於

結果是:true,false

邏輯運運算元

&&	與,同真為真,有假即假
||	或,有真即真,同假為假
!	非,取反

自增自減運運算元

++	自增
--	自減
class Demo4 {
    public static void main(String[] args) {
        int num = 10;
        System.out.println("num++ : " + num++);
        System.out.println("num : " + num);
        System.out.println("++num : " + ++num);
        System.out.println("num : " + num);
    }
}

image-20210503134522060

++在變數之後(num++),首先執行變數所在行語句,再執行自增加1操作

++在變數之前,首先執行變數自增加1操作,再執行變數所在語句

注意:

  1. 自增自減運運算元有且只能操作變數
  2. 自增自減運運算元獨立存在,就是對變數操作,減少歧義

短路(斷路)原則

class Demo4 {
    public static void main(String[] args) {
        int num = 10;
        boolean ret = 10 > 15 && num++ >= 10;
        System.out.println(ret);
        System.out.println(num);

        int num1 = 10;
        boolean ret1 = 10 > 5 || ++num1 > 5;
        System.out.println(ret1);
        System.out.println(num1);
    }
}

image-20210503135551244

邏輯與斷路:當第一個條件為false,整個表示式結果為false,不在判斷之後的條件

邏輯或短路:當第一個條件為true時,整個表示式結果為true,不在判斷之後的條件

輸入

控制檯獲取輸入

  1. 導包

    import java.util.Scanner

  2. 獲取Scanner的變數,掃描器的一個變數

    Scanner sc = new Scanner(System.in)

  3. 使用Scanner其中的方法

    獲取int型別資料 sc.next.Int()

    獲取double型別資料 sc.nextDouble()

    獲取String型別字串資料 sc.next();sc.nextLine()

    獲取一個char型別字元資料 sc.next().charAt(0),sc.nextLine().charAt(0)

import java.util.Scanner;
class Demo4 {
    public static void main(String[] args) {
        int num = 0;
        Scanner sc = new Scanner(System.in);
        System.out.println("please input a integer");
        num = sc.nextInt();
        System.out.println("num:" + num);
    }
}

image-20210503161305243

import java.util.Scanner;
class Demo4 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        char ch = '\0';
        System.out.println("please input a char");
        ch = sc.nextLine().charAt(0);
        System.out.print("ch:" + ch);
    }
}

image-20210503161646112

多個字元也只能接受一個字元

選擇結構和分支結構

if分支

if ( /*判斷條件*/ ) {
    // 執行體
}


if ( /*判斷條件*/ ) {
    // 執行體
} else {
    // 執行體
}


if ( /*判斷條件*/ ) {
    // 執行體
} else if ( /*判斷條件*/ ) {
    // 執行體
} else {
    // 執行體
}

分數範圍判斷案例

import java.util.Scanner;
class Demo4 {
    public static void main (String[] args) {
        float score = 0.0F;
        System.out.println("請輸入分數值:");
        Scanner sc = new Scanner(System.in);
        score = sc.nextFloat();

        if (score < 0 || score > 100) {
            System.out.println("範圍不正確");
            System.exit(0);
        } else if (score >= 90) {
            System.out.println("優秀");
        } else if (score >= 80) {
            System.out.println("良好");
        } else if (score >= 70) {
            System.out.println("中等");
        } else if (score >= 60) {
            System.out.println("及格");
        } else {
            System.out.println("不及格");
        }
    }
}

image-20210503164937626

switch

switch (變數|表示式) {
    case1:
        邏輯程式碼1;
        break;
    case2:
        邏輯程式碼2;
        break;
    case 值n:
        邏輯程式碼n;
        break;
    default:
        為滿足時的邏輯程式碼;
        break;
}

switch語句可判斷的變數型別有byte,short,int,char,String(jdk7+)

注意:break必須要加,標籤值(case後邊的值)不能重複

條件運運算元/三目運運算元

條件判斷?true:false

區域性變數

存在與程式碼塊中的變數

class Demo5 {
    public static void main (String[] args) {
        int num = 10;
        if (num > 5) {
            int num2 = 10;
        }
        System.out.println(num);
        System.out.println(num2);
    }
}

編譯報錯,num2不會存在

num2是一個區域性變數,自能在if大括號(作用域)內使用

注意:

  1. 區域性變數有且只能在當前所處的程式碼塊中使用,超出當前程式碼塊範圍無效
  2. 在作用域範圍以內,任何的地方可以直接使用對應的變數
  3. 在一個變數的作用域範圍以內,不能重定義同名變數,會報錯
  4. 區域性變數未賦值不能使用

迴圈結構

while迴圈

while (/*迴圈條件*/) {
    // 迴圈體
}

do-while

do {
    執行迴圈語句
} while (條件表示式);

for

for (初始條件; 迴圈檢測條件; 迴圈後更新計數器) {
    // 執行語句
}:
for (int i=1; i<=100; i++) {
    sum = sum + i;
}

break/continue

break會跳出當前迴圈,也就是整個迴圈都不會執行了

continue則是提前結束本次迴圈,直接繼續執行下次迴圈

函數/方法

public static void main(String[] args) {
    // 方法體
}
// public static後續內容補充
// void表示沒有返回值
// main表示方法名
// (String[] args)形參列表

public static ReturnType MethodName (Arguments) {
    Method Body
}

無引數無返回值方法

class Demo5 {
    public static void main (String[] args) {
        bbq();
        bbq();
        bbq();
    }

    public static void bbq () {
        System.out.println("BBQ Method");
    }
}

image-20210503185740102

有引數無返回值方法

單個引數

需求:展示一個int型別資料

class Demo6 {
    public static void main(String[] args) {
        // 帶有引數的方法一定要提供對應的資料型別,實際引數
        printIntNum(10);
    }

    /**
     * 檔案註釋格式
     * 列印一個int型別資料
     * 
     * @param num 要求使用者傳入一個int型別資料
     */
    public static void printIntNum(int num) {
        System.out.println("num:" + num);
    }
}

image-20210504154818279

呼叫時注意事項:

  1. 帶有引數的方法一定要提供對應的資料型別,實際引數
  2. 呼叫帶有引數的方法,給與實際引數是,資料型別應該一致

多個引數

形式參數列:兩個int型別資料

class Demo6 {
    public static void main(String[] args) {
        // 帶有引數的方法一定要提供對應的資料型別,實際引數
        printIntNum(10);
        printSumOfTwoNum(10, 5);
    }

    /**
     * 檔案註釋格式
     * 列印一個int型別資料
     * 
     * @param num 要求使用者傳入一個int型別資料
     */
    public static void printIntNum(int num) {
        System.out.println("num:" + num);
    }

    /**
     * 列印兩個引數之和
     * @param num1
     * @param num2
     */
    public static void printSumOfTwoNum(int num1,int num2) {
        System.out.println("sum:" + (num1+num2));
    }
}
  • 形參與實參個數與資料型別必須一致

無引數有返回值方法

class Demo6 {
    public static void main(String[] args) {
        int num = 0;
        System.out.println("before :" + num);
        num = giveMeFive();
        System.out.println("after :" + num);
    }

    public static int giveMeFive() {
        return 5;
    }
}

image-20210504150310881

注意:方法中需要返回值,必須有一個明確的return

如:這樣會報錯

    public static int giveMeFive() {
        if(true) {
            return 5;
        }
    }

正確寫法:

    public static int giveMeFive() {
        if(true) {
            return 5;
        } else {
            return 10;
        }
    }

方法中返回值型別是void,可以使用return作為方法的結束,return之後不能有任何資料

有引數有返回值方法

例:計算兩個int型別資料之和,返回結果

class Demo7 {
    public static void main(String[] args) {
        int sum = 0;
        sum = getSumOfTwoNum(10, 8);
        printSumNum(sum);
    }

    /**
     * 計算兩個int型別資料之和,返回結果
     * @param num1
     * @param num2
     * @return
     */
    public static int getSumOfTwoNum(int num1,int num2) {
        int sum = 0;
        sum = num1 + num2;
        return sum;
    }
    
    /**
     * 輸出列印兩數之和sum值
     * @param sum
     */
    public static void printSumNum(int sum) {
        System.out.println("sum:" + sum);
    }
}

總結

方法的三要素

返回值
方法名
參數列

返回值:

  • 選擇合適的返回值型別
  • 方法中需要返回值,必須有明確的return
  • 一個方法有且只能由一個返回值型別

方法名:

  • 見名知意,動賓結構,小駝峰命名法
  • 英文命名

形式參數列:

  • 呼叫方法時,形式參數列和實際參數列引數個數與型別是一致的,順序也是一致的
  • 考慮好對應的資料型別

程式設計題

分解質因數

例如:91=7*13

image-20210504183204658

class Demo8 {
    public static void main(String[] args) {
        int num = 91;
        for(int i = 2; i <= num ; i++) {
            System.out.println('*');
            if (num % i == 0) {
                System.out.println("num:" + i);
                num /= i;
                i -= 1;
                // 如果能被整除,i-1判斷是否還能被整除一次
            }
        }
    }
}

image-20210504193951862

優化版

class Demo8 {
    public static void main(String[] args) {
        int num = 91;
        for(int i = 2; i <= Math.sqrt(num) ; i++) {
            System.out.println('*');
            if (num % i == 0) {
                System.out.println("num:" + i);
                num /= i;
                i -= 1;
            }
        }
        System.out.println("num:" + num);
    }
}

因為一個數的最大的質數,一定小於這個數的平方根,如,91的最大的質數就是7,另一個質因數就是91/7=13,可以減少迴圈次數,時間複雜度

image-20210504193850220

方法封裝

  • 功能單一化
  • 考慮後期的複用性,可移植性,模組化
  • 減少程式碼中return的使用,提高程式碼閱讀性
  • 找出特定情況優化程式碼,提高效率

方法檔案註釋規範

檔案註釋規範

/**
 * 對於當前的整體解釋,可以把方法的分析過程,利害關係全寫上
 * 
 * @param argumentName引數名字,對於當前引數的功能解釋,提一些要求,有多少個引數就需要完成多少@param
 * 
 * @return 返回值解釋,資料型別,返回值的含義,狀態,要求
 */

num % i == 0) {
System.out.println(「num:」 + i);
num /= i;
i -= 1;
// 如果能被整除,i-1判斷是否還能被整除一次
}
}
}
}


[外連圖片轉存中...(img-93XCDAuB-1620135462494)]

優化版

```java
class Demo8 {
    public static void main(String[] args) {
        int num = 91;
        for(int i = 2; i <= Math.sqrt(num) ; i++) {
            System.out.println('*');
            if (num % i == 0) {
                System.out.println("num:" + i);
                num /= i;
                i -= 1;
            }
        }
        System.out.println("num:" + num);
    }
}

因為一個數的最大的質數,一定小於這個數的平方根,如,91的最大的質數就是7,另一個質因數就是91/7=13,可以減少迴圈次數,時間複雜度

[外連圖片轉存中…(img-j8kF88mD-1620135462495)]

方法封裝

  • 功能單一化
  • 考慮後期的複用性,可移植性,模組化
  • 減少程式碼中return的使用,提高程式碼閱讀性
  • 找出特定情況優化程式碼,提高效率

方法檔案註釋規範

檔案註釋規範

/**
 * 對於當前的整體解釋,可以把方法的分析過程,利害關係全寫上
 * 
 * @param argumentName引數名字,對於當前引數的功能解釋,提一些要求,有多少個引數就需要完成多少@param
 * 
 * @return 返回值解釋,資料型別,返回值的含義,狀態,要求
 */