public:保證了方法的訪問權限java
static:保證在類未被實例化的時候就能調用(加載的時機)程序員
void:不須要返回值編程
main:約定俗成的名字數組
String[] args:提供控制檯傳入的參數緩存
代碼塊分爲構造代碼塊和靜態(類)代碼塊、局部代碼塊。多線程
構造代碼塊(初始化塊,方法塊)隨着對象的建立而執行,在每次實例化對象時執行,且加載時機優先於構造函數。能夠在構造代碼塊中初始化成員變量和常量。(常量不賦初值會報錯,JVM不會給他賦初值,可是能夠在構造代碼塊中賦初值。)常量的聲明能夠放在構造代碼塊的後面。app
靜態代碼塊隨類加載而加載,順序上靜態代碼塊優於構造代碼塊,優於構造函數。dom
在類方法/靜態代碼塊中不能使用this,由於static先加載,不可能有對象存在,因此也不可能有對象調用方法。靜態代碼塊中能夠初始化靜態變量和靜態常量。常量的初始化能夠放在靜態構造塊下面。ide
局部代碼塊:在方法中出現。限定變量生命週期,及早釋放,提升內存利用率。函數
順序練習:
在沒有構造函數的狀況下,靜態變量是按照語句順序執行賦值的。
在有構造函數的狀況下,訪問對象的靜態變量,結果必定是構造函數中傳入的值。由於構造函數的順序在最後。
Math.random():返回【0.0,1.0)之間的浮點數。
System.currentTimeMillis():返回當前時間(距1970.01.01 0點的毫秒數)。常常用來計算一個方法的執行時間。
System.arraycopy(Object[] src,int srcPos,Object[] dest,int destPos,int length):從第一個數組的起始位置複製到第二個數組的起始位置,一共複製給定長度個元素。
Date date = new Date(); :返回當前時間的Date()對象。
date.getTime():返回毫秒數
SimpleDateFormat formatter = new SimpleDateFormat(格式);:建立一個格式器。
formatter.format(date);:格式化Date對象,返回一個格式化的字符串。
formatter.parse(dateString); :解析字符串,返回一個符合格式的Date。若是大於等於格式,就不會報錯。若是小於格式,就會報ParseException。
Calendar.getInstance() :返回一個Calendar對象。
calendar.get(字段名);:返回日曆對象對應的字段值。字段名是Calandar類中定義的常量,注意Calandar.MONTH返回的是0-11月份,Calandar.HOUR_OF_DAY返回的是24小時制。
BigDecimal():構造函數的參數能夠是int,字符串,浮點數。BigDecimal能夠對超過16位有效位的數進行精確運算。可是保存浮點數時仍是非精確的,因此建議用字符串保存。
bigDecimal.加減乘除();:devide()若是除以0會報ArithmeticException。
經常使用方法:
自動裝箱是指基本類型能夠直接賦值爲封裝類型。JVM自動完成類型轉換。自動裝箱的過程實際是底層調用量valueOf()這個方法。
自動拆箱指封裝類型能夠直接賦值爲基本類型。
以Integer類爲例,valueOf()方法返回的是包裝類,而底層實現採用了緩存機制。若是這個簡單類型在[-128,127]之間,就會使用IntegerCache的cache數組中的對象進行返回(緩存數組,在[0,255]的下標中存放了每一個對象)。
而Float和Double類的valueOf()方法沒有使用緩存,直接new 了對象。 Integer s = new Integer(9) ;//分配堆內存,地址。Java不推薦,推薦使用自動裝箱的方法。
Integer t = new Integer(9) ;//分配堆內存,地址。 Long u = new Long(9) ;//分配堆內存,地址 // System.out.println(s==u);//Operator '==' cannot be applied to 'java.lang.Integer', 'java.lang.Long' System.out.println(s==t);//false,兩個不一樣地址的比較。 System.out.println(s.equals(t));//true System.out.println(s.equals(9));//true System.out.println(s.equals(new Integer(9)));
Integer a = 9;//相等於Integer a = Integer.valueOf(9); Integer b = 9; System.out.println(a==b);//true,兩個都是cache數組的下標地址 a= 128; b= 128; System.out.println(a==b);//false,超過了緩存範圍,new的新對象
Character c = 128;
Character d = 128;
System.out.println(c==d);//false,超過緩存範圍
Character e = -1;//注意char類的範圍是0~2^16-1。
異常是程序執行過程當中出現的不正常狀況。(開發中的語法錯誤和邏輯錯誤不屬於異常。)
異常分爲:
Exception分爲:運行時異常和檢查時異常。(只有RunTimeException子類,沒有CheckedException子類)。
運行時異常是編譯器不要求強制處理的異常,一般指編程錯誤。有常見的ArithmeticException、ClassCastException(not instanceof時)、IndexOutOfBoundsException、NullPointerException。
編譯器異常是編譯器要求處理的異常,即通常性異常,若是不處理則程序不容許運行。
public class test { public int add(int a,int b) { try { return a+b; }catch(Exception e){ System.out.println("catch語句塊"); }finally { System.out.println("finally語句塊"); } return 0; } public static void main(String[] args) { test t=new test(); System.out.println("和是"+t.add(9, 34));//finally語句塊,和是43 } }
當try塊中有return語句,又有finally塊時,會先把try塊中的return 返回值保存到一個棧中。當finally塊執行完時,再調出這個棧的內容返回。
public class test { public int add(int a,int b) { try { return a+b; }catch(Exception e){ System.out.println("catch語句塊"); }finally { System.out.println("finally語句塊"); a=1; } return 0; } public static void main(String[] args) { test t=new test(); System.out.println("和是"+t.add(9, 34));//finally語句塊 和是43 } }
在finally塊中又對a進行賦值,可是並無影響到棧中的內容,只改變了a的值,返回值沒有變。
若是catch塊中有return語句,finally塊中沒有return語句,狀況也是相似的。
若是finally中也有return語句,最終會返回finally的返回語句。
try-catch塊中,能夠有多個catch塊,可是隻能進入一個catch塊,並列catch塊能夠是同級類型,若是有父類異常應該放在最後。catch塊捕捉的是異常對象。
throws拋出的是異常的類型,拋出異常能夠是多個類型。
throws和throw的區別:
自定義異常須要繼承Exception類,在有異常的方法體中寫throw 異常對象語句,並在這個方法的聲明上標註throws 異常類型。(標註的地方是在參數列表後面)。
自定義異常須要重寫無參構造和有參構造(String 異常信息)。
javac.exe:編譯.java源文件爲.class字節碼文件
java.exe:解釋器,經過java虛擬機來裝載和執行編譯文件(class文件)的。Java解釋器是JVM的一部分。Java解釋器用來解釋執行Java編譯器編譯後的程序。java.exe能夠簡單當作是Java解釋器。
javap.exe 類分析器 javap命令反彙編一個java字節代碼文件, 返回有關可變部分和成員函數的信息
javadoc.exe 是java文檔生成器
形參/局部變量不能用修飾符修飾的緣由:java修飾符分爲兩種,訪問控制修飾符和其餘修飾符。
訪問修飾符是用來供其餘對象/方法調用時用的,可是局部變量只會有方法自己調用,已經設定了訪問權限,因此不須要。
其餘修飾符中,不能修飾變量的修飾符有abstract(方法和類)、synchronized(方法)。
對於static,被static修飾的東西的生命週期是和類一致,而局部變量的聲明週期是和方法一致。
對於final,能夠被final修飾,表示這個值是常量,只能被賦值一次。可是必需要賦初值,由於形參是不會被自動賦初值的。
(Java設定成員變量會被自動賦初值,由於成員變量的使用順序是不肯定的,能夠在方法後被賦值並使用,可是局部變量的執行順序是肯定的(僅在方法體內),因此java爲了不程序員出錯,必須給局部變量賦初值。)
(總結來講,成員變量在程序中歷來沒有手動賦值,程序不會出錯,而final常量和局部變量歷來沒有手動賦值,語法就會報錯,常量能夠在方法塊、構造函數這些類加載時能運行到的地方賦值,局部變量能夠在訪問變量前賦值)
對於transient,是用來在序列化中修飾不須要被序列化的變量,使其不持久化。transient不能用來修飾局部變量,由於它不是成員變量。
對於volatile,是用來在多線程中保證變量的值是最新的值。局部變量不存在可見性問題。
對於形參是引用變量類型,咱們首先知道雖然形參不能改變實參,可是經過能夠修改地址中的對象。形參列表中三個變量都是引用類型。
對於String s,操做是s = s+"t"。對於變量和常量的拼接,返回的是StringBuilder.append()後,new String()的地址,因此改變了形參的值,沒有改變原來的對象(字符串對象是不可變的)。所以實參s沒有發生改變。
對於StringBuffer s1,操做是s1.append("1")。StringBuffer對象是可變的,因此修改的是s1對象。實參s1發生了改變。
對於StringBuffer s2,操做時s2= new StringBuffer("C1");。沒有改變s2對象的值,修改的是形參的地址。因此實參s2沒有改變。
違反了局部變量不能被生命週期爲類的static修飾的道理。
類的初始化順序:
1. 父類靜態代碼塊
2. 子類靜態代碼塊
3. 父類普通代碼塊
4. 父類構造函數
5. 子類普通代碼塊
6. 子類構造函數
Parent x =new Child();是多態中向上轉型的體現,此時x.i是Parent的變量,x能夠調用f()。x.f()是Child的方法,可是方法調用中用到的變量i,首先會查找方法的局部變量,而後是Child的成員變量,最後是Parent的成員變量。所以x.i=20,x.f()顯示30。Child x1 = (Child)x,是向下轉型的體現。x1能夠調用f()和g()。編譯期就會肯定x1的類型是Child,因此x1.i=30,x1.f()也是就近原則,顯示30。因此最終結果是20 30 20 20。
若是改成Parent x1 = (Child)x;儘管此時也完成了向下轉型,可是又向上轉爲Parent。此時x1沒有g()方法,最後結果是20 30 20 30。
類方法中不可使用this,由於類方法加載的時期中沒有對象存在;類方法中能夠調用本類和其餘類的類方法;類方法中能夠建立對象,並調用這個的對象的實例方法。