### 構造器
* 僅當系統沒有提供任何構造器時,系統才會提供默認構造器;
* 在構造器中,使用this調用另一個構造器:this\(\)
* 在構造器中,使用super調用父類構造器:super\(\)
### 構造器處理步驟
1. 所有數據域被初始化為默認值\(0、false或null\);
2. 按照類聲明中出現的次序,依次執行所有域初始化語句和初始化塊;
3. 如果構造器第一行調用了第二個構造器,則執行第二個構造器主體;
4. 執行這個構造器主體;
### 更改器方法與訪問器方法
對實例域做出修改的方法被稱為更改器方法(mutator method),僅訪問實例域而不進行修改的方法被稱為訪問器方法(accessor method)
### Class
* 靜態嵌套類
* 內部類
* 局部類:方法內定義的類稱為局部類
* 匿名內部類
* 匿名子類
### 匿名內部類
```
public static void main(String[] args) throws InterruptedException {
new Thread(getTask()).start();
}
private static Runnable getTask(){
return new Runnable() {
@Override
public void run() {
System.err.println("這是匿名內部類");
}
};
}
```
### 抽象類
* 任何包含一個或多個抽象方法的類都必須被聲明為抽象的;
* 抽象類的所有子類,要么實現超類中的所有抽象方法,要么自己也聲明為抽象的;
### 內部類與嵌套類的區別與聯系
* 內部類的方法可以訪問外部類的實例變量
* 當靜態嵌套類的實例不需要知道它屬于外部那個類的實例時,使用靜態嵌套類;否則使用內部類;
* 靜態的嵌套類只能通過對象訪問外層包含類的非靜態成員;也就是說嵌套類不能直接引用包含類的非靜態成員變量;
* 內部類可以訪問外部類的所有成員變量和方法;
* 內部類對象擁有一個對外部類對象的引用\(outer\);
* JavaSE8之前,必須把從局部類訪問的局部變量聲明為final;
### 匿名子類
```
ArrayList<String> list = new ArrayList<String>(100) {
public void add() {
super.add("hello");
}
};
ArrayList<String> list1 = new ArrayList<String>() {
{
add("heel");
}
};
```
### 靜態內部類
* 在內部類不需要訪問外部類對象的時候,應該使用靜態內部類;
* 與常規內部類不同,靜態內部類可以有靜態域和方法;
* 聲明在接口中的內部類自動成為static和public類;
### 類設計技巧
* 一定要保證數據私有;
* 一定要對數據初始化;
* 不是所有的域都需要獨立的域訪問器和域更改器
* 將職責過多的類進行分解
* 類名和方法名要能夠體現它們的職責
* 優先使用不可變的類
### 知識點
* 在將超類轉換為子類之前,應該使用instanceof進行檢查;
* 在調用x.toString\(\)的地方可以用"" + x代替
* instanceof\(如果被檢查對象為null,則結果返回false\)
```
String str = null;
if (str instanceof Object) { // 不產生異常result is false
System.err.println("yes");
}
System.err.println("no");
```
* 內部類不能聲明靜態成員;
```
public class ClassDemo {
public static void main(String[] args) {
System.err.println(ClassDemo.Student.num);
System.err.println(ClassDemo.Teacher.code);
}
class Student {
private final static int num = 10; // ok
// private static int code = 10; // 編譯報錯
}
static class Teacher {
private static int code = 10; // ok
}
}
```
* 雙括號初始化
```
public static void main(String[] args) throws Exception {
init(new ArrayList<String>() {
{
add("luoyoub");
add("robert");
}
});
}
private static void init(List<String> list) {
list.stream().forEach(System.err::println);
}
```
* 一個方法覆蓋另一個方法時可以指定一個更嚴格的返回類型
```
class Student extends Person {
public Student get() {
return (Student) new Object();
}
}
class Person {
public Person get() {
return new Person();
}
}
```
### Object

- java演變
- JDK各個版本的新特性
- JDK1.5新特性
- JDK1.6新特性
- JDK1.7新特性
- JDK1.8新特性
- JAVA基礎
- 面向對象特性
- 多態
- 方法重載
- 方法重寫
- class
- 常量
- 訪問修飾符
- 類加載路徑
- java-equals
- 局部類
- java-hashCode
- Java類初始化順序
- java-clone方法
- JAVA對象實例化的方法
- 基礎部分
- JAVA基礎特性
- JAVA關鍵字
- javabean
- static
- 日期相關
- final
- interface
- 函數式接口
- JAVA異常
- 異常屏蔽
- try-with-resource資源泄露
- JAVA引用
- WeakReference
- SoftReference
- PhantomReference
- 位運算符
- try-with-resource語法糖
- JDK冷知識
- JAVA包裝類
- JAVA基本類型與包裝類
- java.lang.Boolean
- java.lang.Integer
- java.lang.Byte
- java.lang.Short
- java.lang.Long
- java.lang.Float
- java.lang.Double
- java.lang.Character
- 日期相關
- TemporalAdjusters
- String
- 字符串常量池
- String拼接
- String編譯期優化
- StringBuilder&StringBuffer
- intern
- 注解
- java標準注解
- 內置注解
- 元注解
- 自定義注解
- 注解處理器
- JVM注解
- Java8 Annotation新特性
- 反射-Reflective
- Reflection
- Class
- Constructor
- Method
- javabean-property
- MethodHandles
- 泛型
- 類型擦除
- bridge-method
- Accessor&Mutator方法
- enum
- JAVA數組
- finalize方法
- JAR文件
- JAVA高級編程
- CORBA
- JMX
- SPI
- Java SPI使用約定
- ServiceLoader
- 實際應用
- IO
- 工具類
- JDK常用工具類
- Objects
- System
- Optional
- Throwable
- Collections
- Array
- Arrays
- System
- Unsafe
- Number
- ClassLoader
- Runtime
- Object
- Comparator
- VarHandle
- 數據結構
- 棧-Stack
- 隊列(Queue)
- Deque
- PriorityQueue
- BlockingQueue
- SynchronousQueue
- ArrayBlockingQueue
- LinkedBlockingQueue
- PriorityBlockingQueue
- ConcurrentLinkedQueue
- 列表
- 迭代器
- KV鍵值對數據類型
- HashMap
- TreeMap
- Hash沖突
- ConcurrentHashMap
- JDK1.7 ConcurrentHashMap結構
- jdk7&jdk8區別
- 集合
- Vector
- Stack
- HashSet
- TreeSet
- ArrayList
- LinkedList
- ArrayList && LinkedList相互轉換
- 線程安全的集合類
- 集合類遍歷性能
- 并發容器
- CopyOnWriteArrayList
- ConcurrentHashMap
- 同步容器
- BitMap
- BloomFilter
- SkipList
- 設計模式
- 設計模式六大原則
- 單例模式
- 代理模式
- 靜態代理
- 動態代理
- JDK動態代理
- cglib動態代理
- spring aop
- 策略模式
- SpringAOP策略模式的運用
- 生產者消費者模式
- 迭代器模式
- 函數式編程
- 方法引用
- 性能問題
- Lambda
- Lambda類型檢查
- Stream
- findFirst和findAny
- reduce
- 原始類型流特化
- 無限流
- 收集器
- 并行流
- AOP
- 靜態織入
- aspect
- aspect的定義
- AspectJ與SpringAOP
- 動態織入
- 靜態代理
- 動態代理
- JDK動態代理
- CGLib動態代理
- Spring AOP
- SpringAOP五種通知類型
- @Before
- @AfterReturning
- @AfterThrowing
- @After
- @Around
- Aspect優先級
- SpringAOP切點表達式
- within
- execution
- 嵌套調用
- 系統優化與重構
- 重疊構造器模式
- 工具類構造器優化
- 常見面試題
- new Object()到底占用幾個字節
- 訪問修飾符
- cloneable接口實現原理
- 異常分類以及處理機制
- wait和sleep的區別
- 數組在內存中如何分配
- 類加載為什么要使用雙親委派模式,有沒有什么場景是打破了這個模式
- 類的實例化順序
- 附錄
- JAVA術語
- FAQ
- 墨菲定律
- 康威定律
- 軟件設計原則
- 阿姆達爾定律
- 字節碼工具
- OSGI