java创建对象是⽤来⼲嘛的_Java创建对象的⽅式
Java创建对象的⽅式共有四种:
使⽤new语句实例化⼀个对象;
通过反射机制创建对象;
通过clone()⽅法创建⼀个对象;
通过反序列化的⽅式创建对象。
⼀.使⽤new语句实例化⼀个对象
new语句实例化⼀个对象是最常见的⽤来创建对象的⽅式。
⼆.通过反射机制创建对象
1.什么是反射机制?
反射机制是java的⼀个⾮常重要的特性,它允许程序在运⾏时进⾏⾃我检查,同时也允许对其内部的成
员进⾏操作。反射机制提供的功能主要有:得到⼀个对象所属的类;获取⼀个类的所有成员变量和⽅法;在运⾏时创建对象;在运⾏时调⽤对象的⽅法。
2.通过反射机制创建对象
st;classBase{public voidf(){
System.out.println("Base");
}
}class Sub extendsBase{//重写⽗类的成员⽅法
public voidf(){
System.out.println("Sub");
}}public classCreateInstanceTest {public static voidmain(String[] args){try{//参数必须为类的全路径
Class c=Class.forName("st.Sub");//创建对象
Base b=(wInstance();
b.f();
}catch(Exception e){
e.printStackTrace();
}
}
}
通过反射机制创建对象时,⾸先通过反射机制加载类获得Class类,获得Class类的⽅法主要有以下三种:
Class.forName("类的全路径");
类名.Class;
实例.getClass();
其次使⽤newInstance()⽅法创建该类的对象。
new是关键字,创建⼀个新类;newInstance()是⽅法,使⽤类加载机制,使⽤newInstance()必须保证这个类已经被加载;
java接口可以创建对象吗newInstance: 弱类型,低效率,只能调⽤⽆参构造;new: 强类型,相对⾼效,能调⽤任何public构造。
三.使⽤clone()⽅法创建⼀个对象
st;class Student implementsCloneable{public intnumber;public void setInt(intnumber)
{this.number=number;
}public intgetInt(){returnnumber;
}
@OverridepublicObject clone(){
Student stu=null; try{
stu=(Student)super.clone();
}catch(Exception e){
e.printStackTrace();
}returnstu;
}
}public classCloneTest {public static voidmain(String[] args){
Student stu1=newStudent();
Student stu2=(Student)stu1.clone();boolean flag=(stu1==stu2);
System.out.println("stu1和stu2是同⼀个对象吗?"+flag);
}}//stu1和stu2是同⼀个对象吗?false
使⽤clone()⽅法创建对象的步骤如下:
实现clone的类⾸先要继承Cloneable接⼝,class Student implements Cloneable{};
在类中重写Object中的clone()⽅法,@Override public Object clone() {}
在clone()⽅法中调⽤super.clone(),Student stu2 = (Student)stu1.clone();
把浅复制的引⽤指向原型对象新的克隆体,Student stu2 = (Student)stu1.clone();
四.通过反序列化创建⼀个对象
1.什么是反序列化?
序列化是⼀种将对象以⼀连串的字节描述的过程,可以将对象写在流⾥进⾏⽹络传输,或者保存到⽂件、数据库等系统⾥。与序列化相反的是反序列化,它将流转换为对象。
2.通过反序列化创建⼀个对象
st;import java.io.FileInputStream;importjava.io.FileOutputStream;import
java.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjava.io.Serializable;//Serializable-->标志性接⼝,表⽰该类的数据成员可以被序列化
public class People implementsSerializable{publicString name;public intage;publicString getName() {returnname;
}public voidsetName(String name) {this.name =name;
}public intgetAge() {returnage;
}public void setAge(intage) {this.age =age;
}publicPeople(){this.name="Lili";this.age=18; }public static voidmain(String[] args){
People p=newPeople();
ObjectOutputStream oos=null;
ObjectInputStream ois=null;try{
FileOutputStream fos=new FileOutputStream("");
oos=newObjectOutputStream(fos);
oos.writeObject(p);
oos.close();
}catch(Exception e){
e.printStackTrace();
}//反序列化
try{
FileInputStream fis=new FileInputStream("");
ois=newObjectInputStream(fis);
People p1=(People) adObject();
System.out.println("p1和p是同⼀个对象吗?"+(p1==p));
}catch(Exception e){
e.printStackTrace();
}
}}//p1和p是同⼀个对象吗?false
序列化时⾸先创建⼀个输出流对象oos,使⽤oos的writeObject()⽅法将p对象写⼊oos对象中去。使⽤反序列化创建对象时,⾸先创建⼀个输⼊流对象ois,使⽤输⼊流对象ois的readObject()⽅法将序列化存⼊的对象读出,重新创建⼀个对象。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论