Java中創(chuàng)建對象的四種方法 收藏Java中創(chuàng)建對象的四種方式
1.用new語句創(chuàng)建對象,這是最常見的創(chuàng)建對象的方法。
2.運用反射手段,調(diào)用java.lang.Class或者java.lang.reflect.Constructor類的newInstance()實例方法。
3.調(diào)用對象的clone()方法。
4.運用反序列化手段,調(diào)用java.io.ObjectInputStream對象的 readObject()方法。
第一種最常見
使用new關鍵字:這是我們最常見的也是最簡單的創(chuàng)建對象的方式,通過這種方式我們還可以調(diào)用任意的夠贊函數(shù)(無參的和有參的)。比如:Student student = new Student();
使用Class類的newInstance方法:我們也可以使用Class類的newInstance方法創(chuàng)建對象,這個newInstance方法調(diào)用無參的構造器創(chuàng)建對象,如:Student student2 = (Student)Class.forName("根路徑.Student").newInstance(); 或者:Student stu = Student.class.newInstance();
使用Constructor類的newInstance方法:本方法和Class類的newInstance方法很像,java.lang.relect.Constructor類里也有一個newInstance方法可以創(chuàng)建對象。我們可以通過這個newInstance方法調(diào)用有參數(shù)的和私有的構造函數(shù)。如: Constructor<Student> constructor = Student.class.getInstance(); Student stu = constructor.newInstance(); 這兩種newInstance的方法就是大家所說的反射,事實上Class的newInstance方法內(nèi)部調(diào)用Constructor的newInstance方法。這也是眾多框架Spring、Hibernate、Struts等使用后者的原因。
使用Clone的方法:無論何時我們調(diào)用一個對象的clone方法,JVM就會創(chuàng)建一個新的對象,將前面的對象的內(nèi)容全部拷貝進去,用clone方法創(chuàng)建對象并不會調(diào)用任何構造函數(shù)。要使用clone方法,我們必須先實現(xiàn)Cloneable接口并實現(xiàn)其定義的clone方法。如:Student stu2 = <Student>stu.clone();這也是原型模式的應用。
使用反序列化:當我們序列化和反序列化一個對象,JVM會給我們創(chuàng)建一個單獨的對象,在反序列化時,JVM創(chuàng)建對象并不會調(diào)用任何構造函數(shù)。為了反序列化一個對象,我們需要讓我們的類實現(xiàn)Serializable接口。如:ObjectInputStream in = new ObjectInputStream (new FileInputStream("data.obj")); Student stu3 = (Student)in.readObject();
我大一的時候?qū)W過一學期的C,時間有點久了只能記住一點點。印象最深刻的就是開頭那個include。。.
說回來Java和C其實代碼風格是很相似的。什么面向過程什么面向?qū)ο?,說起來很繞,甚至我剛工作時還是很迷糊,但是工作一段時間就能明白了。
java中的對象可以理解為數(shù)據(jù)存儲對象,比如說數(shù)據(jù)庫里有個person表,對應的實體類一定要有一個person類,這個類里一般會有一些簡單屬性name,sex之類的。這些是每一個person都會有的,書上往往都會說“把大千世界看成一個個的對象”,這樣太繞你讀不懂就理解為數(shù)據(jù)庫person的每行都有name,sex字段。
至于方法,就是為person編寫的業(yè)務程序。你的代碼需要person有一個聽的功能,你就定義一個 void say(),如果這個person什么都不用做,那就沒有方法。
在學習反射機制時,總結一下獲得類對象方式:
第一種方式:通過類本身來獲得對象
Java代碼
Class classname =
this
.getClass();
第二種方式:通過子類的實例獲取父類對象
Java代碼
ClassName cn =
new
ClassName();
UserClass = cn.getClass();
Class SubUserClass = UserClass.getSuperclass();
第三種方式:通過類名加.class獲取對象
Java代碼
Class ForClass = **.**.ClassName.
class
;(類在包中的路徑加.
class
)
第四種方式:通過類名的字符串獲取對象
Java代碼
Class ForName = Class.forName(
"**.**.ClassName"
);
類是對一類事物的描述。如“人”就是一個類,一個類又有很多屬性和方法,如“人”有“名字”,“性別”“年齡”等屬性,有“行走”,“說話”等方法。說簡單點就是屬性描述一個類是什么樣的,而方法描述一個類能干什么。我們說創(chuàng)建一個類,就是寫一個Java類,如
class Person{//類
String name;。.//屬性
public void run(){..}//方法
}
而對象是類的一個實例,如“張三”就是“人”這個類的一個對象。我們可以通過如下語句來創(chuàng)建“張三”這個對象:Person zhangsan = new Person();這里用到了Person這個類的一個默認構造函數(shù)來創(chuàng)建zhangsan這個對象。至于setXXX,getXXX分別用來設置和獲取屬性XXX的值。
Object是所有類的父類,任何類都默認繼承Object。Object類到底實現(xiàn)了哪些方法?
1.clone方法
保護方法,實現(xiàn)對象的淺復制,只有實現(xiàn)了Cloneable接口才可以調(diào)用該方法,否則拋出異常。
2.getClass方法
final方法,獲得運行時類型。
3.toString方法
該方法用得比較多,一般子類都有覆蓋。
4.finalize方法
該方法用于釋放資源。因為無法確定該方法什么時候被調(diào)用,很少使用。
5.equals方法
該方法是非常重要的一個方法。一般equals和==是不一樣的,但是在Object中兩者是一樣的。子類一般都要重寫這個方法。
6.hashCode方法
該方法用于哈希查找,重寫了equals方法一般都要重寫hashCode方法。這個方法在一些具有哈希功能的Collection中用到。
一般必須滿足obj1.equals(obj2)==true??梢酝瞥鰋bj1.hash-
Code()==obj2.hashCode(),但是hashCode相等不一定就滿足equals。不過為了提高效率,應該盡量使上面兩個條件接近等價。
7.wait方法
wait方法就是使當前線程等待該對象的鎖,當前線程必須是該對象的擁有者,也就是具有該對象的鎖。wait()方法一直等待,直到獲得鎖或者被中斷。wait(long
timeout)設定一個超時間隔,如果在規(guī)定時間內(nèi)沒有獲得鎖就返回。
調(diào)用該方法后當前線程進入睡眠狀態(tài),直到以下事件發(fā)生。
(1)其他線程調(diào)用了該對象的notify方法。
(2)其他線程調(diào)用了該對象的notifyAll方法。
(3)其他線程調(diào)用了interrupt中斷該線程。
(4)時間間隔到了。
此時該線程就可以被調(diào)度了,如果是被中斷的話就拋出一個InterruptedException異常。
8.notify方法
該方法喚醒在該對象上等待的某個線程。
9.notifyAll方法
該方法喚醒在該對象上等待的所有線程。
Java中創(chuàng)建對象的四種方式 1.用new語句創(chuàng)建對象,這是最常見的創(chuàng)建對象的方法。
2.運用反射手段,調(diào)用java.lang.Class或者java.lang.reflect.Constructor類的newInstance()實例方法。 3.調(diào)用對象的clone()方法。
4.運用反序列化手段,調(diào)用java.io.ObjectInputStream對象的 readObject()方法。下面演示了用前面3種方式創(chuàng)建對象的過程:public class Customer implements Cloneable{ private String name; private int age; public Customer(){ this("unknown",0); System.out.println("call default constructor"); } public Customer(String name,int age){ this.name=name; this.age=age; System.out.println("call second constructor"); } public Object clone()throws { return super.clone(); } public boolean equals(Object o){ if(this==o)return true; if(! (o instanceof Customer)) return false; final Customer other=(Customer)o; if(this.name.equals(other.name) && this.age==other.age) return true; else return false; } public String toString(){ return "name="+name+",age="+age; } public static void main(String args[])throws Exception{//運用反射手段創(chuàng)建Customer對象 Class objClass=Class.forName("Customer"); Customer c1=(Customer)objClass.newInstance(); //會調(diào)用Customer類的默認構造方法 System.out.println("c1: "+c1); //打印name=unknown,age=0//用new語句創(chuàng)建Customer對象 Customer c2=new Customer("Tom",20); System.out.println("c2: "+c2); //打印name=tom,age=20//運用克隆手段創(chuàng)建Customer對象 Customer c3=(Customer)c2.clone(); //不會調(diào)用Customer類的構造方法 System.out.println("c2==c3 : "+(c2==c3)); //打印false System.out.println("c2.equals(c3) : "+c2.equals(c3)); //打印true System.out.println("c3: "+c3); //打印name=tom,age=20 } } 除了以上4種顯式地創(chuàng)建對象的方式以外,在程序中還可以隱含地創(chuàng)建對象,包括以下幾種情況:1.對于java命令中的每個命令行參數(shù),Java虛擬機都會創(chuàng)建相應的String對象,并把它們組織到一個String數(shù)組中,再把該數(shù)組作為參數(shù)傳給程序入口main(String args[])方法。
2.程序代碼中的String類型的直接數(shù)對應一個String對象。3.字符串操作符“+”的運算結果為一個新的String對象。
4.當Java虛擬機加載一個類時,會隱含地創(chuàng)建描述這個類的Class實例.。
1. new一個對象
new ClassName();
2. 基本同上
Class.forName("className").newInstance();
3. 利用asm和cglib創(chuàng)建對象,不過這個對象在某些情況下有問題,比如做為hibernate對象的時候
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(ClassName);
enhancer.setCallback(NoOp.INSTANCE);
Object obj = enhancer.create();
4.克隆:clone()
聲明:本網(wǎng)站尊重并保護知識產(chǎn)權,根據(jù)《信息網(wǎng)絡傳播權保護條例》,如果我們轉載的作品侵犯了您的權利,請在一個月內(nèi)通知我們,我們會及時刪除。
蜀ICP備2020033479號-4 Copyright ? 2016 學習鳥. 頁面生成時間:2.763秒