Java中建立(例項化)物件的五種方式
Java中建立(例項化)物件的五種方式
1、用new語句建立物件,這是最常見的建立物件的方法。
2、通過工廠方法返回物件,如:String str = String.valueOf(23);
3、運用反射手段,呼叫java.lang.Class或者java.lang.reflect.Constructor類的newInstance()例項方法。如:Object obj = Class.forName("java.lang.Object").newInstance();
4、呼叫物件的clone()方法。
5、通過I/O流(包括反序列化),如運用反序列化手段,呼叫java.io.ObjectInputStream物件的 readObject()方法。
package org.whb.test.demo724; /* *測試Cloneable介面的使用 *包含第一種和第三種方法clone() *不過要注意在clone()中深複製和潛複製的理解 *例項化物件 */ class Person implements Cloneable{ private String name; private int age; public Person( String name,int age) { this.name = name; this.age = age; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name){ this.name =name; } @Override public Object clone() throws CloneNotSupportedException { // TODO Auto-generated method stub return super.clone(); } @Override public String toString() { // TODO Auto-generated method stub return "姓名是:"+name+"; 年齡是:"+age; } } public class TestClone{ public static void main(String[] args){ Person p1 = new Person("王豪博",25); System.out.println(p1); Person p2 =null; try { p2 = (Person)p1.clone(); } catch (CloneNotSupportedException e) { // TODO Auto-generated catch block e.printStackTrace(); } p2.setName("春香"); p2.setAge(24); System.out.println(p2); } }
/* *通過反射對物件進行初始化 *注意必須有無引數的Constructor *例項化Class類然後呼叫newInstance()方法 * */ package org.whb.test.demo715; class Person{ private int age; private String name; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String toString(){ return "年齡是:"+this.age+" 姓名是:"+this.name; } } public class TestClass { public static void main(String[] args){ Class< ?> c1 = null; try{ c1 = Class.forName("org.whb.test.demo715.Person"); }catch(ClassNotFoundException e){ e.printStackTrace(); } Person p1 = null; try { p1 =(Person)c1.newInstance(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } p1.setAge(12); p1.setName("haobo"); System.out.println(p1); } }
package org.whb.test.demo724;
import java.io.*;
import java.util.Date;
/**
* 物件的序列化和反序列化測試類.
*1、序列化是幹什麼的?
簡單說就是為了儲存在記憶體中的各種物件的狀態(也就是例項變數,不是方法),並且可以把儲存的物件狀態再讀出來。雖然你可以用你自 己的各種各樣的方法來儲存object states,但是Java給你提供一種應該比你自己好的儲存物件狀態的機制,那就是序列化。
*2、什麼情況下需要序列化
a)當你想把的記憶體中的物件狀態儲存到一個檔案中或者資料庫中時候;
b)當你想用套接字在網路上傳送物件的時候;
c)當你想通過RMI傳輸物件的時候;
*
*3、相關注意事項
a)序列化時,只對物件的狀態進行儲存,而不管物件的方法;
b)當一個父類實現序列化,子類自動實現序列化,不需要顯式實現Serializable介面;
c)當一個物件的例項變數引用其他物件,序列化該物件時也把引用物件進行序列化;
d)並非所有的物件都可以序列化,,至於為什麼不可以,有很多原因了,比如:
1.安全方面的原因,比如一個物件擁有private,public等field,對於一個要傳輸的物件,比如寫到檔案,或者進行rmi傳輸 等等,在序列化進行傳輸的過程中,這個物件的private等域是不受保護的。
2. 資源分配方面的原因,比如socket,thread類,如果可以序列化,進行傳輸或者儲存,也無法對他們進行重新的資源分 配,而且,也是沒有必要這樣實現。
*/
public class ObjectSaver {
public static void main(String[] args) throws Exception {
ObjectOutputStream out = new ObjectOutputStream (new FileOutputStream("D:/objectFile.swf"));
//序列化物件
Customer customer = new Customer("haobo", 24);
out.writeObject("你好!");
out.writeObject(new Date());
out.writeObject(customer);
out.writeInt(123); //寫入基本型別資料
out.close();
//反序列化物件
ObjectInputStream in = new ObjectInputStream(new FileInputStream("D:/objectFile.swf"));
System.out.println("obj1=" + (String) in.readObject());
System.out.println("obj2=" + (Date) in.readObject());
Customer obj3 = (Customer) in.readObject();
System.out.println("obj3=" + obj3);
int obj4 = in.readInt();
System.out.println("obj4=" + obj4);
in.close();
}
}
class Customer implements Serializable {
/**
*
*/
private static final long serialVersionUID = -88175599799432325L;
private String name;
private int age;
public Customer(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return "name=" + name + ", age=" + age;
}
}
/*
* obj1=你好!
obj2=Sat Jul 24 21:18:19 CST 2010
obj3=name=haobo, age=24
obj4=123
*/
Java中,類的例項化方法有四種途徑:
1)使用new操作符
2)呼叫Class物件的newInstance()方法
3)呼叫clone()方法,對現有例項的拷貝
4)通過ObjectInputStream的readObject()方法反序列化類
1.ClassInstance.java
1 import java.io.*; 2 3 class ClassInstance implements Cloneable, Serializable { 4 private String str = "測試..."; 5 public void fun(){ 6 System.out.println(str); 7 } 8 public ClassInstance(String str){ 9 System.out.println("有參類的例項化"); 10 this.str += str; 11 } 12 public ClassInstance(){ 13 System.out.println("無參類的例項化"); 14 } 15 public Object clone(){ 16 return this; 17 } 18 }
2.ClassInstanceTest.java
1 import java.io.*; 2 import java.lang.reflect.*; 3 4 public class ClassInstanceTest{ 5 public static void main(String[] args) throws ClassNotFoundException, InstantiationException, 6 IllegalAccessException, IOException,InvocationTargetException, NoSuchMethodException{ 7 //第一種類的例項化方式 8 ClassInstance ci01 = new ClassInstance("01"); 9 ci01.fun(); 10 11 //第二種類的例項化方式 12 ClassInstance ci02 = (ClassInstance) Class.forName("ClassInstance").newInstance(); 13 ci02.fun(); 14 15 //第三種類的例項化方式 16 ClassInstance ci03 = (ClassInstance) ci01.clone(); 17 ci03.fun(); 18 19 //第四種類的例項化方式 20 FileOutputStream fos = new FileOutputStream("ci.tmp"); 21 ObjectOutputStream oos = new ObjectOutputStream(fos); 22 oos.writeObject(ci01); 23 oos.close(); 24 fos.close(); 25 26 FileInputStream fis = new FileInputStream("ci.tmp"); 27 ObjectInputStream ois = new ObjectInputStream(fis); 28 29 ClassInstance ci04 = (ClassInstance) ois.readObject(); 30 ois.close(); 31 fis.close(); 32 33 ci04.fun(); 34 System.out.println("--------------------額外測試--------------------"); 35 ClassInstance ci05 = null; 36 //額外的思考 在第二種類例項化的方式中有沒有一種方法實現有引數的構造方式 37 //獲得類的構造資訊 38 Constructor[] ctor = Class.forName("ClassInstance").getDeclaredConstructors(); 39 //找到我們需要的構造方法 40 for(int i=0;i<ctor.length;i++ ){ 41 Class[] cl = ctor[i].getParameterTypes(); 42 if(cl.length == 1){ 43 //例項化物件 44 ci05 = (ClassInstance) Class.forName("ClassInstance").getConstructor(cl).newInstance(new Object[]{"05"}); 45 } 46 } 47 ci05.fun(); 48 } 49 }
3.輸出結果
1 有參類的例項化 2 測試...01 3 無參類的例項化 4 測試... 5 測試...01 6 測試...01 7 -------------------額外測試-------------------- 8 有參類的例項化 9 測試...05
除了這幾種情況可以例項化一個Java類物件外,隱式呼叫例項化也是利用了已上集中情況。例如常見的方法:
1 public class ClassInstance{ 2 public ClassInstance(){ 3 } 4 public ClassInstance getInstance(){ 5 return new ClassInstance(); 6 } 7 }
通過觀察結果,我們發現無論哪一種方式必須經過的一步---呼叫構造方法。無論怎樣建構函式作為初始化類的意義怎樣都不會改變。
相關推薦
Java中建立(例項化)物件的五種方式
Java中建立(例項化)物件的五種方式1、用new語句建立物件,這是最常見的建立物件的方法。 2、通過工廠方法返回物件,如:String str = String.valueOf(23); 3、運用反射手段,呼叫java.lang.Class或者java.lang.r
Java——建立(例項化)物件的五種方式
Java中建立(例項化)物件的五種方式 用new語句建立物件,這是最常見的建立物件的方法。 通過工廠方法返回物件,如:String str = String.valueOf(23); 運用反射手段,呼叫java.lang.Class或者java.lang.re
Java中建立和啟動執行緒的兩種方式
方式1:繼承Thread類 步驟: 1):定義一個類A繼承於java.lang.Thread類. 2):在A類中覆蓋Thread類中的run方法. 3):我們在run方法中編寫需要執行的操作:run方法裡的程式碼,執行緒執行體. 4):在main方法(執行緒)中,建
JAVA new流程(例項化過程)
1.首先去JVM 的方法區中區尋找類的class物件,如果能找到,則按照定義生成物件,找不到則轉2 2.載入類定義:類載入器(classLoader)尋找該類的 .class檔案,找到後對檔案進行分析轉換為class物件存入方法區方便以後呼叫。 其中jdk 的cla
java中類的初始化和物件的例項化區別
在程式RUN的一瞬間,什麼類啊,靜態的東西啊(靜態塊,靜態方法,靜態屬性),刷刷刷的就在記憶體中載入(你可以看作初始化)了,只加載一次,然後main方法開始執行(這就是為什麼main方法必須是靜態的原
java中什麼是例項化
java中什麼是例項化 Demo demo = new Demo(); 通常把這條語句的動作稱之為建立一個物件,也就是例項化,其實,它包含了四個動作。 1)右邊的“new Demo”,是以Demo類為模板,在堆空間裡建立一個Demo類物件(也簡稱為Demo物件)。 2)末尾的()意味
java中克隆(淺拷貝)的簡單使用程式碼
java中克隆的使用 1) 在被克隆類中,要提供實現克隆的介面: class Cat implements Cloneable{ } 2) 在被克隆的類中重寫clone方法,使其public化 class Cat implements Cloneable{
JAVA中類、例項與Class物件
類 類是面向物件程式語言的一個重要概念,它是對一項事物的抽象概括,可以包含該事物的一些屬性定義,以及操作屬性的方法。面向物件程式設計中,我們都是以類來編碼。 例項 簡單理解,就是new,就是對類的例項化,建立這個類對應
java.io.Serializable(序列化)介面詳細總結
一、前言 在參加工作後,做的第一個專案是電商專案。當時不會做專案,只能照貓畫虎。其中一個VO類為何要實現Serializable介面一直沒有理解,不實現這個Serializable,會報錯。如下是隨手寫的一個VO類Person.java: import
Java中 BlockingQueue(阻塞佇列)的使用
引言 Queue介面與List、Set同一級別,都是繼承了Collection介面。LinkedList實現了Queue接 口。Queue介面窄化了對LinkedList的方法的訪問許可權(即在方法中的引數型別如果是Queue時,就完全只能訪問Queue介面所
java學習筆記(碎片化)
關於java同步鎖的自己的理解:jvm虛擬機器有個執行緒私有的記憶體叫“程式計數器”,是java處理多執行緒時如何記憶上一個執行緒執行的位置的標杆,我們都知道,java多執行緒是類似cpu處理程序那樣,執行緒輪流切換,在一個時刻,一個處理器只處理一個執行緒中指令,程式計數器就
【Class】Java中類、例項與Class物件
文章轉載自http://www.cnblogs.com/flyme/p/4571030.html 類 類是面向物件程式語言的一個重要概念,它是對一項事物的抽象概括,可以包含該事物的一些屬性定義,以及操作屬性的方法。面向物件程式設計中,我們都是以類來編碼。
java斐波那契數列(Fibonacci sequence)的三種方式:遞迴,備忘錄,動態規劃
java斐波那契數列(Fibonacci sequence)的三種方式:遞迴,備忘錄,動態規劃 1.最常使用的是遞迴,就是從上往下尋找答案,然後在返回來。 2.備忘錄也是從上往下,只是去掉了遞迴中重複計算的部分,因為它使用一個容器來裝已經計算出的值,這裡就多一個判斷,如果計算過該式子,就直接
spring中例項化Bean的三種方式
第一種方式:使用預設無參建構函式 在預設情況下: 它會根據預設無參建構函式來建立類物件。如果bean中沒有預設無參建構函式,將會建立失敗。 <bean id="c
Spring例項化bean的三種方式
概述 學習一下Spring IOC bean的三種例項化方式。 構造方法 靜態工廠方法 例項工廠方法 預設構造方法例項化bean 最常用的初始化bean方式 public class Person { private String name; pr
Java中判斷字串是否為數字的五種方法
//方法一:用JAVA自帶的函式 public static boolean isNumeric(String str){ for (int i = str.length();--i>=0;){ if (!Character.isDigit(st
04--Spring例項化Bean的三種方式
上一小節已經新建了Gradle模組用來測試(如果沒有也沒關係,不影響接下來的分析,可以直接在Spring的spring-beans模組下測試即可)。接下來回顧一下Spring中的一些知識點,以便於更好的的分析原始碼,本小節分析一下Spring例項化bean的三種
阿里P7講解JAVA中實現單例(Singleton)模式的八種方式
單例模式 單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中,應用該模式的類一個類只有一個例項。即一個類只有一個物件例項。 基本的實現思路 單例模式要求類能夠有返回物件一個引用(永遠是同一個)和一個獲得該例項的方法(必須是
命令列執行jar包(idea+gradle)的兩種方式
1.java -jar test.jar(注意此時需要在gradle中新增Main-Class) 2.java -classpath test.jar Hello(可以不新增,但如果引用外部包,需要新增) 如果需要引用外部的Jar包則在gradle中新增如下修改 1.jar
java例項化物件的五種方式
1、用new語句建立物件,這是最常見的建立物件的方法。Student student = new Student();2、通過工廠方法返回物件,如:String str = String.valueOf(23); public interface Factory{Produc