總結
今天主要是學習了java基礎,java面向對象方面的知識,然后下午老師講了軟件的設計模式,今天看了一部分,印象深刻的是單例模式,用枚舉實現單例模式。晚上主要講了maven的一些基礎知識和idea的一些配置修改,編碼修改成utf-8,換行改成'\n'模式,idea的terminal換成git-bash等等,maven package打jar包,生成class文件,maven install 打jar包,放到本地倉庫,生成class文件,maven jar只打jar包等等,dependencies和dependencyManament(統一子模塊版本)區別等。
Java基礎
計算機進制轉換
進制表示
16進制表示:0x或0X前綴
進制轉換
十進制轉二進制:不斷除以2,保留余數,商為0時不再除以2,將所有余數倒序排列。
十進制轉十六進制:不斷除以16,保留余數,商為0時不再除以16,將所有余數倒序排列。
變量與數據類型
數據類型
八種基本數據類型
| 類型 | 占用空間(字節) |
|---|---|
| byte | 1 |
| short | 2 |
| int | 4 |
| long | 8 |
| float | 4 |
| double | 8 |
| char | 2 |
| boolean | 1或4 |
Unicode/GBK/gb2312/gb18030: 中文2字節
UTF-8: 中文3字節
因為Java編譯器默認使用Unicode編碼。所以char在Java中占用2字節。
char a= (char) Integer.MAX_VALUE;
System.out.println((int)a);
char b= (char) Integer.MIN_VALUE;
System.out.println((int)b);
運行結果為65535 0
《Java虛擬機規范》
雖然定義了boolean這種數據類型,但是只對它提供了非常有限的支持。在Java虛擬機中沒有任何供boolean值專用的字節碼指令,Java語言表達式所操作的boolean值,在編譯之后都使用Java虛擬機中的int數據類型來代替,而boolean數組將會被編碼成Java虛擬機的byte數組,每個元素boolean元素占8位
字符編解碼的故事(ASCII,ANSI,Unicode,Utf-8區別)
引用數據類型
對象、數組、接口
JAVA中數組也是對象,基本類型數組是一個由JVM創建的對象,其他數組是類,也是對象。
引用類型:引用類型繼承於Object,都是按照Java里面存儲對象的內存模型來進行數據存儲的,使用Java內存堆和內存棧來進行這種類型的數據存儲,“引用”是存儲在有序的內存棧上的,而對象本身的值存儲在內存堆上的;
基本類型只在棧中
引用類型引用在棧中數據在堆中
自定義數據類型
類就是數據類型,自定義類是一種自定義數據類型
變量
基本概念
字面量是指由字母,數字等構成的字符串或者數值,它只能作為右值出現,所謂右值是指等號右邊的值
int a;//a 變量
final int b = 10;//b 常量 10 字面量
計算機高級語言用變量管理內存存儲的數據。
變量名實際是一個內存棧的地址
作用域
- java用一對大括號作為語句塊范圍,稱為作用域。
- 作用域變量不能重復定義。
- 離開作用域,變量所分配的內存空間將會別jvm回收。
包裝類
- 包裝類中有實用的方法和常量。MIN_VALUE,parseInt。
- 包裝類作為集合元素的類型。
補碼
正數是其本身,負數符號位不變,其他位取反,再加1.
兩數相加,符號位有進位,進位被舍棄。
補碼好處最大好處:變減法為加法。
模
模:某鍾類型數據的總和。
正數加負數=模
整數類型
java默認整數計算結果為int類型
byte a =1,b =2;
byte c = a+b;//compiler error
int d = a+b;//ok
浮點類型
| 類型 | 指數位 | 尾數位 |
|---|---|---|
| float | 8 | 23 |
| double | 11 | 52 |
| int | 0 | 31 |
| long | 0 | 63 |
float[double]存儲數據范圍大於int[long]類型,但精度比int[long]小(int:31位,float:23位)
在做數值運算中,盡量用整數運算,浮點數有誤差。
double d = 2.7;
double result = d-2;
//0.7000000000000002
System.out.println(result);
注意浮點數比較不要用==。
字符類型
ASCII碼對應:1:48,A:65,a:97
轉義符
轉義符:\
\u4e2d表示Unicode碼的'中'
類型轉換
小類型到大類型轉換[自動轉換]
- 符號位自動擴展,負數補1,正數補0。
- 整數自動轉換成浮點數可能會損失精度(int->float,long->double,精度丟失)。int->double不會丟失精度。
大類型到小類型轉換[強制轉換]
- 注意符號位丟失
int和char類型自動轉換
獲取數據
- String[] args獲取數據
- Scanner 獲取數據
自增自減自乘自除
- i+=n/i-=n/i*=n/i/=n
- i++ ++i i-- --i
交換a b值
a = a+b
b = a-b
a = a-b
運算符先后順序
單算移比按邏三賦
- 單目運算符(一元運算符,即一個變量):+,-,++,--
- 算數運算符:+,-,*,/,%
- 移位運算符:<<,>>
- 關系運算符:>,<,>=,<=,==,!=
- 位運算符:
&,|,~,^, - 邏輯運算符:
&&,|| - 三目運算符:表達式1?表達式2:表達式3;
- 賦值運算符:=等
System.out.println(1+1<<1);//4
短路運算
&& ||
長路運算
&``|
java中int和boolean不自動轉換,不能在該用true/false時用int數值。
數組
- 動態初始化
- 靜態初始化(
int a[] = {2,3,4})
字符串
- 使用時直接賦值更好
- 字符串內容不可改變
String為字符串常量,而StringBuilder和StringBuffer均為字符串變量
運行速度快慢為:StringBuilder > StringBuffer > String
StringBuilder:線程不安全
StringBuffer:線程安全
java面向對象
方法與類
方法重載
重載:方法名稱相同,參數類型和個數不同。
封裝繼承多態
匿名對象:回收機制
引用傳遞
值傳遞是指在調用函數時將實際參數復制一份傳遞到函數中,這樣在函數中如果對參數進行修改,將不會影響到實際參數。
引用傳遞是指在調用函數時將實際參數的地址傳遞到函數中,那么在函數中對參數所進行的修改,將影響到實際參數。
String說:其值不可變,引用可變
JAVA中只有值傳遞,基本類型傳遞的是值的副本,引用類型傳遞(不是上面說的引用傳遞)的是引用的副本
值傳遞和引用傳遞(不是引用類型的傳遞)的區別
public static void main(String[] args) {
String str1 = "hello";
change(str1);
System.out.println(str1);
}
static void change(String str2){
str2 = "yes";
}
結果:hello(String 不可改變)
class Ref{
String str = "ref";
}
public class Main {
public static void main(String[] args) {
Ref r = new Ref();
System.out.println(r.str);
r.str="ref1";
System.out.println(r.str);
change(r);
System.out.println(r.str);
}
static void change(Ref r){
r.str="ref2";
}
}
結果為
ref
ref1
ref2
this關鍵字
- 表示類中屬性和調用方法
- 調用本類中構造方法
- 表示當前對象
this()和super()都指的是對象,均不可以在static環境中使用。
從本質上講,this是一個指向本對象的指針, 然而super是一個Java關鍵字。
static關鍵字
static塊可以用來優化程序性能,只會在類加載的時候執行一次。
static關鍵字不會影響到變量或者方法的作用域。
final關鍵字
- 修飾變量(基本數據類型:值不可更改,引用數據類型:指向不可更改)
- 修飾方法(方法不可被子類覆蓋,重寫)
- 修飾類(類不可被繼承)
- 類的private方法會隱式地被指定為final方法。
重寫
定義:方法名稱相同,返回值類型相同,參數相同。
重寫限制:被子類重寫的方法不能比父類方法有更嚴格的訪問權限。
多態
三大要素:
- 繼承
- 重寫
- 父類引用指向子類對象
多態的弊端:不能使用子類特有的成員屬性和子類特有的成員方法。
靜態方法,靜態和類相關,算不上重寫,所以會訪問父類靜態方法,而不是子類靜態方法。
泛型
注意事項:
- 泛型的類型參數只能是類類型,不能是簡單類型。
- 不能對確切的泛型類型使用instanceof操作。
- 泛型類:在實例化類的時候指明泛型的具體類型
- 泛型方法:在調用方法的時候指明泛型的具體類型
Gen<Integer> g = new Gen<>();
System.out.println(g instanceof Gen); // true
System.out.println(g instanceof Gen<Integer>); //compiler error
構造方法使用泛型
public class GenericTest<T> {
public T t;
public GenericTest(T t){
this.t = t;
}
}
設置多個泛型
class Gen<K,T>{
private K k;
private T t;
}
通配符
class Info<T>{
private T value;
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
}
public class GenericTest<T> {
public static void main(String[] args) {
Info<String> i = new Info<>();
i.setValue("value");
tell(i);
}
public static void tell(Info<?> i){
System.out.println(i.getValue());
}
}
泛型接口
抽象類訪問修飾符:public和protected
接口訪問修飾符:public
泛型方法
public <T> T method(T t)
返回值前面的<T>聲明是一個泛型方法。
靜態方法無法訪問類上定義的泛型,需要把方法聲明在方法上。
泛型上下邊界
- 上邊界,傳入的類型實參必須是指定類型的子類型
- 下邊界,傳入的類型實參必須是指定類型的父類型
- 泛型的上下邊界添加,必須與泛型的聲明在一起
<? extends Number>
public int compareMobEntity(Comparator<? super EntityMob> comparator)
泛型數組
不能創建一個確切的泛型類型的數組
List<String>[] ls = new ArrayList<String>[10]; //error
List<?>[] ls = new ArrayList<?>[10]; //ok
List<String>[] ls = new ArrayList[10]; //ok
軟件設計模式
- 工廠模式
- 抽象工廠模式
- 單例模式
- 裝飾器模式
- mvc模式
- 狀態模式
- 數據訪問對象模式
- 前端控制器模式
- 攔截過濾器模式
- 傳輸對象模式
單例模式
單例模式最好用枚舉類實現(線程安全,自由序列化,保證單例)
enum類用分號分開枚舉實例后,可以聲明變量或者成員方法。
enum類默認私有構造方法,且只能由編譯器調用。
enum類只能覆蓋toString方法,其他都用final修飾。
java 1.7后switch也對字符串進行了支持。
