int
存儲要求:4byte 取值範圍:-2147483648 -- 2147483647(超過20億)java
short
存儲要求:2byte 取值範圍:-32768 -- 32767面試
long
存儲要求:8byte 取值範圍:-9223372036854775808 -- 9223372036854775807sql
byte
存儲要求:1byte 取值範圍:-128 -- 127
java沒有任何無符號類型(unsigned) segmentfault
float
存儲要求:4byte 取值範圍:大約+-3.40282347E+38F(有效位數爲6~7位)數組
double
存儲要求:8byte 取值範圍:大約+-1.79769313486231570E+308(有效位數爲15位)this
double
類型的精度是float
的兩倍spa
float
類型的數值有一個後綴F(如3.14F),沒有後綴的浮點數值(如3.14)默認爲double
類型。固然也能夠在浮點數值後添加後綴D表示double
類型code
char
用於表示單個字符,一般用來表示字符常量對象
值true,false,用來斷定邏輯條件。 整型值和布爾值之間不能進行轉換 繼承
變量名必須是一個以字母開頭的由字母或數字構成的序列,可是+
,@
這樣的符號不能出如今變量名中,空格
也不行。變量名的長度沒有限制。另外,不能將變量命名爲java的保留字。能夠在一行中聲明多個變量,如int i,j
;
聲明一個變量後,必須用賦值語句對變量進行顯式初始化
,千萬不要使用未被初始化的變量,如
int a; System.out.println(a);//ERROR--variable not initialized
利用關鍵字final
表示,這個變量只能被賦值一次
,一旦被賦值,就不能再更改了。習慣上,常量名使用全大寫。
類常量用關鍵字static final
表示
算是運算符+
,-
,*
,/
分別表示加,減,乘,除。當參與/
的兩個數都是整數時,表示整數除法,不然表示浮點除法。%
表示求餘操做。
x+=4; x=x+4;
二者等價。
實心箭頭
表示無信息丟失的轉換,虛線箭頭
表示可能有精度損失的轉換。
若是試圖將一個數值從一種類型強制轉換爲另外一種類型,而又超過了目標類型的取值範圍,結果會截斷成一個徹底不一樣的值
將一個字符串與一個非字符串的值進行拼接(+
)時,後者會被轉換成字符串,由於任何一個java對象均可以轉換成字符串.
塊
是由一對花括號括起來的若干簡單的java語句,塊肯定了變量的做用域,一個塊能夠嵌套到另外一個塊中。
public static void main(String[] args) { int n; ... { int k; ... }//變量k的做用域到這裏爲止 }
可是,不能在嵌套的兩個塊中聲明相同名字的變量
public static void main(String[] args) { int n; ... { int n; int k; ... }//這裏不能再定義變量n了 }
在循環中,檢測兩個浮點數是否相等須要當心
for(double x=0;x!=10;x+=0.1)...
在for語句中聲明的變量,做用域是for循環的整個循環體
for(int i=0;i<10;i++){ ... }//i的做用域到此爲止
若是想在循環體外使用i
,就要確保i
在循環語句的前面且在外部聲明過
int i; for(i=0;i<10;i++){ ... } //循環體外面還可使用i
能夠在各自獨立的不一樣for循環中定義同名變量
for(int i=0;i<10;i++){ ... } ... for(int i=10;i<20;i++){ ... }
switch(choice){ case 1: ... break; ... default: ... break; }
case
標籤能夠是
類型爲char
,byte
,short
或int
,以及它們包裝類
的常量表達式
枚舉常量
字符串字面量(從java7開始),如
switch(inputString){ case "yes": ... break; ... }
若是基本的整數和浮點數精度不能知足要求,可使用java.math包中的BigInteger
,BigDecimal
.這兩個類能夠處理包含任意長度數字序列的數值。BigInteger
實現了任意精度的整數運算,BigDecimal
類實現了任意精度的浮點數運算。
使用靜態的valueOf
方法能夠將普通的數值轉換爲大數值。
BigInteger a=BigInteger.valueOf(100);
大數值間的運算須要使用大數值類中的方法,而不能算術運算符。
聲明數組int[] a;
,實例化int[] a=new int[100];
,這裏建立了一個能夠存儲100個整數的數組,裏面的全部元素都仍是初始化狀態(值爲0)。
對象數組的元素則初始化爲null,表示這些元素還沒存聽任何對象
一旦建立了數組,就不能再改變它的大小(儘管能夠改變每一個數組元素)
數組其餘初始化方式int[] a={1,2,...};
,int[] a=new int[]{1,2,...};
按值調用:方法接收的是調用者提供的值
按引用調用:方法接收的是調用者提供的變量地址
java老是採用按值調用
,也就是說,方法獲得的是全部參數值的一個拷貝,結果就是方法不能修改傳遞給它的任何參數變量。
可是方法參數有兩種類型
1.基本數據類型(int,boolean,...)
2.對象引用對象引用
做爲參數能夠經過調用對象裏的方法改變對象裏的類變量,可是這並不說明java的方法參數是對象引用
public class Employer { String name=null; Employer(String name){ this.name=name; } static void swap(Employer a,Employer b){ Employer temp=a; a=b; b=temp; } void print(){ System.out.println(this.name); } public static void main(String[] args){ Employer employer1=new Employer("aaa"); Employer employer2=new Employer("bbb"); swap(employer1,employer2); employer1.print();//aaa employer2.print();//bbb } }
能夠看到,儘管swap
方法將兩個Emplyer實例交換,但實際上交換的僅僅是兩個對象引用的拷貝.
若是構造器的第一行語句
形如this(...)
,這個構造器將調用同一類的另外一個構造器。
public class TestCons { String name; public TestCons(){ this("default1"); //this.name="default"; } public TestCons(String name){ this.name=name; } public static void main(String[] args){ TestCons testCons=new TestCons(); System.out.println(testCons.name);//default1 } }
在一個類的聲明中,能夠包含多個代碼塊,只要構造類的對象,這些塊就會被執行。
具體參見一道面試題引起的思考:(1),文章說的很詳細。
java有自動的垃圾回收器,不須要人工回收內存,因此java不支持析構器。finalize方法
在垃圾回收器清除對象前調用。實際應用中,不要依賴於使用finalize方法回收任何短缺資源,由於很難知道這個方法何時調用。
若是某個資源須要在使用完畢後馬上被關閉,就須要由人來管理。對象使用完,能夠用close方法
(若是有)完成相應的清理操做。
只能使用(*)導入一個包,而不能使用import java.*或import java.*.*導入以java爲前綴的全部包。
大多數時候,只導入所需的包就能夠了。但發生命名衝突的時候,就須要變成具體的包名。例如java.util
和java.sql
包裏都有Date類
import java.util.*; import java.sql.*; ... Date today;//ERROR!--java.util.Date or java.sql.Date? ...
import static java.lang.System.*; ... out.println("gwegwe");//不用加類名前綴 exit(0);
警告
編譯器在編譯源文件時,不檢查目錄結構。package com.theviper;
,即便源文件沒有在目錄com\theviper
下,也能夠編譯。若是它不依賴於其餘包,就不會出現編譯錯誤。可是最終的程序將沒法運行,由於虛擬機找不到類文件
使用super
調用構造器的語句必須是子類構造器的第一條語句。
若是子類構造器沒有顯式調用超類構造器,則將自動調用超類默認(沒有參數)
的構造器。
若是子類沒有不帶參數的構造器,而且在子類構造器中沒有顯式調用超類的其餘構造器,則編譯器將報錯。super關鍵字
做用
調用超類方法
調用超類構造器
this關鍵字
做用
引用隱式參數(如this.name=name)
調用該類的其餘構造器
在覆蓋一個方法時,子類方法可見性不能低於超類方法
目的:確保它們不會在子類中改變語義。
類變量也能夠被聲明爲final
,可是構造對象後就不容許再改變類變量的值了。
public class Parent { final String name="aaa"; void setName(String name){ this.name=name; } public static void main(String[] args){ Parent parent=new Parent(); parent.setName("bbb");//The final field Parent.name cannot be assigned } }
可是若是將一個類聲明爲final,後面能夠改變類變量的值了。
public final class Parent { String name="aaa"; public static void main(String[] args){ Parent parent=new Parent(); parent.name="bbb"; System.out.println(parent.name);//bbb } }
類即便不含抽象方法,也能夠聲明爲抽象類
抽象類不能被實例化,但能夠建立抽象類的具體子類對象
能夠定義抽象類的對象變量
,但只能引用非抽象子類
的對象。
AbstractClass a=new AbstractConcrete();
private:僅對本類可見
public:對全部類可見
protected:對本包和全部子類可見
默認(不須要修飾符):對本包可見