黑馬學習筆記--JAVA基礎知識
阿新 • • 發佈:2019-02-18
JAVA概述
JAVA發展史:
JAVA之父:詹姆斯.高斯林
SUN公司:斯坦福大學網路公司(2010-10-24被oracle收購)
JDK JRE JVM:
- JDK: JAVA開發工具包,包含了JRE,編譯工具,打包工具等。(安裝了JDK就不用安裝JRE了)。
- JRE:JAVA執行環境,包含了核心類庫和JVM。
- JVM:JAVA虛擬機器,JAVA程式需要執行在虛擬機器上,虛擬機器有各種平臺的,因此JAVA語言可以跨平臺。
註釋概述
註釋:
- 用於解釋說明程式的文字。
註釋分類:
- 單行註釋:
//
- 多行註釋:
/* */
- 文字註釋:
/** */
作用:
- 解釋說明程式,幫助我們除錯錯誤。
關鍵字
- 被JAVA語言賦予特定含義的單詞。
特點:
- 字母全部小寫,編譯器顏色標記
語法格式
常量
常量概述:
- 在程式執行過程中,其值不能發生改變。
常量分類:
- 字串常量 - 雙引號引起來
- 整數常量 - 所有整數
- 小數常量 - 所有小數
- 字元常量 - 單引號引起來
- 布林常量 - true false
- 空常量 - null
變數
變數概述:
- 在程式執行過程中,在某個範圍內,其值可以發生改變。
本質:
- 記憶體中的一小塊區域
定義格式:
- 資料型別 變數名 = 初始化值
資料型別
計算機儲存單元
計算機儲存裝置的最小資訊單元叫“位(bit)”
計算機最小的儲存單元叫“位元組(byte)” 一般用B表示。
- 1B = 8bit
- 1KB = 1024B
- 1MB = 1024KB
- 1GB = 1024MB
- 1TB = 1024GB
- 1PB = 1024TB
- 1EB = 1024PB
資料型別概述和分類
分為基本資料型別和引用資料型別
基本資料型別:四類八種
四類 | 八種 | 位元組數 | 資料表示範圍 |
---|---|---|---|
整 | byte | 1 | -128~127 |
short | 2 | -32768~32767 | |
int | 4 | -2147483648~2147483648 | |
型 | long | 8 | -2^63~2^63-1 |
浮點 | float | 4 | -3.403E38~3.403E38 |
型 | double | 8 | -1.798E308~1.798E308 |
字元型 | char | 2 | 表示一個字元如’2’ |
布林型 | boolean | 1 | true or false |
- 需要記憶的: ‘A’ = 65; ‘a’ = 97; ‘0’ = 48;
識別符號
作用:
- 給包,類,方法,變數等起名字。
組成規則:
- 由字元,下劃線,$組成。
注意事項:
- 不能以數字開頭
- 不能是關鍵字
命名原則:
- 見名知意
定義變數
定義格式:
資料型別 變數名 = 初始化值
注意:
- 整數預設是int型別,定義long型別要加L
- 變數未賦值不能直接使用
- 變數只在她所屬範圍內有效
- 一行可以定義多個變數 但是不建議
資料型別轉換
隱式資料型別轉換:
- 取值範圍小的資料型別與取值範圍大的資料型別進行運算,會先將小的資料型別提升為大的,再運算。
強制資料型別轉換:
強制轉換格式: b = (byte)(a + b);
注意事項:
- 如果超出了被賦值的資料型別的取值範圍得到的結果會與你期望的結果不同
運算子
- 對常量和變數進行操作的符號成為運算子
- 用運算子把常量或者變數連線起來符號java語法的式子就可以稱為表示式
- 常用運算子:算術運算子 關係運算符 賦值運算子 邏輯運算子 三元運算子
算術運算子:
取餘和除法的區別
- %:取餘運算子。得到的是兩個相除資料的餘數。
- /:除法運算子。得到是兩個相除資料的商
++ –詳解
- ++,–運算子:對變數做加1或者減1的操作。
- ++或者–既可以放在變數的後面,也可以放在變數的前面。
- 單獨使用的時候,++或者–無論是放在變數的前面還是後面,結果是一樣的。
參與操作的時候:
如果++或者–在變數的後面,先拿變數參與操作,後變數做++或者–
如果++或者–在變數的前面,先變數做++或者–,後拿變數參與操作。賦值運算子:
- 基本的賦值運算子:=
- 擴充套件的賦值運算子:+=,-=,* =,/=,%=
- +=: a+=20;相當於a = (a的資料型別)(a + 20)
關係運算符:
- ==,!=,>,>=,<,<=
- 關係運算符的結果都是boolean型,也就是要麼是true,要麼是false
邏輯運算子:
- &,|,^,!,&&,||
注意事項:
- 邏輯運算子一般用於連線boolean型別的表示式或者值。
- 表示式:就是用運算子把常量或者變數連線起來的符合java語法的式子。
- 算術表示式:a + b
- 比較表示式:a == b(條件表示式)
總結:
運用:
- &邏輯與:有false則false。
- |邏輯或:有true則true。
- ^邏輯異或:相同為false,不同為true。
- !邏輯非:非false則true,非true則false。
&&與&的區別:
- 最終結果一樣。
- &&具有短路效果。左邊是false,右邊不執行。
- &是無論左邊是false還是true,右邊都會執行
||和|的區別:
- 最終結果一樣
- ||具有短路效果.左邊是true,右邊不執行
- |是無論左邊是false還是true,右邊都會執行
三元運算子:
- 關係表示式)?表示式1:表示式2;
- 如果條件為true,運算後的結果是表示式1;
- 如果條件為false,運算後的結果是表示式2;
簡單的鍵盤錄入:
import java.util.Scanner; //導包
public class ScannerTest {
public static void main(String[] args) {
// 建立物件
Scanner sc = new Scanner(System.in);
// 接收資料
System.out.println("請輸入第一個資料:");
int a = sc.nextInt();
System.out.println("請輸入第二個資料:");
int b = sc.nextInt();
// 對資料進行求和
int sum = a + b;
System.out.println("sum:" + sum);
}
}
選擇流程控制語句
順序結構概述:
- 是程式中最簡單最基本的流程控制,沒有特定的語法結構,依照程式碼的先後順序,依次執行,程式中大多數程式碼都是這樣執行的。
if語句的格式
格式一
- if(關係表示式){語句體}
格式二
- if(關係表示式){語句體}else(語句體)
格式三
- if(關係表示式){語句體}else if(關係表示式){語句體}else{語句體}
if語句實現獲取三個資料排列順序
- 1.鍵盤錄入三個整數,按照從小到大的順序輸出
- 2.如果使用者輸入的是3 2 1,程式執行後列印格式”按照從小到大排序後的順序為:1 2 3”
import java.util.*;
public static void main(String[] args){
Scanner s = new Scanner(System.in);
System.out.println("請輸入第一個整數:");
int a = s.nextInt();
System.out.println("請輸入第二個整數:");
int b = s.nextInt();
System.out.println("請輸入第三個整數:");
int c = s.nextInt();
int temp;
if(a < b){
temp = a;
a = b;
b = temp;
}
if(a < c){
temp = a;
a = c;
c = temp;
}
if(b < c){
temp = b;
b = c;
c = temp;
}
System.out.println(c+"-->"+b+"-->"+a);
}
switch語句的格式
格式:
swith(表示式){
case 值1:
語句體;
break;
case 值2:
語句體;
break;
default:
語句體;
break;
}
```
### 格式解釋:
- switch表示這是switch語句
- 表示式的取值:byte,short,int,char,String (不能取小數)
- JDK5以後可以是列舉
- JDK7以後可以是String
- case後面跟的是要和表示式進行比較的值
- 語句體部分可以是一條或多條語句
- break表示中斷,結束的意思,可以結束switch語句
- default語句表示所有情況都不匹配的時候,就執行該處的內容,和if語句的else相似。
### 執行流程:
首先計算出表示式的值
其次,和case依次比較,一旦有對應的值,就會執行相應的語句,在執行的過程中,遇到break就會結束。
最後,如果所有的case都和表示式的值不匹配,就會執行default語句體部分,然後程式結束掉。
### 例句:
``` JAVA
public class SwitchDemo {
public static void main(String[] args) {
//建立鍵盤錄入物件
Scanner sc = new Scanner(System.in);
//接收資料
System.out.println("請輸入一個數字(1-7):");
int weekday = sc.nextInt();
//switch語句實現選擇
switch(weekday) {
case 1:
System.out.println("星期一");
break;
case 2:
System.out.println("星期二");
break;
case 3:
System.out.println("星期三");
break;
case 4:
System.out.println("星期四");
break;
case 5:
System.out.println("星期五");
break;
case 6:
System.out.println("星期六");
break;
case 7:
System.out.println("星期日");
break;
default:
System.out.println("你輸入的數字有誤");
break;
}
}
}
<div class="se-preview-section-delimiter"></div>
迴圈流程控制語句
for迴圈格式和基本使用
格式:
for(初始化語句;判斷條件語句;控制條件語句){
迴圈體語句;
}
執行流程:
- A:執行初始化語句
- B:執行判斷條件語句,看其結果是true還是false
- 如果是false,迴圈結束。
- 如果是true,繼續執行。
- C:執行迴圈體語句
- D:執行控制條件語句
- E:回到B繼續
案例:
public class ForDemo {
public static void main(String[] args) {
//原始寫法
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("-------------------------");
//用迴圈改進
for(int x=1; x<=10; x++) {
System.out.println("HelloWorld");
}
}
}
<div class="se-preview-section-delimiter"></div>
while迴圈語句格式
格式:
基本格式
while(判斷條件語句) {
迴圈體語句;
}
擴充套件格式
初始化語句;
while(判斷條件語句) {
迴圈體語句;
控制條件語句;
}
<div class="se-preview-section-delimiter"></div>
public class WhileTest {
public static void main(String[] args) {
//回顧for迴圈實現
/*
//定義求和變數
int sum = 0;
//獲取1-100之間的資料
for(int x=1; x<=100; x++) {
//累加
sum += x;
}
System.out.println("1-100的和是:"+sum);
*/
//while迴圈實現
//定義求和變數
int sum = 0;
int x = 1;
while(x<=100) {
sum += x;
x++;
}
System.out.println("1-100的和是:"+sum);
}
}
<div class="se-preview-section-delimiter"></div>
do…while迴圈的格式及基本使用
格式:
基本格式
do {
迴圈體語句;
}while(判斷條件語句);
擴充套件格式
初始化語句;
do {
迴圈體語句;
控制條件語句;
} while(判斷條件語句);
<div class="se-preview-section-delimiter"></div>
案例:
public class DoWhileDemo {
public static void main(String[] args) {
//輸出10次 HelloWorld
/*
for(int x=1; x<=10; x++) {
System.out.println("HelloWorld");
}
*/
//do...while改寫
int x=1;
do {
System.out.println("HelloWorld");
x++;
}while(x<=10);
}
}
<div class="se-preview-section-delimiter"></div>
三種迴圈的區別:
- do…while迴圈至少會執行一次迴圈體。
- for迴圈和while迴圈只有在條件成立的時候才會去執行迴圈體
- for迴圈語句和while迴圈語句的小區別:
- 使用區別:控制條件語句所控制的那個變數,在for迴圈結束後,就不能再被訪問到了,而while迴圈結束還可以繼續使用,如果你想繼續使用,就用while,否則推薦使用for。原因是for迴圈結束,該變數就從記憶體中消失,能夠提高記憶體的使用效率。
案例:
/*
* 三種迴圈的區別:
* A:do...while至少執行一次迴圈體
* B:for,while迴圈先判斷條件是否成立,然後決定是否執行迴圈體
*
* for和while的小區別:
* for迴圈的初始化變數,在迴圈結束後,不可以被訪問。而while迴圈的初始化變數,是可以被繼續使用的。
* 如果初始化變數,後面還要繼續訪問,就使用while,否則,推薦使用for。
*
* 迴圈的使用推薦:
* for -- while -- do...while
*/
public class DoWhileDemo2 {
public static void main(String[] args) {
/*
int x = 3;
while(x<3) {
System.out.println("我愛林青霞");
x++;
}
System.out.println("--------------");
int y = 3;
do {
System.out.println("我愛林青霞");
y++;
}while(y<3);
*/
for(int x=1; x<=10; x++){
System.out.println("愛生活,愛Java");
}
//這裡的x無法繼續訪問
//System.out.println(x);
System.out.println("-----------------");
int y = 1;
while(y<=10) {
System.out.println("愛生活,愛Java");
y++;
}
System.out.println(y);
}
}
<div class="se-preview-section-delimiter"></div>
控制迴圈語句
break的使用
break的使用場景和作用:
- break的使用場景:在選擇結構switch語句中。
- 在迴圈語句中,離開使用場景的存在是沒有意義的。
- break的作用:跳出單層迴圈。
案例:
public class BreakDemo {
public static void main(String[] args) {
//break;
for(int x=1; x<=10; x++) {
if(x == 3) {
break;
}
System.out.println("HelloWorld");
}
}
}
<div class="se-preview-section-delimiter"></div>
continue的使用
continue的使用場景和作用:
- continue的作用:單層迴圈對比break。
案例:
public class ContinueDemo {
public static void main(String[] args) {
//continue;
for(int x=1; x<=10; x++) {
if(x == 3) {
//break;
continue;
}
System.out.println("HelloWorld");
}
}
}
<div class="se-preview-section-delimiter"></div>
總結:
- break退出當前迴圈
- continue退出本次迴圈
- return退出當前方法
Random講解
使用步驟:
- 導包:import java.util.Random;
- 建立物件:Random r = new Random();
- 獲取隨機數:int number = r.nextInt(10);
- 產生的資料在0到10之間,包括0,不包括10。
- 括號裡面的10是可以變化的,如果是100,就是0-100之間的資料
案例:
import java.util.Random;
import java.util.Scanner;
/*
* 猜數字小遊戲案例
* 系統產生一個1-100之間的隨機數,請猜出這個資料是多少。
* 分析:
* A:系統產生一個隨機數1-100之間的。
* int number = r.nextInt(100) + 1;
* B:鍵盤錄入我們要猜的資料
* 用Scanner實現
* C:比較這兩個資料(用if語句)
* 大了:給出提示大了
* 小了:給出提示小了
* 猜中了:給出提示,恭喜你,猜中了
* D:多次猜資料,而我們不知道要猜多少次,怎麼辦呢?
* while(true) {迴圈的內容}
*/
public class RandomTest {
public static void main(String[] args) {
// 系統產生一個隨機數1-100之間的。
Random r = new Random();
int number = r.nextInt(100) + 1;
while(true){
// 鍵盤錄入我們要猜的資料
Scanner sc = new Scanner(System.in);
System.out.println("請輸入你要猜的數字(1-100):");
int guessNumber = sc.nextInt();
// 比較這兩個資料(用if語句)
if (guessNumber > number) {
System.out.println("你猜的資料" + guessNumber + "大了");
} else if (guessNumber < number) {
System.out.println("你猜的資料" + guessNumber + "小了");
} else {
System.out.println("恭喜你,猜中了");
break;
}
}
}
}
<div class="se-preview-section-delimiter"></div>
陣列
陣列的定義
陣列的概念:
- 陣列是儲存同一種資料型別多個元素的容器。
- 陣列既可以儲存基本資料型別,也可以儲存引用資料型別。
定義格式:
- 格式1:資料型別[] 陣列名;
- 格式2:資料型別 陣列名[];
- 注意:這兩種定義做完了,陣列中是沒有元素值的。
陣列的初始化
初始化概述:
- Java中的陣列必須先初始化,然後才能使用。
- 所謂初始化:就是為陣列中的陣列元素分配記憶體空間,併為每個陣列元素賦值。
陣列的初始化方式:
動態初始化:初始化時只指定陣列長度,由系統為陣列分配初始值
格式:
- 資料型別[] 陣列名 = new 資料型別[陣列長度];
- 陣列長度其實就是陣列中元素的個數。
舉例:
- int[] arr = new int[3];
- 解釋:定義了一個int型別的陣列,這個陣列中可以存放3個int型別的值。
靜態初始化:初始化時指定每個陣列元素的初始值,由系統決定陣列長度
public static void main(String[] args) {
//定義陣列
int[] arr = {1,2,3};
//輸出陣列名和元素
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
}
<div class="se-preview-section-delimiter"></div>
JVM的記憶體劃分:
- Java 程式在執行時,需要在記憶體中的分配空間。為了提高運算效率,就對空間進行了不同區域的劃分,因為每一片區域都有特定的處理資料方式和記憶體管理方式。
- 棧 儲存區域性變數
- 堆 儲存new出來的東西
- 方法區 (面向物件進階講)
- 本地方法區 (和系統相關)
- 暫存器 (給CPU使用)
堆疊概述:
堆:
- 每個物件都有一個記憶體地址都有預設初始值:
- byte,short,int,long預設值:0;
- float,double:0.0;
- char:\u0000;
- 引用型別:null;
- boolean:false;
- 使用完畢會在垃圾回收器空閒的時候回收。
棧:
- 儲存區域性變數。
- 使用完畢立即被回收。
一維陣列的使用
遍歷方式:
for(int x=0; x<arr.length; x++) {
System.out.println(arr[x]);
}
<div class="se-preview-section-delimiter"></div>
取最值:
public class ArrayTest2 {
public static void main(String[] args) {
//定義陣列
int[] arr = {12,98,45,73,60};
//定義參照物
int max = arr[0];
//遍歷陣列,獲取除了0以外的所有元素,進行比較
for(int x=1; x<arr.length; x++) {
if(arr[x] > max) {
max = arr[x];
}
}
System.out.println("陣列中的最大值是:"+max);
}
}
<div class="se-preview-section-delimiter"></div>
二維陣列的使用
格式:
- 定義格式:資料型別[][] 陣列名;
- 初始化方式:
- 資料型別[][] 變數名 = new 資料型別[m][n];
- 資料型別[][] 變數名 = new 資料型別[][]{{元素…},{元素…},{元素…}};
- 簡化版格式:資料型別[][] 變數名 = {{元素…},{元素…},{元素…}};
<div class="se-preview-section-delimiter"></div>
遍歷:
for(int y=0; y<arr.length; y++) {
for (int x = 0; x < arr[y].length; x++) {
System.out.print(arr[y][x] + " ");
}
System.out.println();
}
<div class="se-preview-section-delimiter"></div>
方法的概述及基本使用
方法:簡單的說:方法就是完成特定功能的程式碼塊
方法的格式:
修飾符 返回值型別 方法名(引數型別 引數名1,引數型別 引數名2…) {
函式體;
return 返回值;
}
- 修飾符 目前記住 public static
- 返回值型別 用於限定返回值的資料型別
- 方法名 一個名字,為了方便我們呼叫方法
- 引數型別 用於接收呼叫方法時傳入的資料的型別
- 引數名 用於接收呼叫方法時傳入的資料的變數
- 方法體 完成功能的程式碼
- return 結束方法,把返回值帶給呼叫者
定義方法注意事項:
- 返回值型別 明確功能結果的資料型別
- 引數列表 明確有幾個引數,以及引數的型別
- 按照格式和兩個明確來完成如下功能
呼叫方式:
- 單獨呼叫:沒有明確的返回值 比如void型別方法的呼叫
- 輸出呼叫
- 賦值呼叫
方法的過載:
- 在同一個類中,允許存在一個以上的同名方法,只要它們的引數個數或者引數型別不同即可。
方法過載特點:
- 與返回值型別無關,只看方法名和引數列表.
- 在呼叫時,虛擬機器通過引數列表的不同來區分同名方法.
- 引數列表不同:引數個數或者引數型別不同.
引數傳遞:
- 方法的引數是基本型別的時候:形式引數的改變不影響實際引數。
- 形式引數:用於接收實際資料的變數
- 實際引數:實際參與運算的變數