7.17實習培訓日志-java基礎


總結

今天主要是學習了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 字面量

計算機高級語言用變量管理內存存儲的數據。

變量名實際是一個內存棧的地址

作用域

  1. java用一對大括號作為語句塊范圍,稱為作用域。
  2. 作用域變量不能重復定義。
  3. 離開作用域,變量所分配的內存空間將會別jvm回收。

包裝類

  1. 包裝類中有實用的方法和常量。MIN_VALUE,parseInt。
  2. 包裝類作為集合元素的類型。

補碼

正數是其本身,負數符號位不變,其他位取反,再加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. 符號位自動擴展,負數補1,正數補0。
  2. 整數自動轉換成浮點數可能會損失精度(int->float,long->double,精度丟失)。int->double不會丟失精度。
大類型到小類型轉換[強制轉換]
  1. 注意符號位丟失
int和char類型自動轉換

獲取數據

  1. String[] args獲取數據
  2. Scanner 獲取數據

自增自減自乘自除

  1. i+=n/i-=n/i*=n/i/=n
  2. i++ ++i i-- --i

交換a b值

a = a+b
b = a-b
a = a-b

運算符先后順序

單算移比按邏三賦

  1. 單目運算符(一元運算符,即一個變量):+,-,++,--
  2. 算數運算符:+,-,*,/,%
  3. 移位運算符:<<,>>
  4. 關系運算符:>,<,>=,<=,==,!=
  5. 位運算符:&,|,~,^,
  6. 邏輯運算符:&&,||
  7. 三目運算符:表達式1?表達式2:表達式3;
  8. 賦值運算符:=等
System.out.println(1+1<<1);//4

短路運算

&& ||

長路運算

&``|

java中int和boolean不自動轉換,不能在該用true/false時用int數值。

數組

  1. 動態初始化
  2. 靜態初始化(int a[] = {2,3,4})

字符串

  1. 使用時直接賦值更好
  2. 字符串內容不可改變

String為字符串常量,而StringBuilder和StringBuffer均為字符串變量

運行速度快慢為:StringBuilder > StringBuffer > String

StringBuilder:線程不安全

StringBuffer:線程安全

java面向對象

方法與類

方法重載

重載:方法名稱相同,參數類型和個數不同。

封裝繼承多態

匿名對象:回收機制

引用傳遞

值傳遞是指在調用函數時將實際參數復制一份傳遞到函數中,這樣在函數中如果對參數進行修改,將不會影響到實際參數。
引用傳遞是指在調用函數時將實際參數的地址傳遞到函數中,那么在函數中對參數所進行的修改,將影響到實際參數。

String說:其值不可變,引用可變

Java中只有按值傳遞,沒有按引用傳遞!

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關鍵字

  1. 表示類中屬性和調用方法
  2. 調用本類中構造方法
  3. 表示當前對象

this()和super()都指的是對象,均不可以在static環境中使用。
從本質上講,this是一個指向本對象的指針, 然而super是一個Java關鍵字。

static關鍵字

static塊可以用來優化程序性能,只會在類加載的時候執行一次。

static關鍵字不會影響到變量或者方法的作用域。

final關鍵字

  1. 修飾變量(基本數據類型:值不可更改,引用數據類型:指向不可更改)
  2. 修飾方法(方法不可被子類覆蓋,重寫)
  3. 修飾類(類不可被繼承)
  4. 類的private方法會隱式地被指定為final方法。

重寫

定義:方法名稱相同,返回值類型相同,參數相同。

重寫限制:被子類重寫的方法不能比父類方法有更嚴格的訪問權限。

多態

三大要素:

  1. 繼承
  2. 重寫
  3. 父類引用指向子類對象

多態的弊端:不能使用子類特有的成員屬性和子類特有的成員方法。

靜態方法,靜態和類相關,算不上重寫,所以會訪問父類靜態方法,而不是子類靜態方法。

泛型

注意事項:

  1. 泛型的類型參數只能是類類型,不能是簡單類型。
  2. 不能對確切的泛型類型使用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>聲明是一個泛型方法。

靜態方法無法訪問類上定義的泛型,需要把方法聲明在方法上。

泛型上下邊界

  1. 上邊界,傳入的類型實參必須是指定類型的子類型
  2. 下邊界,傳入的類型實參必須是指定類型的父類型
  3. 泛型的上下邊界添加,必須與泛型的聲明在一起
<? 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

java 泛型詳解

軟件設計模式

  1. 工廠模式
  2. 抽象工廠模式
  3. 單例模式
  4. 裝飾器模式
  5. mvc模式
  6. 狀態模式
  7. 數據訪問對象模式
  8. 前端控制器模式
  9. 攔截過濾器模式
  10. 傳輸對象模式

單例模式

單例模式最好用枚舉類實現(線程安全,自由序列化,保證單例)

enum類用分號分開枚舉實例后,可以聲明變量或者成員方法。

enum類默認私有構造方法,且只能由編譯器調用。

enum類只能覆蓋toString方法,其他都用final修飾。

java 1.7后switch也對字符串進行了支持。

深入理解Java枚舉類型(enum)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM