sun(Stanford University Network),1995年推出Java物件導向的程式設計語言
2014年由Oracle釋出Java8.0(較為主流)
Java之父:詹姆斯·高斯林
oracle甲骨文公司,oracle資料庫、MySQL資料庫都是旗下產品
Java的jvm,能夠幫助Java程式可以支援不同的平臺
Java程式編譯後生成.class位元組碼檔案,通過jvm在不同平臺上給予不同的解釋,可以滿足很多地方同時執行
編譯執行: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,類庫,開發工具包(編譯器+偵錯工具)
下載jdk8
安裝路徑儘量不要選擇C槽,安裝路徑一定不要有中文
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的完整原始碼
win+e開啟資源管理器
我的電腦-屬性-高階系統設定-高階-環境變數
使用者變數只針對當前使用者,系統變數是全部
設定變數
系統變數修改:
新建:
變數名: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;
注意:標點符號為英文半形
切換jdk版本
Java無法做到python,同時擁有兩個版本,環境只能有一套
切換時直接更改環境變數設定,也就是JAVA_HOME
設定環境變數時這麼做也是方便修改
本機java位置:
8:E:\Program\Java
14:C:\Program Files\Java\jdk-14.0.2
安裝完畢後,測試
java --version
即為設定成功
安裝完畢後,發現輸入命令會有亂碼,可能有電腦編碼問題有關,之前flask執行不起來,更改了電腦的編碼
解決方法:
設定一個系統環境變數
JAVA_TOOL_OPTIONS
-Dfile.encoding=UTF-8
退出cmd,重新進入
問題解決
dos命令
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一樣沒有錯誤就是正確,因為更改了字元所以有一行字元的提示
執行
單行註釋
// 單行註釋
多行註釋
/* 多行註釋 */
檔案註釋
/** 檔案註釋 */
參考AJCG阿里巴巴Java開發規約
識別符號
類名,方法名,變數名
AJCG規範
識別符號可以使用的字元範圍,英文字母(A-Z,a-Z)數位(0-9)唯一可以使用的標點符號_
識別符號要求必須英文字母開頭
識別符號嚴格區分大小寫
識別符號沒有嚴格的長度限制,但是會根據實際需求來限制識別符號的長度
識別符號需要做到見名知意,動賓結構,如getStudentAge
使用駝峰命名法和下劃線命名法
小駝峰【適用於變數名、方法名】:多個單詞構成識別符號時,第一個單詞首字母小寫,之後的單詞首字母大寫
大駝峰【適用於類名、介面名】:識別符號所有的單詞首字母大寫
下劃線:所有字母都是大寫的情況下,為了區分單詞的間隔,使用下劃線命名法,如JAVA_HOME
已經被Java使用的關鍵字和保留字不得用於自定義識別符號使用(也就是在編譯器中變色的的不能用)
Java是強型別語言,變數的型別必須與資料的型別一致
注意:變數未定義不能使用,未賦值不能使用(只能先賦值)
三種宣告方式
先宣告,在賦值
資料結構 變數名;
變數名 = 值;
宣告並賦值(推薦)
資料結構 變數名 = 值;
多個同型別變數的宣告與賦值(不推薦)
資料型別 變數1,變數2 = 值1,變數3,變數4 = 值2;
Java有2種型別,8種基本資料型別
整型
小數、浮點數
布林型別
字元型別
/*浮點型變數*/
/*float floatNumber = 3.14; 會報錯*/
double doubleNumber = 0.618;
/*浮點型資料展示*/
System.out.println(floatNumber);
System.out.println(doubleNumber);
計算機為了保證資料的精度,同時為了資料後期的延展性,預設為double型別,double佔用的記憶體空間是8位元組,而float是4個位元組
解決方法:在float小數後面加上大寫F
float floatNumber = 3.14F;
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在沒有賦值的情況下,不能使用
*/
}
}
字元常數:單引號包含的單個字元元素 如:‘a’
使用要求:
有且只允許使用字元本身,如’a’,‘A’,不建議使用’97’,‘65’
優勢:
\ 反斜槓
將帶有特定含義字元轉換為無意義字元,或者將無意義字元,轉換成帶有一定含義字元
只能跳脫後邊的一個字元
\'
\"
\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");
}
}
羊肉和羊肉串的關係
字串特定標記
" "英文雙引號包含的所有內容都是字串本身,並且是一個常數,不可以修改
String
自動型別轉換:
如:
short s = 123;
int i = s;
強制型別轉換:
如:
short s = 123;
byte b = (byte) s;
不推薦使用:會導致資料精度的丟失
強制型別轉換在物件導向開發中,可以用來操作物件
+ - * / % ()
+= -= *= /= %=
> 大於
< 小於
>= 大於等於
<= 小於等於
== 等於
!= 不等於
結果是: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);
}
}
++在變數之後(num++),首先執行變數所在行語句,再執行自增加1操作
++在變數之前,首先執行變數自增加1操作,再執行變數所在語句
注意:
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);
}
}
邏輯與斷路:當第一個條件為false,整個表示式結果為false,不在判斷之後的條件
邏輯或短路:當第一個條件為true時,整個表示式結果為true,不在判斷之後的條件
導包
import java.util.Scanner
獲取Scanner的變數,掃描器的一個變數
Scanner sc = new Scanner(System.in)
使用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);
}
}
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);
}
}
多個字元也只能接受一個字元
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("不及格");
}
}
}
switch (變數|表示式) {
case 值1:
邏輯程式碼1;
break;
case 值2:
邏輯程式碼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大括號(作用域)內使用
注意:
while迴圈
while (/*迴圈條件*/) {
// 迴圈體
}
do-while
do {
執行迴圈語句
} while (條件表示式);
for
for (初始條件; 迴圈檢測條件; 迴圈後更新計數器) {
// 執行語句
}
如:
for (int i=1; i<=100; i++) {
sum = sum + i;
}
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");
}
}
單個引數
需求:展示一個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);
}
}
呼叫時注意事項:
多個引數
形式參數列:兩個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;
}
}
注意:方法中需要返回值,必須有一個明確的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);
}
}
方法的三要素
返回值
方法名
參數列
返回值:
方法名:
形式參數列:
分解質因數
例如:91=7*13
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判斷是否還能被整除一次
}
}
}
}
優化版
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,可以減少迴圈次數,時間複雜度
檔案註釋規範
/**
* 對於當前的整體解釋,可以把方法的分析過程,利害關係全寫上
*
* @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)]
檔案註釋規範
/**
* 對於當前的整體解釋,可以把方法的分析過程,利害關係全寫上
*
* @param argumentName引數名字,對於當前引數的功能解釋,提一些要求,有多少個引數就需要完成多少@param
*
* @return 返回值解釋,資料型別,返回值的含義,狀態,要求
*/