java_簡單學習筆記
java_study筆記
前言:
所有筆記均總結自狂神的java基礎視訊
https://www.bilibili.com/video/BV12J41137hu?p=1
idea小技巧
- psvm+回車直接給一個main方法
- ctrl+d複製當前行到下一行
- sout+回車直接輸出
- 輸入的時候 new Scanner(System.in); 然後alt+回車
- 100.for 直接生成一個for迴圈
- 陣列名.for自動生成一個for-each迴圈
- alt+insert生成構造器 同樣也可以生成get/set方法
- ctrl+alt+t自動設定巢狀
java三大版本
- javaSE:標準版(桌面程式,控制檯開發.....)
- javaME:嵌入式開發
- javaEE:企業版
JDK,JRE,JVM
JDK包含了JRE 開發時使用
JRE是java執行時的環境 包含了java的虛擬機器
JVM是java的虛擬機器
java記憶體分析
基礎語法
變數分類:
java是強語言型別
java的資料型別分為兩大類:
- 基本型別
- 引用型別
注意一下float+f long+l就行了
變數的型別
- 類靜態變數,寫在類內方法外
static int a=0;
- 例項變數,寫在類內方法外
int a=0;
- 區域性變數,寫在方法內
int a=0;
- 常量,可以是類的,可以是區域性,也可以是例項
final int a=0;
基本運算子
- 算術運算子:
+,-,*,/,%,++,--
- 賦值運算子
=
- 關係運算符
>,<,<=,>=,==,!=,instanceof
- 邏輯運算子
&&,||,!
- 位運算子
&,|,^,~,>>,<<,>>>
- 條件運算子
?:
- 擴充套件賦值運算子
+=,-=,*=,/=
- 很多運算會使用工具類 比如Math等等
包機制
定義一個包用的是package
匯入一個包用的是Import
//import base.*;
- 包的本質就是一個資料夾 或者是一個名稱空間,一般用公司域名倒置用作包名
- 有時候當我們需要用到某些包裡面的方法的時候,要匯入包
java Doc
- javadoc命令是用來生成自己api文件的
- 加在類上就是類註釋 加在方法裡面就是方法的註釋
@author 作者名
@version 版本號
@since 指明需要最早使用的jdk版本
@param 引數名
@return 返回值情況
@throws 異常丟擲情況
使用方法:
javadoc -encoding UTF-8 -charset UTF-8 Doc.java
java流程控制
使用者互動Scanner
- java.utilScanner java5的新特性,可以通過Scanner類來獲取使用者的輸入
- 基本語法
Scanner s=new Scanner(System.in);
-
通過Scanner類的next()與nextLine()方法獲取輸入的字串,在讀取前我們一般需要 使用hasNext()與hasNextLine()判斷是否還有輸入的資料
-
sanner用完之後要關閉
scanner.close()
- next()和nextLine()的區別就是 一個不能讀空白分割 一個可以讀取整行,以換行符為結束符
if選擇結構
if(){
}
else if{
}
else{
}
switch多選擇結構
switch(expression){
case value1:
break;
case value2:
break;
default:
}
- switch 語句中的變數型別可以是:
- byte、short、int、char
- 從java se7開始switch可以支援String 同時case標籤必須為字串常量或字面量
- 注意break的使用 否則會出現case穿透現象
迴圈
- while
while(){}
- do while
- 即使不能進入迴圈也能至少執行一次
do{
}while()
- for
- for 支援迭代的最有效的結構
for(;;){
}
- 增強for迴圈
for(int x:number){
sout(numbers[i])
}
跳出迴圈
break
- 終止迴圈,強制退出迴圈
continue----------
- 終止某次迴圈
方法
System.out.println()
- 格式
public 返回值 名字(形式引數){
}
public static 返回值 名字(形式引數){
}
- 如果是靜態方法可以直接在其他的方法中被呼叫 是屬於類的 即類中的就可以隨便用 用.
值傳遞和引用傳遞
- 過載就是在一個類中有相同的名稱但是引數不同
- 方法名稱必須相同,引數列表必須不同 滿足兩個條件即可
命令列傳參
- 依靠命令列引數傳遞給main
public static void main(String[] args) {
for (int i = 0; i < args.length; i++) {
System.out.println("arg["+i+"]:"+args[i]);
}
}
在載入一個類的時候要到包的路徑 包.類才能引用
可變引數
- 可以傳遞很多個值 也叫做不定向引數
用法:
- 指定型別後面加一個...省略號
- 一個方法中只能指定一個可變引數,他必須是方法的最後一個引數,任何普通的引數必須在它之前宣告
public static void main(String[] args) {
demo02 de=new demo02();
de.test(1,2,3,4,5);
}
public void test(int ...i){
System.out.println(i[0]);
}
此時傳遞的引數可以是多個同一型別的引數 也可以是陣列,因為本質上可變引數就是一個數組
new int[]{1,2,3,4,5}
陣列
陣列的宣告和建立
- 陣列長度是固定的,一旦宣告不可改變
- array.length 獲得陣列的長度
宣告方式:
型別[] 變數名; //首選
或者
型別 變數名[];
陣列的建立:
int[] nums;
nums=new int[10];
陣列的三種初始化
- 靜態初始化
int[] a={1,2,3};
Man[] mans={new Man(1,1),new man(2,2)}
- 動態初始化
int[] b=new int[10];
b[0]=10;
- 預設初始化
陣列也是一種引用型別,它的元素相當於類的例項變數,因此陣列一經分配空間,其中的每個元素也被按照例項變數同樣的方式被隱式初始化
陣列的使用
- for-each迴圈
for (int arrau : arraus) {
System.out.println(arrau);
}
多維陣列
- 本質上就是陣列的巢狀 就是數組裡面有陣列
Arrays類
- java.util.Arrays
- Arrays.toString(a) 打印出陣列a
稀疏陣列
-
對於有的陣列利用率比較低的就可以使用稀疏陣列
-
本質還是一個二維陣列
面向物件
public class pat{
public String name;
public int age;
public void say(){
sout("交了一聲");
}
}
- 類=屬性+方法
- 本質:以類的方式組織程式碼,以物件的組織封裝資料
- 三大特性:繼承 封裝 多型
靜態方法的呼叫
- 類名.方法名
非靜態方法的呼叫:
- new一個物件 然後物件.方法名
static的區別 就是static是和類一起建立的 而非靜態的是和物件一起載入的 所以靜態與非靜態之間無法相互呼叫 靜態可以直接掉靜態 非靜態可以直接掉非靜態
值傳遞和引用傳遞
e.g:傳物件就是傳引用 傳數就是傳值
物件與類的關係
- 類是一種抽象的資料型別,他是對某一類事物整體描述/定義,但是不能代表某一個具體的事物
- 物件是抽象概念的具體例項
類的建構函式
-
一個類即使什麼都不寫 也會有預設的東西 那是因為存在構造方法
-
構造器可以用於初始化一些屬性,預設是無參構造
-
如果定義了有參構造 就必須顯式定義有參構造
-
構造器特性:1.和類名相同 2.沒有返回值
-
構造器作用:1.new 本質在於呼叫構造方法 2.初始化物件的值
-
注意點:1.定義有參構造之後,如果向使用無參構造,顯示的定義一個無參的構造
封裝
核心:set/get
- 該露的露 該藏的藏,提高安全性,隱藏程式碼實現細節
- 程式設計追求:高內聚,低耦合
- 核心就是 即對於私有的屬性 我們要提供public的方法來進行呼叫
繼承
- extends的意思是"擴充套件",子類是父類的的擴充套件
- 繼承的本質是對一批類的抽象,從而實現對現實世界更好的建模
- java中只有單繼承沒有多繼承
- 子類繼承了父類 就擁有了父類的全部方法 私有的無法繼承、
- java中所有的類 直接或者間接繼承object類
- 預設會呼叫父類的無參構造 相當於一個super()
super
- 和this差不多 不過是呼叫父類的一些方法和屬性(私有除外)
super注意點:
1.super呼叫父類的構造方法,必須在構造方法的第一個
2.super必須只能出現在子類的方法或者構造方法中
3.super和this不能同時呼叫構造方法
vs this:
代表的物件不同:
this:本身呼叫者這個物件
super:代表父類物件的應用
前提:
this:沒有繼承也可以使用
super:只能在繼承條件下才可以使用
構造方法:
this():本類的構造
super():父類的構造
方法重寫
-
物件能執行那些方法主要看左邊 和右邊的關係不大
-
重寫都是方法的重寫
-
靜態方法和非靜態方法不一樣
-
重寫的關鍵就是 public和static
重寫:需要有繼承關係,子類重寫父類的方法!
1.方法名必須相同
2.引數列表必須相同
3.修飾符:範圍可以擴大
4.丟擲的異常:範圍 可以被縮小 但是不能被擴大
重寫,子類的方法和父類一致 方法體不同
為什麼要重寫:
1.父類的功能,子類不一定需要或者不一定滿足
多型
- instanceof 判斷一個例項是否屬於某個類
- 子類物件轉父類物件可以直接轉
- 父類物件轉子類物件需要強制型別轉換
- 方便方法的呼叫 減少重複的程式碼
注意事項:
1.多型是方法的多型
2.父類和子類,有聯絡 型別轉換異常 classcastException
3.存在條件: 繼承關係 方法需要重寫 父類引用指向子類物件!
Father f1=new Son();
無法多型的:
1.static 方法,屬於類,他不屬於例項
2.final 常量;
3.private方法
多型是什麼:
即同一方法可以根據傳送物件的不通而採用不同的行為方式
static關鍵字
用法:
package base.lei;
public class student {
private static String name;
private int age;
public static void main(String[] args) {
student s1=new student();
System.out.println(s1.age);
System.out.println(s1.name);
System.out.println(student.name);
System.out.println(name);
}
}
靜態程式碼快:
static{
}
匿名程式碼快:
{
}
靜態匯入包
import static java.lang.Math.random
抽象類
public abstract void Action{
public abstract void dosomething(){
}
}
- abstract用在方法上邊是隻有方法的名字,沒有方法的實現,他的子類必須重寫父類的方法 除非子類也是abstract
- 抽象類不能new 只能通過子類來約束
- 抽象方法必須在抽象類中 抽象類可以實現普通方法
介面-interface
- 只有規範!自己無法寫方法~專業的約束 約束和實現分離 介面就是規範 定義的就是一組規則
- 介面中的所有定義都是抽象的 public abstract
- 介面中所有定義的屬性都是靜態常量 public static final
implements
實現了介面的類,就需要重寫介面,可以用java實現多繼承
public interface userimp implements user{
alt+回車
}
作用:
1.約束
2.定義一些方法,讓不同的人實現
3.public abstract
4.public static final
5.介面不能被是例項化~,介面中沒有構造方法~
6.implements可以實現多個介面
7.必須要重寫介面中的方法
內部類
- 在一個類裡面再寫一個類就是內部類
- 內部類可以獲得外部類的方法以及私有屬性私有方法!!!
- 一個java類中可以有多個class類 但是隻能有一個public class
- 直接new就是匿名物件
異常機制
Exception
需要掌握的三種異常:
- 檢查性異常:最具代表的檢查異常就是使用者錯誤或者問題引起的異常,這是程式設計師無法預見的 例如要開啟一個不存在的檔案,異常發生且編譯時不能被忽略
- 執行時異常:執行時異常是可能被程式設計師忽略的異常
- 錯誤ERROR:錯誤不是異常,而是脫離程式設計師控制的問題,錯誤在程式碼中通常被忽略。例如 棧溢位時一個錯誤就發生了,他們在編譯也檢查不到
異常分為 error和exception
- error都是虛擬機器的事 exception是使用者的事
java處理異常的關鍵字
try,catch,finally,throw,throws
try{}catch{}是必要的 可以不要finally,一般用來做善後工作
catch可以多個
列印棧資訊
e.printStackTrace(System.err);
throw
- 主動丟擲異常
一般在方法中使用
throws
- 假設方法中處理不了異常 那麼把方法網上拋
一般配合try catch然後解決
自定義異常
- 自定義異常用來處理一些小問題
- 只需要繼承繼承Expection類就行