### JAVA對象實例化的方法
##### New對象實例
```
// 直接new對象實例
Productor productor = new Productor();
```
_注意:任何類都有構造方法,但是new指令只能創建非抽象類的對象;構造方法不能是靜態的,因為靜態方法不能使用this,而構造方法中可以使用_
##### 反射機制
Java反射機制是在運行狀態中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意方法和屬性;這種動態獲取信息以及動態調用對象方法的功能稱為Java語言的反射機制。
反射機制創建對象分為兩種,一種是Class類的newInstance\(\),另一種是java.lang.reflect.Constructor類的newInstance\(\)。
兩者區別在于:
* Class.newInstance\(\) 只能夠調用無參的構造函數,即默認的構造函數;
* Constructor.newInstance\(\) 可以根據傳入的參數,調用任意構造構造函數。
事實上Class的newInstance方法內部調用Constructor的newInstance方法。
反射機制創建對象,使用的是類加載機制,newInstance\(\)的特點是在調用時才創建對象,通過類加載機制Class.forName\("xxx"\).newInstance\(\)創建對象,xxx可以從配置文件當中獲取實際的值,這樣達到了解耦的目的,也是Spring依賴注入的原理
```
// 1.通過反射調用Java.lang.Class
Productor productor = (Productor) Class.forName("com.quancheng.Productor").newInstance();
Productor productor = Productor.class.newInstance();
// 2.java.lang.reflect.Constructor類的newInstance()實例方法
Constructor<Productor> constructor = Productor.class.getConstructor();
Productor productor = constructor.newInstance();
```
##### clone\(\)方法
clone方法分為淺拷貝和深拷貝
* 淺拷貝:被復制對象的所有變量都含有與原來的對象相同的值,而所有的對其他對象的引用仍然指向原來的對象。
* 深拷貝:不僅要復制對象的所有非引用成員變量值,還要為引用類型的成員變量創建新的實例,并且初始化為形式參數實例值。
淺拷貝的效果就是,對引用對象的操作,會影響到所有引用了該對象的對象
```
public class Object {
// clone方法定義
protected native Object clone() throws CloneNotSupportedException;
}
```
_注意:_
1. _Cloneable只是一個標志,想要使用super.clone\(\),則需要實現Cloneable接口,否則就會拋出CloneNotSupportedException異常;_
2. _clone\(\)實現的是淺復制,在重載clone方法的時候,需要轉為深復制。即屬性存在對象引用的時候,需要對引用屬性再進行clone\(\)復制,直到沒有對象引用;_
```
public class Appliction {
public static void main(String[] args) throws CloneNotSupportedException {
User user = new User();
user.setName("Tom");
user.setAge(20);
user.setWeight(120);
System.err.println(user);
User u = (User) user.clone();
System.err.println(u);
}
}
class User implements Cloneable {
private String name;
private int age;
private Integer weight;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
......
}
```
##### 反序列化
序列化對象就是對象此刻在內存中的狀態轉成的字節碼。通過實現Serializable接口進行序列化。同Cloneable一樣,Serializable也是一個空接口,作為一個標志使用。通過ObjectStream的writeObject\(\)方法和readObject\(\)方法來序列化和反序列化
還有一個Externalizable接口同樣可以實現序列化,Externalizable繼承了Serializable,同時增加了writeExternal\(\)和readExternal\(\)兩個方法,可以指定序列化哪些屬性,對于需要隱藏的屬性,在前面加上transient就可以。
_注意:序列化和反序列化是深復制,static、transient 后的變量無法序列化_
##### Unsafe
使用Unsafe"黑科技"實例化對象
```
public class Appliction {
private static Unsafe U;
public static void main(String[] args) throws InstantiationException {
User user = (User) U.allocateInstance(User.class);
user.setName("Tom");
System.err.println(user.getName());
}
static {
try {
Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
theUnsafe.setAccessible(true);
U = (Unsafe) theUnsafe.get("null");
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
}
}
class User implements Cloneable {
private String name;
private int age;
private Integer weight;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
......
}
```
_注意:使用Unsafe方法實例化對象不會調用對象的構造方法_
- 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