關於程序語言
- 是什么
程序語言是一門特殊的語言,不像英語,漢語是用於人與人之間交流的,程序語言是人類與計算機交互的媒介。
- 為什么
類比一下,如果你想和動物交流,就得知道動物的各種叫聲代表着什么。同理,如果要和計算機交流,就必須得知道計算機的交流方式。但是由於計算機所能理解的01過於復雜,先驅們發明各種各樣的程序語言,使得編程的門檻降低。計算機是不能理解程序語言的,但通過編譯器解釋器的轉換,最終程序代碼以01的形式傳遞給計算機。隨着計算機的發展人們通過設計規范來使得控制計算機變得更加容易,這些規范就是程序語言。
程序語言被編譯執行后本質上傳輸給計算機的還是01,但相對於直接向計算機傳輸01指令,使用程序語言無疑是更好的選擇。
1,JDK環境配置
1.1,win10安裝JDK8
【安裝步驟】
- jdk8下載地址:
https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
【下載的安裝包主要包含JDK,JRE,JavaFx包】(JavaFX主要用於桌面端開發)
- 設置jdk安裝路徑
- 設置jre安裝路徑
-
設置環境變量
- 找到jdk安裝的bin目錄,復制安裝路徑
-
右鍵電腦選擇屬性
添加剛剛復制的路徑到path里:
點擊三個確定。
-
查看是否安裝成功
java -version
java
javac
1.2,運行HelloWorld
【命令行運行Java程序】
-
新建文件,命名為HelloWorld.java
用記事本打開,輸入
public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } }
-
打開命令行,定位到HelloWorld.java所在位置
javac HelloWorld.java //編譯
java HelloWorld //運行
【使用IDEA 運行Java程序】
-
安裝IDEA
-
配置JDK
-
創建Java程序
-
輸出HelloWorld
package com.company;
public class Main {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
-
運行程序
1.3,CentOS 7.6 安裝JRE
rpm -qa | grep java //查看是否安裝過jdk
yum search jdk //查詢可安裝包
yum install java-latest-openjdk.x86_64 //選擇可安裝包其中版本安裝
yum install java-latest-openjdk-devel.x86_64 //同時安裝開發環境(javac)
java -version //查看是否安裝成功
java,javac 測試
關於服務器上安裝JDK還是JRE的問題?
在JSP已經被逐漸淘汰的年代,不需要JDK對JSP文件進行編譯,如果部署的項目都是按照編譯完成后部署,可以安裝JRE,畢竟JRE省空間。
2,數據類型和變量
2.1,定義
變量和數據類型不可分割,結合在一起更好定義:
變量是內存中的一個存儲區域。而數據類型的定義決定了這塊存儲區域的大小。【變量與數據類型的關系】
比如 int x ;其中x變量在內存中占有一定空間,而int決定這個空間是4個字節。
【關於變量的描述】
-
變量是內存中的一個存儲區域。【程序運行的時候,變量是放在內存條里的】
-
存儲區域的數據可以在同一類型范圍里不斷變化【所以叫變量,就是能變嘛】
-
變量包括:【int x = 3】== 變量類型int 變量名x = 變量的值3
-
變量必須先聲明后使用
int x = 10; (Yes)
x = 10; (No)
簡單來說,變量必須得先指定具體的數據類型才能使用。
在談各種各樣的數據類型之前,先來看下面一個問題:
2.2,定義變量存儲區域大小的目的
換句話說,為什么需要分開不同的數據類型,全用一個變量表示不就完了嗎?
以結果為導向來分析:
Java的整數類型分為4種:byte,short,int,long。
四種的區別在於占用的存儲空間不一樣。
byte占用1個字節,short占用2個字節,int占用4個字節,而long占用8個字節。
什么是字節?
字節是一種存儲單位的度量。1個字節等於8位。
什么是位呢?
位可以理解為計算機的最小單位:0或者是1。也就是是說1個字節是8個0和1的排列組合:
比如說:00000000,00000001,00000011,......11111111。
那么在這種情況下1個字節可以表示多大的數呢?
00000000轉換為十進制依然是0,11111111轉換為十進制是255。
轉換工具:https://tool.lu/hexconvert/
也就是說,一個字節最大可以表示255而最小1可以表示0。
這是無符號位的情況,如果8位表示正數和負數,那么8位可以表示的范圍是多大呢?
通常情況下,用第一位來表示正負【0為正,1為負】,這樣算下來8位可以表示的范圍是-127到+127。
歷史長河中,補碼登場
上述引入符號位的8位二進制數可以理解為原碼。對於正數來說,原碼就是補碼,而對於負數來說,保留符號位,其他原碼按位取反加1所得即為補碼。
為什么需要補碼?
補碼的出現使得加減法只有加法,簡化了計算結構,提高運算速度。
那么8位的情況下,用補碼來衡量,可以表達的范圍是-128--127。
為什么是-128???(按照補碼計算)
10000001到11111111表示的范圍是1到127,01111110到00000001表示的范圍是-1到-127。
而00000000屬於負數,按位取反加1的結果是10000000表示的數值是-128,但是00000000是負數。
所以8位二進制數在計算機里存儲的范圍是-128--127。
回到剛剛字節的問題,1字節等於8位而八位可以表示-128--127。這是byte類型的表示范圍。
那如果我想用計算機計算1000加上1000,byte明顯是不可用的。因為byte表示不了1000這個數值。
而short類型的存儲空間為2個字節,也就是16位。對於short數據類型來說,能表示多大的數呢?
根據8位的表示范圍推算:- 2的15次方到2的15次方-1=={-32768--32767}
以此類推,int為4個字節,long為8個字節,能表示的數更大。
Java通過定義變量的類型來規定變量的內存空間大小,通過階梯式的定義,既有滿足小數值運行的byte類型,也有支持大數值運算的long類型。這樣不僅滿足運算的最大支持(long),同時也能節省系統內存資源(byte)。
【總結】
數據類型的區分是一種系統資源分配優化的方案。
2.3,數據類型分類
數據類型分為基本數據類型和引用數據類型。
基本數據類型:4 類 8 種基本數據類型。4 整數型,2 浮點型,1 布爾型,1 字符型
引用數據類型:字符串
【基本數據類型】
- 整數型
byte | 1字節 |
---|---|
short | 2字節 |
int | 4字節 |
long | 8字節 |
- 浮點型
float | 4字節 |
---|---|
double | 8字節 |
- 字符型
char | 2字節 |
- 布爾類型Boolean
boolean | 4字節 |
-
boolean類型數據只允許取值true和false,無null。
-
不可以使用0或非 0 的整數替代false和true。(C語言可以)
關於Boolean占用字節問題:
- 1/8個字節:理論上來說,Boolean表示true或false,只需要一個字節
- 1個字節:計算機最小執行單位
- 4個字節:
- Java語言表達式所操作的boolean值,在編譯之后都使用Java虛擬機中的int數據類型來代替
- boolean數組將會被編碼成Java虛擬機的byte數組,占用1個字節
為什么使用int代替boolean而不是byte?
對於當下32位的處理器(CPU)來說,一次處理數據是32位,32 位 CPU 使用 4 個字節是最為節省的,哪怕你是 1 個 bit 也是占用 4 個字節。因為 CPU 尋址系統只能 32 位 32 位地尋址,具有高效存取的特點。
【**基本數據類型的相關特性**】
自動類型轉換:由表示范圍小的自動轉換為表示范圍大的。
為什么long 8字節可以自動轉換為float 4字節的?
long存儲按照常規存儲,float采用指數方式存儲。
指數爆炸.....
順便看看float和double的精度:7位和16位。
強制類型轉換:
反向自動轉換。
short to byte:
字符串轉為基本類型:(通過包裝類轉換)
【關於包裝類】
包裝類是Java設計之初提出的,主要解決基本數據類型無法面對對象編程的問題。
基本數據類型是存放在棧中的,只有數據。而引用類型的值存放在棧中,而引用對象存放在堆中。
裝箱:基本數據類型--->包裝類
拆箱:包裝類--->基本數據類型
//裝箱
Integer t = new Integer(500);
//float to Float
Float f = new Float(“4.56”);
//拆箱
Integer x = 3;
int i = x.intValue();
//int to String
String str = String.valueOf(1);
//String to int
int x = Integer.parseInt(str1) ;
//包裝類 to String
Integer x = 8;
String str = x.toString();
or
String str = Integer.toString(3);
【引用數據類型】
- 字符串String(引用數據類型)
存放多個字符;String word = “hello,world”;
3,運算符
3.1,算術運算符
假設整數變量A的值為20,變量B的值50:
操作符 | 描述 | 例子 |
---|---|---|
+ | 加法 - 相加運算符兩側的值 | |
- | 減法 - 左操作數減去右操作數 | |
* | 乘法 - 相乘操作符兩側的值 | |
/ | 除法 - 左操作數除以右操作數 | |
% | 取余 - 左操作數除以右操作數的余數 | B%A等於10 |
++ | 自增: 操作數的值增加1 | B++ 或 ++B 等於 51 |
-- | 自減: 操作數的值減少1 | B-- 或 --B 等於 49 |
B++和++B的區別。
如果是單獨一條語句的話兩者沒有區別,但如果放在表達式中會有所不同。
int a = 10;
int b = 10;
int c = a++; ----3
int d = ++b; ----4
第三步等同於:
c=a=10;
a=11;
第四步等同於:
b=11;
d=b=11;
++的位置決定了是先輸出值還是先進行自增或者自減運算。
3.2,比較運算符
假設整數變量A的值為20,變量B的值50:
運算符 | 描述 | 例子 |
---|---|---|
== | 檢查如果兩個操作數的值是否相等,如果相等則條件為真。 | (A == B)為假。 |
!= | 檢查如果兩個操作數的值是否相等,如果值不相等則條件為真。 | (A != B) 為真。 |
> | 檢查左操作數的值是否大於右操作數的值,如果是那么條件為真。 | (A> B)為假。 |
< | 檢查左操作數的值是否小於右操作數的值,如果是那么條件為真。 | (A <B)為真。 |
>= | 檢查左操作數的值是否大於或等於右操作數的值,如果是那么條件為真。 | (A> = B)為假。 |
<= | 檢查左操作數的值是否小於或等於右操作數的值,如果是那么條件為真。 | (A <= B)為真。 |
3.3,位運算符(針對二進制)
假設a = 60,b = 13;它們的二進制格式表示將如下:
A = 0011 1100
B = 0000 1101
-----------------
A&B = 0000 1100
A | B = 0011 1101
A ^ B = 0011 0001
~A= 1100 0011
操作符 | 描述 | 例子 |
---|---|---|
& | 與,全為1則為1,否則為0 | |
| | 或,有一個為1則為1,否則為0 | (A | B)得到61,即 0011 1101 |
^ | 異或,相同為0,不同為1 | (A ^ B)得到49,即 0011 0001 |
〜 | 按位取反,翻轉操作數的每一位,即0變成1,1變成0。 | (〜A)得到-61,即1100 0011 |
<< | 按位左移運算符。左邊減零,右邊加零 | A << 2得到240,即 1111 0000 |
>> | 按位右移運算符。右邊減0,左邊加0 | A >> 2得到15即 1111 |
>>> | 按位右移補零操作符。右邊減0,左邊加0 | A>>>2得到15即0000 1111 |
3.4,邏輯運算符
假設布爾變量A為真,變量B為假:
操作符 | 描述 | 例子 |
---|---|---|
&& | 稱為邏輯與運算符。當且僅當兩個操作數都為真,條件才為真。 | (A && B)為假。 |
| | | 稱為邏輯或操作符。如果任何兩個操作數任何一個為真,條件為真。 | (A | | B)為真。 |
! | 稱為邏輯非運算符。用來反轉操作數的邏輯狀態。如果條件為true,則邏輯非運算符將得到false。 | !(A && B)為真。 |
3.5,賦值運算符
操作符 | 描述 | 例子 |
---|---|---|
= | 簡單的賦值運算符,將右操作數的值賦給左側操作數 | C = A + B將把A + B得到的值賦給C |
+ = | 加和賦值操作符,它把左操作數和右操作數相加賦值給左操作數 | C + = A等價於C = C + A |
- = | 減和賦值操作符,它把左操作數和右操作數相減賦值給左操作數 | C - = A等價於C = C - A |
* = | 乘和賦值操作符,它把左操作數和右操作數相乘賦值給左操作數 | C * = A等價於C = C * A |
/ = | 除和賦值操作符,它把左操作數和右操作數相除賦值給左操作數 | C / = A,C 與 A 同類型時等價於 C = C / A |
(%)= | 取模和賦值操作符,它把左操作數和右操作數取模后賦值給左操作數 | C%= A等價於C = C%A |
<< = | 左移位賦值運算符 | C << = 2等價於C = C << 2 |
>> = | 右移位賦值運算符 | C >> = 2等價於C = C >> 2 |
&= | 按位與賦值運算符 | C&= 2等價於C = C&2 |
^ = | 按位異或賦值操作符 | C ^ = 2等價於C = C ^ 2 |
| = | 按位或賦值操作符 | C | = 2等價於C = C | 2 |
3.6,三元運算符
條件表達式?表達式1:表達式2
條件表達式為true,執行表達式1;為false,執行表達式2
3.7,運算符的優先級
類別 | 操作符 | 關聯性 | |
---|---|---|---|
后綴 | () [] . (點操作符) | 左到右 | 高 |
一元 | + + - !〜 | 從右到左 | |
乘性 | * /% | 左到右 | |
加性 | + - | 左到右 | |
移位 | >> >>> << | 左到右 | |
關系 | >> = << = | 左到右 | |
相等 | == != | 左到右 | |
按位與 | & | 左到右 | |
按位異或 | ^ | 左到右 | |
按位或 | | | 左到右 | |
邏輯與 | && | 左到右 | |
邏輯或 | | | | 左到右 | |
條件 | ?: | 從右到左 | |
賦值 | = + = - = * = / =%= >> = << =&= ^ = | = | 從右到左 | |
逗號 | , | 左到右 | 低 |
4,程序流程控制
4.1,if ...else...結構
if(布爾表達式)
{
//如果布爾表達式為true將執行的語句
}
if(布爾表達式){
//如果布爾表達式的值為true
}else{
//如果布爾表達式的值為false
}
if(布爾表達式 1){
//如果布爾表達式 1的值為true執行代碼
}else if(布爾表達式 2){
//如果布爾表達式 2的值為true執行代碼
}else if(布爾表達式 3){
//如果布爾表達式 3的值為true執行代碼
}else {
//如果以上布爾表達式都不為true執行代碼
}
if(布爾表達式 1){
////如果布爾表達式 1的值為true執行代碼
if(布爾表達式 2){
////如果布爾表達式 2的值為true執行代碼
}
}
4.2,switch結構
switch(expression){
case value :
//語句
break; //可選
case value :
//語句
break; //可選
//你可以有任意數量的case語句
default : //可選
//語句
}
- switch 語句中的變量類型可以是: byte、short、int 或者 char。從 Java SE 7 開始,switch 支持字符串 String 類型。
- case 語句中的值的數據類型必須與變量的數據類型相同,而且只能是常量或者字面常量。
- switch 語句可以包含一個 default 分支,該分支一般是 switch 語句的最后一個分支(可以在任何位置,但建議在最后一個)。default 在沒有 case 語句的值和變量值相等的時候執行。default 分支不需要 break 語句。
4.3,for循環
for(初始化; 布爾表達式; 更新) {
//代碼語句
}
for(int x = 10; x < 20; x = x+1) {
System.out.print("value of x : " + x );
System.out.print("\n");
}
4.4,增強for循環
for(聲明語句 : 表達式)
{
//代碼句子
}
int [] numbers = {10, 20, 30, 40, 50};
for(int x : numbers ){
System.out.print( x );
System.out.print(",");
}
System.out.print("\n");
String [] names ={"James", "Larry", "Tom", "Lacy"};
for( String name : names ) {
System.out.print( name );
System.out.print(",");
}
4.5,while循環(先判斷)
while( 布爾表達式 ) {
//循環內容
}
int x = 10;
while( x < 20 ) {
System.out.print("value of x : " + x );
x++;
System.out.print("\n");
}
4.6,do...while循環(先執行循環體)
do {
//代碼語句
}while(布爾表達式);
int x = 10;
do{
System.out.print("value of x : " + x );
x++;
System.out.print("\n");
}while( x < 20 );
4.7,break與continue
break:跳出當前循環
continue:結束當次循環,繼續執行下一次循環
5,數組
5.1,一維數組
//動態初始化
int a[] = new int[3];
a[0]=1;
a[1]=2;
a[2]=3;
//靜態初始化
int b[] = new int[]{1,2,3};
//輸出數組長度
System.out.println(b.length);
5.2,二維數組
int[][] arr = new int[3][4];
for(int i =0;i<3;i++)
{
for(int j=0;j<4;j++)
{
arr[i][j]=i+j;
}
}
for(int i =0;i<3;i++)
{
for(int j=0;j<4;j++)
{
System.out.print(arr[i][j]+"\t");
if(j==3)
{
System.out.println();
}
}
}