java中的int類型固定爲32位java
三個特殊的浮點值:正無窮大(`Double.POSITIVE_INFINITY`),負無窮大(`Double.NEGATIVE_INFINITY`)和NaN(`Double.NaN`)。程序員
在java中,char類型用UTF-16編碼描述一個代碼單元.不建議在程序中使用char類型.編程
boolean類型的false和true並不能於整型相互轉換.**0至關於false,1至關於true在java中並不適合**.數組
java,逐一聲明每個變量能夠提升程序的可讀性 `int i = 0; int j = 0`;安全
整數被0除將會產生一個異常,而浮點數被0除將會獲得無窮大或者NaNjvm
Java中關係運算符和boolean運算符包括: `== != < > <= >= && || !`函數
java中的位運算符包括: `& | ^ ~ << >>`工具
Java中的數值轉換:性能
Java中的數值計算會先將兩個操做數轉換爲同一種類型(自動類型轉換):this
若是要將double轉換成int,就須要使用強制類型轉換.`double x = 0.0D; int y = (int)x`;可是這種方式可能會丟失精度.若是試圖將一個數值從一種類型強制轉換爲另外一種類型,而又超出了目標類型的表示範圍,結果就會被截斷成一個徹底不一樣的值.例如,(byte)300的實際值爲44
BigInteger類實現了任意精度的整數運算,BigDecimal實現了任意精度的浮點數運算.
枚舉類型是變量取值的有限集合.
java沒有內置的字符串類型.
使用.equales()方法來判斷.不要使用==檢測兩個字符串是否相等.==比較的是字符串是否放在同一個位置.
若是虛擬機老是將相同的字符串共享,就可使用`==`來檢測字符串是否相等.可是實際上只有字符串常量是共享的.
空串」「是長度爲0的字符串.
空串是一個Java對象,有本身的串長度(0)和內容(空)
使用 String.Format靜態方法建立能夠格式化的字符串,`String message = String.format("Hello,%s.Next year,you will be %d",name,age);`
使用 `String.format("%1$s %2$tY/%2$tm/%2$td %2$tH:%2$tM:%2$tS","當前時間:",new Date())`能夠格式化當前時間
使用Arrays.sort()方法對數值型數組進行排序.
實現封裝的關鍵在於絕對不能讓類中的方法直接訪問其餘類的實例域(成員變量).程序僅能經過對象的方法與對象數據進行交互.這是提升重用性和可靠性的關鍵.
要想使用OOP,必定要清楚對象的三個主要特性:
對象的行爲:能夠對對象施加哪些操做(方法). 對象的行爲是用可調用的方法定義的.
對象的狀態:當施加那些方法時,對象如何響應 每一個對象都會保存描述當前特徵的信息.這就是對象的狀態.對象的狀態可能會隨着時間的改變而發生改變.但這種改變不會是自發的.必須經過調用方法實現(若是不通過方法調用就能夠改變對象狀態,只能說明封裝性遭到了破壞).
對象的標識:怎樣辨別具備相同行爲與狀態的不一樣對象. 做爲一個類的實例,每一個對象的標識永遠是不一樣的,狀態經常也存在着差別.
識別類的簡單規則是在分析問題的過程當中尋找名詞,而方法則對應着動詞.
類之間的常見關係有:
依賴(uses-a) 若是一個類的方法操做另外一個類的對象,就說一個類依賴於另外一個類(此種關係應該儘量的下降到最低(低耦合)).
聚合(has-a) 若是一個類包含另外一個類的對象.即類A的對象包含類B的對象.
繼承(is-a) 若是類A擴展類B,類A不但包含從類B繼承的方法,還會擁有一些額外的功能.
要想使用對象,就必須首先構造對象,並指定其初始狀態.而後,對對象應用方法.
在Java中,任何對象變量的值都是對存儲在另一個地方的一個對象的引用.new 操做符的返回值也是一個引用.
局部變量不會自動地初始化爲null,必須經過調用new或將他們設置爲null進行初始化.
不要編寫返回引用可變對象的getter方法.
若是須要返回一個可變對象的引用,應該首先對它進行克隆(clone).對象clone是指存放在另外一個位置上的對象副本.(此處說的是返回一個可變對象的引用,而不是說返回對象自己;鏈式編程返回的是對象自己,即this)
用final修飾的成員變量,必須在構建對象時初始化.(定義時,構造方法中).
靜態方法不能向對象實施操做.換句話說,靜態方法沒有隱式的參數.靜態方法只能調用靜態參數和靜態方法.
當沒法命令構造器或者想改變所構造的對象類型時,能夠考慮使用工廠方法.
Java老是採用按值調用.方法獲得的是全部參數值的一個拷貝,特別是,方法不能修改傳遞給它的任何參數變量的內容.
對於基本數據類型來講,原來的參數值是多少,通過方法處理後,原來的參數值仍是多少.
double percent = 10; harry.raiseSalary(percent); System.out.print(percent); // 10
對於對象引用的參數來講,能夠經過調用對象的方法來改變對象的狀態.
總結Java中方法參數的使用狀況
一個方法不能修改一個基本數據類型的參數(即數值型和布爾型)
一個方法能夠改變一個對象參數的狀態
一個方法不能讓對象參數引用一個新的對象.
若是多個方法有相同的名字,不一樣的參數,便產生了重載.
成員變量與局部變量的不一樣點:
成員變量若是不在構造方法中進行初始化,那麼則會自動的被賦予初始值.數值0,布爾值爲false,對象引用爲null.
而局部變量則必須明確得進行初始化.
對象由無參的構造方法建立時,對象中的成員變量會被設置爲適當的默認值.
使用`this(...)`在構造方法中調用另外一個構造方法.
類中的`{...}`代碼塊在構造類的對象時,就會被調用.`static {...}`靜態代碼塊在ClassLoader的時候就會被調用. 若是不對變量進行初始化操做,也會被設置爲默認值.
實際應用中,不要使用finalize方法回收任何短缺的資源,由於很難知道這個方法在何時才調用(jvm本身調用).
類設計技巧
必定要保證數據私有
必定要對數據初始化
不要在類種使用過多的基本類型
不是全部的成員變量都須要獨立的getter和setter方法
將職責過多的類分解
類名和方法名要可以體現它們的職責
super只是一個指示編譯器調用父類方法的特殊關鍵字;不是一個對象的引用,而this指的是指向對象自己的引用.
在子類中能夠增減成員變量,增長方法或覆蓋父類中的方法,然而絕對不能刪除繼承的任何成員變量和方法.
使用super調用父類的構造方法時必須是子類構造器的第一條語句.(先有父類對象纔有子類對象.)
is-a規則,代表子類的每一個對象也是父類的對象,這個規則能夠用來判斷是否應該設計爲繼承關係.
在Java中,對象變量是多態的.一個父類A既能夠引用一個父類A的對象,也能夠引用一個父類A的任何一個子類的對象.
子類能夠轉化爲父類(向上轉型),但父類不必定可以轉換爲子類(須要強制類型轉換(向下轉型)).由於父類能夠有多個子孫繼承鏈.
final修飾的類代表該類不可被修改(對象不可被修改),不可被繼承.其中的方法都自動的成爲final方法,而成員變量則不會被自動生命成final成員變量.
final修飾的方法則表示該方法不可被子類重寫.
final修飾的成員變量表示構造對象以後就不能改變它們的值了.
將方法或類聲明爲final的主要目的是:確保它們在子類中不會被改變語義.而若是將變量聲明爲final將會提升少量性能(即時編譯器),也能夠提升線程安全性.
java中進行類型轉換的惟一緣由是:在暫時忽視對象的實際類型以後,使用對象的所有功能.
編譯器僅容許變量調用類中存在的方法.
使用抽象類的兩種方式:
在子類中定義部分抽象方法或抽象方法也不定義,這樣子類也必須爲抽象類
定義所有的抽象方法,這樣子類就不是抽象類了
抽象類不能被實例化,可是能夠有構造方法.抽象類能夠建立一個具體子類的對象.
抽象類能夠作爲一個對象變量,其值等於具體子類對象的引用.
抽象類中也能夠定義具體的實現方法和變量,而且能夠經過子類對象的引用進行方法的調用.
java的四個訪問修飾符
public
protected
private
默認,無修飾符
編寫完美equals方法的建議:
顯式參數命令爲otherObject,稍後須要將它轉換成另外一個叫作other的變量
檢測this與otherObject是否引用同一個對象:`if (this == otherObject) return true;`
檢測otherObject是否爲null,若是爲null,返回false;`if (otherObject == null ) return false;`
比較this與otherObject是否屬於同一個類.若是equals的語義在每一個子類中都有鎖改變,則會getClass檢測:`if (getClass() != otherObject.getClass()) return false;`;若是全部的子類哦都擁有統一的語義,就使用instanceof檢測:`if(!(otherObject instanceof ClassName)) return false;`
將otherObject轉換爲相應的類類型變量`ClassName other = (ClassName) otherObject`
對比全部的成員變量.若是在子類中從新定義了equals,就要再其中包含調用`super.equals(other)`;
若是從新定義equals方法,就必須從新定義hashCode方法.
hashCode方法應該返回一個整型數值(也能夠是負數)
隨處可見toString方法的主要緣由是:只要對象與一個字符串經過操做符」+」鏈接起來,Java編譯就會自動的調用toString方法,一邊得到這個對象的字符串描述.
ArrayList至關於一個size可變的數組
對象包裝器是不可變的,即一旦構造了包裝器,就不容許更改包裝在其中的值.
泛型類型不能是一個基礎數據類型.只能是包裝類型.
Integer等包裝類作比較的時候也應該用`equals`方法.
比較兩個枚舉類型的值時,永遠不須要調用`equals`,而直接使用`==`就能夠了.
反射的功能:
在運行中分析類的能力
在運行中查看對象,例如,編寫一個toString方法供全部類使用.
實現通用的數組操做代碼.
利用Method對象,這個對象很像C++的函數指針.
使用反射的主要人員應該是工具構造者,而不是應用程序員.
Class類在程序運行期間,Java運行時系統始終未全部的對象維護一個被稱爲運行時的類型標識.這個信息跟蹤着每一個對象所屬的類.虛擬機利用運行時類型信息選擇相應的方法執行
能夠經過`對象變量.getClass()`來獲取Class對象.也能夠經過`Class.forName("xxxx")`來獲取對應類名的Class對象
一個Class對象實際上表示的是一個類型,而這個類型未必必定是一種類.例如基本數據類型int不是類,可是int.class是一個Class類型的對象.
使用`==`運算符來實現兩個類對象的比較操做
`newInstance()`方法用來調用默認的構造器初始化新建立的對象.若是這個類沒有默認的構造器,則拋出一個異常.
繼承設計的技巧
將公共操做和成員變量放在父類中.
不要使用受保護的成員變量.緣由有一個,一個是子類集合是無限制的.任何一個子類均可以編寫代碼直接訪問protected的成員變量,從而破壞了封裝性.第二個緣由是在Java中,在同一個包中的全部類均可以訪問protected的成員變量,而無論它是否爲這個類的子類. 不過,protected方法對於指示那些不提供通常用途而應在子類中從新定義的方法頗有用
使用繼承實現」is-a」關係
除非全部繼承的方法都有意義,不然不要使用繼承.
在覆蓋方法時,不要改變預期的行爲. 編譯器不會檢查從新定義的方法是否有意義.
使用多態,而非類型信息.
若是action1與action2表示的相同的概念.就應該爲這個概念定義一個方法,並將其放置在兩個類的父類或者接口中.而後就能夠調用x.action();
不要過多的使用反射.