一直都有聽說這本書,朋友也都建議去認真看一看,可每次看到那麼厚的一本書,就又隨手丟到了一邊。一轉眼就來到了2018年,兜兜轉轉又撿起了這本書,想要突破現狀,唯有一睹。。。
初讀此書,或有所獲。趁着這段假期,計劃好好的閱讀一下,順便在此留下自己的一些感悟和總結,記錄是一個好的習慣,它會記錄我們的生活,成爲人生的一個印記!對於書中的內容我不會總結的很詳細,只是對一些自己之前不是很熟悉或者很重要的內容做一下總結。
初讀,略有所獲
java.lang 是一個特定類,它會自動被導入到每一個java文件中。
equals()方法:如果在自己編寫的類中,使用equals()方法對類進行比較時,需要使這個類覆蓋equals()方法;
否則,equals()方法默認比較的是對象的引用。
java解釋器運行過程:
- 找出環境變量CLASSPAT
- CLASSPAT用作查找.class文件的根目錄
- 解釋器獲取包的名稱並將每個句點替換成反斜槓,以從CLASSPAT根中產生一個路徑名稱(例如:package foo.bar.baz變成foo\bar\baz或foo/bar/baz或其他,這一切取決於操作系統)
- 得到的路徑會與CLASSPAT中各個不同的項進行連接,解釋器就在這些目錄中查找與你所要創建的類名稱相關的.class文件
訪問權限控制:
訪問控制符 同一個類 同一個包 不同包中的子類 不同包中的非子類 public(公共的) true true true true protected(受保護的) true true true \ 無訪問控制符(默認的) true true \ \ private(私有的) true \ \ \
多態
作用:消除類型之間的耦合關係
java中的所有方法都是通過動態綁定實現多態的,static方法和final方法(private方法屬於final方法)除外,只有普通方法的調用纔可以是多態的。構造器並不具有多態性(它們實際上是static方法,只不過該static聲明是隱式的)。
class StaticSuper{
public static String staticGet(){
return "Base staticGet()";
}
public String dynamicGet(){
return "Base dynamicGet()";
}
}
class StaticSub extends StaticSuper{
public static String staticGet(){
return "Derived staticGet()";
}
public String dynamicGet(){
return "Derived dynamicGet()";
}
}
public class StaticPolymorphism{
public static void mian(String[] args){
StaticSuper sup = new StaticSub();
System.out.println(sup.staticGet());
System.out.println(sup.dynamicGet());
}
}
答案:
Base staticGet()
Derived dynamicGet()
複雜對象調用構造器的順序:
- 調用基類構造器。這個步驟會不斷地反覆遞歸下去,首先是構造這種層次的根,然後是下一層導出類,等等,直到最底層的導出類;
- 按聲明順序調用成員的初始化方法;
- 調用導出類構造器的主體。
class Meal{
Meal(){
print("Meal()");
}
}
class Bread{
Bread(){
print("Bread()");
}
}
class Cheese{
Cheese(){
print("Cheese()");
}
}
class Lettuce{
Lettuce(){
print("Lettuce()");
}
}
class Lunch extends Meal{
Lunch(){
print("Lunch()");
}
}
class PortableLunch extends Lunch{
PortableLunch(){
print("PortableLunch()");
}
}
public class Sandwich extends PortableLunch{
priate Bread b = new Bread();
priate Cheese b = new Cheese();
priate Lettuce b = new Lettuce();
public Sandwich(){
print("Sandwich()");
}
public static void main(String[] args){
new Sandwich();
}
}
答案:
Meal()
Lunch()
PortableLunch()
Bread()
Cheese()
Lettuce()
Sandwich()
享元設計模式
- 核心概念:若一個系統裏要多次調用一個創建複雜的對象,那麼就共享一個拷貝的對象,而不必每次都去創建一個新對象。這樣既節省了內存,又減小了JVM的壓力。
- 目的:能夠提高系統的性能。
- 角色:抽象享元—主要用於定義共享對象的業務需求;具體享元—具體的實現;享元工廠—用於創建具體的享元,維護相同的享元對象,維護一個列表。