javanew构造_Java对象的创建与构造⽅法
⼀、创建对象的四种⽅法:
a. new语句;
b. 利⽤反射,调⽤描述类的Class对象的newInstance()实例⽅法;
c. 调⽤对象的clone();
d. 反序列化;
其中new 和 newInstance()会调⽤类的构造⽅法,⽽clone()和反序列化不会;
Cloneable接⼝:
Cloneable接⼝⾥没有定义⽅法,仅⽤于标记对象,clone()⽅法是Object类⾥⾯的⽅法,是⼀个protected native⽅法;
如果对象实现Cloneable接⼝的话,需要覆盖clone⽅法;
浅拷贝:只复制基本类型;
public class Person implementsCloneable{private intage ;privateString name;public Person(intage, String name) {this.age =age;this.name =name;
}publicPerson() {}public intgetAge() {returnage;
}publicString getName() {returnname;
}
@Overrideprotected Object clone() throwsCloneNotSupportedException {return (Person)super.clone();
}
}
View Code
java接口有没有构造方法
深拷贝:基本类型和引⽤类型都会复制;
static class Body implementsCloneable{publicHead head;publicBody() {}public Body(Head head) {this.head =head;}
@Overrideprotected Object clone() throwsCloneNotSupportedException {return super.clone();
}
}static class Head /*implements Cloneable*/{publicFace face;publicHead() {}public Head(Face face){this.face =face;}
}public static void main(String[] args) throwsCloneNotSupportedException {
Body body= new Body(newHead());
Body body1=(Body) body.clone();
System.out.println("body == body1 : " + (body ==body1) );
System.out.println("body.head == body1.head : " + (body.head ==body1.head));
}
View Code
Serializable接⼝序列化:
String类、包装类、Date类都实现了这个接⼝;
序列化写⼊对象:
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("/objectFile")); //创建输出流
out.writeObject("hello");
out.writeObject(new Date()); //写⼊对象
反序列化读取对象:
ObjectInputStream in = new ObjectInputStream(new FileInputStream("/objectFile")); //创建输⼊流
String str =(adObject();
Date date= (adObject(); //读取对象
进⼀步控制:
定义readObject() 和 writeObject()⽅法,当ObjectOutputStream对⼀个对象进⾏序列化时,如果该对象具有writeObject()⽅法,则会执⾏;
private void writeObject(ObjectOutputStream stream) throwsIOException{
stream.defaultWriteObject();
stream.writeObject(newObject());
}private void readObject(ObjectInputStream stream) throwsClassNotFoundException, IOException {
stream.defaultReadObject();
Object adObject();
}
Serializable序列化时不会调⽤默认的构造器,⽽Externalizable序列化时会调⽤默认构造器的;
⼆、构造⽅法
每个类都有⼀个不含参数的默认构造⽅法;
若⾃定义了⼀个构造⽅法,则默认的构造⽅法会消失;
⼦类在创建对象时,会⾃动先调⽤⽗类的默认构造⽅法;⼦类也可以显⽰的使⽤super()调⽤⽗类的构造⽅法;(所以定义类时都会显⽰的定义⼀个空构造⽅法,防⽌它丢失了⼦类调⽤不了)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论