【Java語言基礎】
* 標識符
* 關鍵字
* 字面值
* 變量
* 數(shù)據(jù)類型
* 二進制
* 字符編碼
* 運算符
* 控制語句
* 方法
一、 標識符(黑色/可自定義處)
(一)起名規(guī)則:
- 不可用數(shù)字開頭
- 可: $胸墙、_ 冀自、字母夺鲜、數(shù)字
- 區(qū)分大小寫
(二)規(guī)范
- 見名知義為佳
- 不要太長
- 對方法和變量起名, 采用小駝峰命名法, 如: firstName
- 對類和接口起名, 采用大駝峰命名法, 如: GoodStudent
- 常量名全部大寫
二皆尔、字面值
即數(shù)據(jù), 類型有:
boolean: 1字節(jié) false和true
數(shù)字: int 4 double 8
字符串: 雙引號, “ABC”
字符: char 2, 單引號, ‘A’
三、變量
- 定義
值可變, 本質(zhì)是內(nèi)存中一塊空間的名字, 是存儲數(shù)據(jù)的基本單元
這塊空間是有類型币励、有名字慷蠕、有字面值的
(數(shù)據(jù)類型指導程序在運行階段該開辟多大的空間)
- 格式:
聲明:數(shù)據(jù)類型 變量名;
注意變量名是小駝峰
? int a, b, c;
?? 聲明完成≠開辟了空間
? 在同一個作用域中, 變量名不可重名; 聲明只有 1 次
初始化:變量名 = 字面值
字面值與數(shù)據(jù)類型一致; 初始化才可用\空間才已被開辟
聲明+初始化:數(shù)據(jù)類型 名字 = 值;
- 訪問一個變量的2種形式
- get 讀取
- set 設置/修改
- 變量的作用域: 出了{}就不認識了(方法結束后, 變量的內(nèi)存就釋放了)
-
變量的類型
1)局部變量
? 在方法體內(nèi)的變量
2)成員變量
? 在方法體外、類體之內(nèi)聲明的變量
```java
public class HelloWorld {
public static void main(String[] args) {
int i = 1;
System.out.println(i);//就近訪問1處
}
static int i = 2;
//若main方法體內(nèi)找不到,會找全局有否static變量可訪問
public static void doSth() {
int i = 3;
//不可跨方法體訪問(1食呻、2處都找不到也不會找到3處
}
}
```
四流炕、數(shù)據(jù)類型
作用:指導JVM在運行程序時需要給該數(shù)據(jù)分配多大的內(nèi)存空間
類型-大類: 基本數(shù)據(jù)類型與引用數(shù)據(jù)類型
基本數(shù)據(jù)類型——四大類澎现、八小種
(一) 整數(shù)型
byte short int long 1 2 4 8
(二) 浮點型
float double 4 8
數(shù)字類型-練習
- 如何表示一個數(shù)字的正負?
- byte的最大值是?
- 00000000 00000000 00000000 10000000是什么類型?
- 00000000 00000000 00000000 10000000 - 1 = ?
- 八進制與十六進制的開頭?
- 整數(shù)字面值默認類型為?如何轉為其他, 比如long?
- 是否有精度比double更高的類型?
- 浮點數(shù)字面值默認類型為?如何轉為其他??
key
最高位(最左邊) 0正1負
01111111
int 4個字節(jié)
00000000 00000000 00000000 01111111
0和0x
-
int; 后加L
long y = 1234567899; //編譯報錯 long z = 1234567899L; //編譯通過
SUN在基礎SE類庫內(nèi)提供了更高精度的類型(引用數(shù)據(jù)類型而非基本數(shù)據(jù)類型): java.math.BigDecimal
double; 后加F
(三) 布爾型
bool 2
底層 0假1真
有效值 false和true
(四) 字符型
char 2
‘a(chǎn)' 97 01100001
’A' 65 01000001
‘0’ 48 00110000
(五)類型轉換規(guī)則
- 除bool其他都可相互轉換
-
自動類型轉換: 小容量轉為大容量
byte不可向char轉換;
short、char都可向int轉換
- char可以get更大的數(shù)(因為字符無正負
-
強制類型轉換: 大容量轉換為小容量
格式: int y = (int) x; //long x = 100L; 賦值左右類型要一致
- 結果: 高位(左邊)的二進制會被砍掉(精度損失每辟、謹慎使用)
-
多種類型混合運算實現(xiàn):
-
各自都轉換成大容量的, 再做運算
- int值不超過小弟們的取值范圍,也可直接賦給小弟們
-
五剑辫、運算符
(一)加減乘除
(二)關系運算符
= != > >= < <=
結果: 布爾型
(三)賦值運算符
=
+= -= %= *=
(四)邏輯運算符
兩邊都是布爾, 最后結果也是布爾
符號 | 說明 |
---|---|
& | 有false則false |
| | 有true則true |
! | 取反 |
^ | 異或, 兩邊不一樣就是true |
&& | 短路與: 左false則false (不算右可得) |
|| | 短路或: 左true則true (不算右可得) |
根據(jù)需求決定要不要用短路邏輯運算符 (第二個算子是否需要執(zhí)行)
另可劃分:布爾運算符與位運算符
類型 | 符號 |
---|---|
布爾運算符 | &&,||, &, | |
位運算符 |
& , 按位與; | , 按位或; ^ , 按位異或; ~ , 按位非; >> , 右移; >>> , 右移,左邊空出位以0填充; << , 左移 |
Q: 2->8的最快方法?
A: 00000010 將1左移2位
(五)三目運算符/條件運算符
(六)+
-
字符+
ASICII碼, char -> int
-
字符串+
拼接: 表達式中只要有一個字符串, 則進行的都是拼接操作
六、輸入
三步驟
-
導包
import java.util.Scanner;
-
創(chuàng)建對象
Scanner sc = new Scanner(System.in);
-
接收數(shù)據(jù)
Int i = sc.nextInt();
七渠欺、方法function
(一)格式
[修飾符列表] 返回值類型 方法名(形參列表){ //方法名要有動詞屬性, 見名知義, 不同功能區(qū)別也要大一點
方法體 //main方法里要短,要學會抽離方法
}
1. 修飾符列表
該項為可選項
Q: 方法有static關鍵字, 如何調(diào)用該方法?
A: 類名.方法名(實參列表);
? 但有時可省略類名: 該方法在當前類中
2. 返回值
- 非void的方法
1). 返回格式必須為return 值;
(值要相對應)
2). 雖然有返回值, 但調(diào)用者可選接收否 (使用變量接收)
3). 可直接輸出結果, 不用必須變量才可輸出
- void方法
? return;
3.內(nèi)存分配
1). 方法只定義, 不調(diào)用, 是不會執(zhí)行的; 并且在JVM中也不會給該方法分配“運行所屬”的內(nèi)存空間
2). JVM內(nèi)存劃分
- 方法區(qū)內(nèi)存——存方法代碼片段
(.class字節(jié)碼文件的一部分)
(1) 字節(jié)碼文件在類加載的時候, 類加載器將其放入方法區(qū)中(方法區(qū)內(nèi)存最先有數(shù)據(jù))
(2) 方法代碼片段可以被重復調(diào)用: 每次調(diào)用都需要給該方法分配獨立的活動場所(棧)
(3) String.class 妹蔽、System.class ... 也在此 (rt.jar中)
- 堆內(nèi)存
- 棧內(nèi)存
(1) 分配方法運行所屬的內(nèi)存空間——壓棧(局部變量的內(nèi)存在這里)
(2) 釋放該方法的內(nèi)存空間——彈棧
(3) 最先調(diào)用main方法, 而它最后結束
(二)方法重載/overload
功能相似時,盡可能讓方法名相同 (不同功能名字也要有區(qū)別)
重載情況:在同一個類中, 方法名相同, 但參數(shù)列表不同: 參數(shù)的數(shù)量、順序挠将、數(shù)據(jù)類型不同 (方法重載僅和方法名+參數(shù)列表有關, 而與返回值類型胳岂、修飾符列表無關)
僅參數(shù)名不同不構成重載
public static void m1(int a , int b);
public static void m1(int b , int a); //方法重復,而非重載
(三)方法的遞歸調(diào)用
無遞歸出口: java.lang.StackOverflowError (棧內(nèi)存溢出錯誤)
耗內(nèi)存,盡量不用 (遞歸太深也會導致棧溢出錯誤)
感覺: “大” -> “小”的套娃, 遞歸出口時最小情況
-
出口:
if(條件){ return 值; }
以上是全部基礎語法的內(nèi)容, 算是開了門, 接下來要邁門檻啦~