標籤:java 基礎
JDK:java開發套件
JRE:java運行時環境
JVM:java虛擬機器
javac Demo01.java—>Demo01.class 位元組碼檔案–>類載入器中–>運行java Demo01
標識符:字母 數字 _ $ 組成,其中數字不能開頭,不能是關鍵字,可以是 中文
類名:首字母大寫
變數名和方法名:駝峰命名法 myName showInfo() addList()
常量名:全部大寫字母組成
包名:小寫組成 網域名稱倒置 com.baidu com.qianfeng
常量:final 資料類型 常量名 = 值; 值不可以改變。
變數:可以改變
資料類型 變數名 = 值;
資料類型:
基礎資料型別 (Elementary Data Type):
整型:byte(1位元組 -128~127 Byte) short(2位元組 -32768~32767 Short) int(4位元組 -2147483648~2147483647 Integer) long(8位元組 0L Long)
浮點型:float(4位元組 Float 0.0f) double(8位元組 Double)
字元型:char(2位元組 Character)
布爾型:boolean (true false Boolen)
引用資料類型:
類 class
數組 array
介面 interface
System.out.println(“int最大值:”+Integer.MAX_VALUE);
System.out.println(“int最大值:”+Integer.MIN_VALUE);
運算子:
1)算術運算子: + - * / % ++ –
int t = a++; (1)t = a (2) a = a+1
int j = ++a; (1) a= a+1 (2)j = a
2)賦值運算子: = += -= *= /= %= 3) 比較子(結果為boolean類型): > < == <= >= !=4)邏輯運算子: &&(邏輯與) ||(邏輯或) !(邏輯非) & | ^異或 a&&b(短路):如果a為false,則結果為false。b將不被判斷 a&b:如果a為false,結果為false。b會進行判斷。a與b都會執行。 a||b(短路):如果a為true,則結果為true。b將不被判斷 a|b:如果a為true,結果為true。b會進行判斷。a與b都會執行。 a^b:相同為false,不同為true。5)條件運算子: 三目運算子 ? : 條件運算式?語句1:語句2; //當運算式為true,結果為語句1,否則為語句26) 字串串連符 +7) 位元運算符: &(按位與) |(按位或) ^(按位異或) ~(按位取反) >>(右移) <<(左移) >>>(無符號右移) byte b = 1 ; //0000 0001 進位:二進位 十進位 八進位 十六進位 符號 二進位 0 1 八進位 0-7 每三位成1位 十進位 0-9 十六進位 0-9 a-f 每四位成一位 進位轉換: 十進位---》二進位 : 除2取餘 10--》1010 二進位 --》十進位 :位權 * 符號^(n-1) (1010)二---->(0*2^0+1*2^1+0*2^2+1*2^3) =10 八進位---》二進位 1)通過十進位轉換 2) 773 八--> 111 111 011 二
Arrays 工具類的使用
常用方法:fill([] , value) sort([]) toString([]) …
方法重載(如果不能構成重載,編譯出錯):在同一個類中,方法名相同,參數列表(個數、類型、順序)不同,與傳回值無關。
JVM記憶體一般分五個地區:
方法區 堆 棧 本地方法區 寄存器
方法區:存類的資訊,常量池,靜態方法區
棧(實值型別):存放調用方法的局部變數
儲存在棧中的變數,範圍結束立即消失
堆(參考型別):存數組或者引用對象
特點:
1 分配記憶體首地址
2 有預設值
3 gc(記憶體回收)
本地方法區:實作類別庫的調用
注意:在常量池中,java預設建立-128-127之間的常量對象 對於字串常量會首先去常量池尋找,如果不存在就建立字串常量實值型別和參考型別參數的區別:兩個數的互換如果參數為實值型別:傳遞的是值的副本,形參不能改變實參的值如果參數類型為參考型別:傳遞的是地址,形參可以改變實參的值
/*
字串常量對象:儲存在字串常量池中
總結:字串儲存在常量池中(不管是之前存在的還是通過 String str = new String(“string”)新建立的)
*/
public static void main(String[] args)
{
String str = “你好”;
String str1 = “你好”;
System.out.println(str==str1); //結果為true
show(str);//將str變數的內容“你好”傳遞給方法 System.out.println(str); //你好//下面這條語句建立了幾個對象?此時只會建立一個對象,因為”你好“已經在常量池中存在 String str3 = new String("你好"); String str4 = str3; str3 = "hi"; //“hi”字串在常量池不存在,則會在常量池中建立一個對象,str3就指向該對象 System.out.println(str4); //你好}static void show(String str){ str = "hello"; //方法中重新賦值}
System.arraycopy(Object src,int srcPos,Object dest,int destPos,int length)
src:源數組
srcPos:從源數組的那個下標開始拷貝
dest:目標數組
destPos:目標數組的複製的位置
length:複製的數組元素的長度
局部變數和全域變數(成員變數)的區別:
局部變數:隨著方法入棧而初始化,方法出棧而消失
沒有預設值,必須聲明後賦值
儲存在棧中
範圍為聲明的位置到它所在的結構結束
成員變數:隨著初始化對象而建立,會隨著對象的回收而消失 有預設值的 儲存在堆中 範圍在整個類中注意:當局部變數和成員變數重名時,局部變數會覆蓋全域變數
class Person
{
//成員變數:全域變數
String name;
int age;
public void say(){
int a = 10; //局部變數
int age = 60; //重名,局部變數覆蓋全域變數
System.out.println(“age=”+age+”,a=”+a);
}
}
封裝:封裝內部細節,讓屬性私人,通過非私人的方法去訪問。
讀:
資料類型 getXXX()
寫:
void setXXX(資料類型 參數)
存取修飾詞:
private:私人的,只有當前類的內部可以訪問
[default]:預設的,可以在同一個包中訪問
protected:受保護的,可以在同一個包中或者不同包的子類中可以訪問
public:公有的,所有類均可以訪問
this:當前對象。當出現局部變數和成員變數重名時需要通過this來訪問成員變數
static關鍵字:
1 靜態成員變數:
特點:
1) 和類同時載入,會在方法區開闢空間,初始化資料
2) 通過類名訪問。 類名.靜態成員變數
3) 通常用於儲存所有類的共用資料
2 靜態成員方法:特點:1)靜態方法中只能訪問靜態成員(不能使用this)2)非靜態方法中可以訪問靜態成員也可以訪問非靜態成員靜態成員變數和非靜態成員變數區別:1)生命週期 靜態成員變數隨著類的載入而載入,在方法區初始化,在程式結束即消失 非靜態成員變數隨著對象的初始化,在堆中建立,在對象被記憶體回收時而消失2)儲存 靜態成員變數通常儲存對象共用的資料 非靜態成員變數是儲存某一個對象的資料3)訪問方式 靜態成員變數通過類名直接存取,也可以通過對象訪問 非靜態成員變數只能通過對象訪問
構造代碼塊:優先於構造方法執行,主要用於初始化成員變數
每次建立對象都會執行
靜態代碼塊:static{},用來初始化靜態成員變數。隨著類的載入而執行,只 執行一次;//靜態代碼塊中不能直接引用非靜態成員
注意:在程式最佳化中,不建議過多的使用static,因為它會長時間保留在記憶體 中
{
//普通代碼塊:範圍
int i= 6;
System.out.println(“i–>”+i);
}//i範圍消失
對象初始化過程:
1 載入類的位元組碼檔案到jvm的方法區中
2 為靜態變數在靜態區開闢記憶體空間,賦初始值
3 載入靜態代碼塊,初始化靜態成員變數
4 開闢堆中空間(成員變數),給成員變數初始化
5 載入構造代碼塊
6 載入構造方法
7 將堆空間的首地址賦值給棧中對象的引用
設計模式:單例
解決問題:一個類在記憶體中只有一個對象
1 構造方法私人化
2 構造方法私人化後,就一個對象都不能建立了,只能有該類自身提供對象
餓漢式:在聲明類引用時執行個體化對象
懶漢式:在擷取類的方法中先判斷該對象是否為空白,如果為空白就執行個體化
3 提供讓外界能夠獲得該對象的方法
懶漢式(線程不安全的)餓漢式(安全執行緒的)
//餓漢式
class Single
{
//構造方法私人化:不能在本類的外部通過new建立對象 private Single(){ } //定義一個本類的對象 private static Single single = new Single(); //向外界提供可訪問的方法,返回當前類的對象 public static Single getInstance(){ return single; }
}
//懶漢式
class Single2
{
private Single2(){}
private static Single2 single ;public static Single2 getInstance(){ if(single == null) single = new Single2(); return single;}
}
當建立子類對象時,會首先調用父類無參的構造方法,然後調用子類相應的構造方法
當子類通過super()顯示調用父類有參構造方法後,建立子類對象時,將 不會調用父類無參的構造方法
super:父類對象
子類對象初始化過程:
1 父類靜態代碼塊
2 子類靜態代碼塊
3 父類構造代碼塊
4 父類構造方法
5 子類構造代碼塊
6 子類構造方法
class Parent
{
private String name;
public int age;
static{
System.out.println(“父類的靜態代碼塊”);
}
{
System.out.println(“父類的構造代碼塊”);
}
Parent(){
System.out.println(“父類的構造方法”);
}
public void say(){
System.out.println(“父類age:”+age);
}
}
class Child extends Parent
{
private int age;
static{
System.out.println(“子類靜態代碼塊”);
}
{
System.out.println(“子類構造代碼塊”);
}
Child(){
System.out.println(“子類構造方法”);
}
public void sayHi(){
super.age = 100;
this.age = 50;
System.out.println(“子類age:”+age);
say();
}
}
this和super:this:代表當前對象。this.成員。 this()本類的構造方法,必須在第一行super:代表父類對象,並不是一個引用,沒有父類的指向(因此super不能作為參數傳遞) 可以通過super.父類成員來訪問父類的成員 也可以通過super()調用父類的構造方法,必須在第一行this()和super()不能同時出現this和super關鍵字不能出現在靜態方法中
子類 對象名 = new 子類();
對象可以調用的方法有:
父類繼承的方法
子類重寫父類的方法
子類新增的方法
父類 對象名 = new 子類();
對象可以調用的方法有:
父類繼承的方法
子類重寫父類的方法
重寫(覆蓋):前提條件 必須繼承
注意:
1 父類的私人方法不能被重寫
2 子類重寫父類的方法時,重寫的方法許可權必須大於等於父類中的方法許可權
3 靜態只能靜態覆蓋–>父類的靜態方法不能重寫
父類:public static void gg(){}
子類中不能重寫gg()這個方法,可以定義自己的gg()方法
4 當父類中的方法有傳回型別時,子類重寫父類方法時,傳回型別可以是父類類型也可以是父類的子類類型
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Java基礎 筆記(1)