Java 提升篇(一)

面向對象的三個特性:java

  • 封裝
  • 繼承
  • 多態

三大特性之封裝

封裝,隱藏了類的內部實現機制,能夠在不影響使用的狀況下改變類的內部結構,同時也保護了數據。對外界而言,它的內部細節是隱藏的,暴露給外界的只是它的訪問方法。編程

對於封裝而言,一個對象所封裝的是本身的屬性和方法,因此不須要依賴其餘對象就能夠完成本身的操做。 三大好處:函數

  • 良好的封裝能下降耦合
  • 類內部的結構能夠自由修改
  • 能夠對成員進行精確的控制
  • 隱藏信息,實現細節

三大特性之繼承

繼承所描述的是**「is-a」**的關係,若是有兩個對象A和B,若能夠描述爲「A是B」,則能夠表示A繼承B,其中B被繼承者稱之爲父類或者超類,A是繼承者稱之爲子類或者派生類。this

實際上,子類是父類的特殊化,它除了擁有父類的特性外,還擁有本身獨有的特性。同時繼承關係中,子類能夠替代父類,反之不行,例如貓是動物,但不能說動物就是貓。code

使用繼承需注意三句話:orm

  • 子類擁有父類非private的屬性和方法
  • 構造函數,只能被調用(super()),不能被繼承
  • 子類能夠擁有本身的屬性和方法,即子類可對父類進行擴展
  • 子類能夠用本身的方式實現父類的方法

繼承的缺點

  • 父類邊,子類必須變
  • 繼承是一種強耦合關係
  • 繼承破壞了封裝(對於父類而言,它的實現細節對於子類來講徹底透明)

三大特性之多態

多態,指程序中定義的引用變量所指向的具體類型和經過該引用變量發出的方法調用在編程時並不肯定,而是在程序運行期間才肯定。對象

實現多態的三個必要條件:繼承

  • 繼承,在多態中必須存在繼承關係的子類和父類
  • 重寫,子類對父類中某些方法進行從新定義(重寫),在調用這些方法時就會調用子類的方法
  • 向上轉型,在多態中將子類的引用賦給父類對象,只有這樣纔可以具有既能調用父類的方法,又能調用子類的方法

實現多態的形式:接口

  • 繼承,經過重寫(從新定義)父類的同一方法的幾個不一樣子類來體現的
  • 接口,經過實現接口中同一方法的幾個不一樣類體現的

另外,在繼承鏈中對象方法的調用,存在一個優先級: this.show(O) -> super.show(O) -> this.show((super)O) -> super.show((super)O)內存

四捨五入方法

方法一(BigDecimal)

使用BigDecimal,而且採用setScale()方法來設置精確度,同時使用RoundingModel.HALF_UP表示數字舍入法則。

double f = 111231.5473;
BigDecimal b = new BigDecimal(f);
double r = b.setScale(2, RoundingModel.HALF_UP).doubleValue();

方法二(DecimalFormat)

java.text.DecimalFormat df = new java.text.DecimalFormat(" #.00");
df.format(須要格式化的數字);

注: #.00,表示兩位小數 #.0000,表示四位小數

方法三(String.format("%.2f", Object obj))

double d = 3.1415926;
String result = String.format("%.2f", d);

%.2f,%.表示小數點前任意位數, 2表示兩位小數,格式後的結果爲f,表示浮點型

抽象類和接口

抽象類注意點:

  • 抽象類不能實例化,實例化的工做應該由其子類完成,它只須要一個引用便可
  • 抽象方法必須由子類完成
  • 只要包含抽象方法的類,必爲抽象類,不論是否包含其餘方法
  • 抽象類中能夠包含具體的方法,也能夠不包含抽象方法
  • 子類中的抽象方法不能與父類的抽象方法同名
  • abstract不能與final並列修飾同一個類
  • abstract不能與private、static、final或native並列修飾同一方法

接口,自己就不是類,是抽象類的延伸。 接口注意點:

  • 接口中全部方法的訪問權限自動被聲明爲public
  • 接口中只存在public static final類型的成員變量
  • 接口中不存在具體實現的方法
  • 實現接口的非抽象類必需要實現全部接口方法
  • 接口不能實例化,但能夠聲明一個接口變量,該變量必須引用一個實現該接口的類實例
  • 實現多接口時必定要避免方法名的重複

關鍵字static

被static修飾的成員變量和方法是獨立於該類的,不依賴與某個特定的實例對象,也就是被該類的全部實例對象共享。全部實例對象的引用都指向同一個地方,任何一個實例對其的修改都會致使其餘實例的變化。

static變量

static修飾的變量稱之爲靜態變量,沒有用static修飾的成爲成員變量。區別是:

  • 靜態變量,隨着類的加載完成初始化的,內存中僅有一個,且JVM只會爲其分配一次內存,同時類的全部實例對象共享該變量
  • 實例變量,是伴隨着類的實例對象的,沒建立一個實例就會產生一個實例變量,它與該實例同生共死

static方法

static修飾的方法,爲靜態方法,經過類名對其進行直接調用。在類加載時就存在了,不依賴於任何實例對象,因此static方法必須實現,不能是抽象方法abstract

static代碼塊

被static修飾的代碼塊,成爲靜態代碼塊,隨着類的加載一併執行,並且能夠隨意放

static侷限性

  • 只能調用static變量
  • 只能調用static方法
  • 不能以任何形式引用this、super
  • static變量定義時必需要進行初始化,且初始化時間要早於非靜態變量

內部類

將一個類的定義放在另外一個類的定義內部,這就是內部類。

使用內部類的緣由:每一個內部類都能獨立地繼承一個接口的實現,因此不管外圍類是否已經繼承了某個接口的實現,對於內部類都沒有影響。

接口只是解決了部分問題,而內部類使得多重繼承的解決方案變得更加完整。

內部類基礎

當咱們建立一個內部類的時候,它無形中就與外圍類有了一種聯繫,依賴於這種聯繫,它能夠無限制地訪問外圍類的元素。

內部類的分類

java中內部類主要分爲:

  • 成員內部類
  • 局部內部類
  • 匿名內部類
  • 靜態內部類
  1. 成員內部類,最普通的內部類

成員內部類,是外圍類的一個成員,因此它是能夠無限制的訪問外圍類的全部成員屬性和方法,儘管是private,可是外圍類要訪問內部類的成員屬性和方法則須要經過內部類的實例來訪問。

使用注意:

  • 成員內部類中不能存在任何static修飾的變量和方法
  • 成員內部類依附於外圍類的,因此只有先建立了外圍類纔可以建立內部類
  • 推薦使用getXXXX()獲取成員內部類,尤爲是該內部類的構造函數無參數時
  1. 局部內部類

局部內部類,嵌套在方法的做用域內,對於這個類的使用主要是應用與解決比較複雜的問題,想建立一個類來輔助咱們的解決方案,但又不但願這個類是公用的。

  1. 匿名內部類
  • 匿名內部類沒有任何訪問修飾符
  • new 匿名內部類,這個類首先是要存在的
  • 當所在方法的形參須要被匿名內部類使用,那此形參必須爲final
  • 匿名內部類是沒有構造方法的
  1. 靜態內部類

使用static修飾的內部類,稱之爲靜態內部類。靜態內部類與非靜態內部類之間存在一個最大的區別:非靜態內部類在編譯完成後會隱含地保存着一個外圍類的引用,可是靜態內部類沒有。意味着:

  • 靜態內部類的建立,不須要依賴於外圍類
  • 不能使用任何外圍類的非static成員變量和方法
相關文章
相關標籤/搜索