public class Customer implements Cloneable
{
private String name;
private int age;
public Customer()
{
this("unknown", 0);
System.out.println("默认的构造方法");
}
public Customer(String name, int age)
{
this.name = name;
this.age = age;
System.out.println("the 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;
Customer c = (Customer)o;
if(this.name.equals(c.name) && this.age==c.age)
return true;
else
return false;
}
public String toString()
{
return "name="+name+",age="+age;
}
public static void main(String[] args)throws Exception
{
//运用new语句创建对象
Customer c1 = new Customer("7Lde",30);
System.out.println("c1: "+c1);
//运用反射手段获得Customer对象
Class objClass = Class.forName("Customer");
Customer c2 = (Customer)objClass.newInstance();
System.out.println("c1: "+c1);
//运用克隆手段获得Customer对象
Customer c3 = (Customer)c1.clone();
System.out.println("c1==c3: "+ (c1==c3));
System.out.println("c1.equals(c3): "+ (c1.equals(c3)));
System.out.println("c3: "+ c3);
}
}
作为java开发者,我们每天创建很多对象,但是我们通常使用依赖注入的方式管理系统,比如:Spring去创建对象,然而这里有很多创建对象的方法:使用New关键字、使用Class类的newInstance方法、使用Constructor类的newInstance方法、使用Clone方法、使用反序列化。
使用new关键字:这是我们最常见的也是最简单的创建对象的方式,通过这种方式我们还可以调用任意的够赞函数(无参的和有参的)。比如:Student student = new Student();使用Class类的newInstance方法:我们也可以使用Class类的newInstance方法创建对象,这个newInstance方法调用无参的构造器创建对象,如:Student student2 = (Student)Class.forName("根路径.Student").newInstance(); 或者:Student stu = Student.class.newInstance();使用Constructor类的newInstance方法:次方法和Class类的newInstance方法很像,java.lang.relect.Constructor类里也有一个newInstance方法可以创建对象。
我们可以通过这个newInstance方法调用有参数的和私有的构造函数。如: Constructor constructor = Student.class.getInstance(); Student stu = constructor.newInstance(); 这两种newInstance的方法就是大家所说的反射,事实上Class的newInstance方法内部调用Constructor的newInstance方法。
这也是众多框架Spring、Hibernate、Struts等使用后者的原因。使用Clone的方法:无论何时我们调用一个对象的clone方法,JVM就会创建一个新的对象,将前面的对象的内容全部拷贝进去,用clone方法创建对象并不会调用任何构造函数。
要使用clone方法,我们必须先实现Cloneable接口并实现其定义的clone方法。如:Student stu2 = stu.clone();使用反序列化:当我们序列化和反序列化一个对象,JVM会给我们创建一个单独的对象,在反序列化时,JVM创建对象并不会调用任何构造函数。
为了反序列化一个对象,我们需要让我们的类实现Serializable接口。如:ObjectInputStream in = new ObjectInputStream (new FileInputStream("data.obj")); Student stu3 = (Student)in.readObject();。
创建Object 实例的方式有两种。第一种是使用new 操作符后跟Object 构造函数,如下所示:
var person = new Object();
person.name = "Nicholas";
person.age = 29;另一种方式是使用对象字面量表示法。对象字面量是对象定义的一种简写形式,目的在于简化创建包含大量属性的对象的过程。下面这个例子就使用了对象字面量语法定义了与前面那个例子中相同的person 对象:
var person = {
name : "Nicholas",
age : 29
};
使用new关键字:这是我们最常见的也是最简单的创建对象的方式,通过这种方式我们还可以调用任意的够赞函数(无参的和有参的)。比如:Student student = new Student();
使用Class类的newInstance方法:我们也可以使用Class类的newInstance方法创建对象,这个newInstance方法调用无参的构造器创建对象,如:Student student2 = (Student)Class.forName("根路径.Student").newInstance(); 或者:Student stu = Student.class.newInstance();
使用Constructor类的newInstance方法:本方法和Class类的newInstance方法很像,java.lang.relect.Constructor类里也有一个newInstance方法可以创建对象。我们可以通过这个newInstance方法调用有参数的和私有的构造函数。如: Constructor<Student> constructor = Student.class.getInstance(); Student stu = constructor.newInstance(); 这两种newInstance的方法就是大家所说的反射,事实上Class的newInstance方法内部调用Constructor的newInstance方法。这也是众多框架Spring、Hibernate、Struts等使用后者的原因。
使用Clone的方法:无论何时我们调用一个对象的clone方法,JVM就会创建一个新的对象,将前面的对象的内容全部拷贝进去,用clone方法创建对象并不会调用任何构造函数。要使用clone方法,我们必须先实现Cloneable接口并实现其定义的clone方法。如:Student stu2 = <Student>stu.clone();这也是原型模式的应用。
使用反序列化:当我们序列化和反序列化一个对象,JVM会给我们创建一个单独的对象,在反序列化时,JVM创建对象并不会调用任何构造函数。为了反序列化一个对象,我们需要让我们的类实现Serializable接口。如:ObjectInputStream in = new ObjectInputStream (new FileInputStream("data.obj")); Student stu3 = (Student)in.readObject();
可以参考如下内容:第一种模式:工厂方式[javascript] view plain copy print?var lev=function(){ return "啊打"; }; function Parent(){ var Child = new Object(); Child.name="李小龙"; Child.age="30"; Child.lev=lev; return Child; }; var x = Parent(); alert(x.name); alert(x.lev()); 说明:1.在函数中定义对象,并定义对象的各种属性,,虽然属性可以为方法,但是建议将属性为方法的属性定义到函数之外,这样可以避免重复创建该方法2.引用该对象的时候,这里使用的是 var x = Parent()而不是 var x = new Parent();因为后者会可能出现很多问题(前者也成为工厂经典方式,后者称之为混合工厂方式),不推荐使用new的方式使用该对象3.在函数的最后返回该对象4.不推荐使用这种方式创建对象,但应该了解第二种模式:构造函数方式[javascript] view plain copy print?var lev=function(){ return "啊打"; }; function Parent(){ this.name="李小龙"; this.age="30"; this.lev=lev; }; var x =new Parent(); alert(x.name); alert(x.lev()); 说明:1.与工厂方式相比,使用构造函数方式创建对象,无需再函数内部重建创建对象,而使用this指代,并而函数无需明确return2.同工厂模式一样,虽然属性的值可以为方法,扔建议将该方法定义在函数之外3..同样的,不推荐使用这种方式创建对象,但仍需要了解第3种模式:原型模式[javascript] view plain copy print?var lev=function(){ return "啊打"; }; function Parent(){ }; Parent.prototype.name="李小龙"; Parent.prototype.age="30"; Parent.prototype.lev=lev; var x =new Parent(); alert(x.name); alert(x.lev());。
创建出来的对象没有任何区别,但是第一种写法体现了Java的面向接口编程的原则,而第二种是面向实现编程。使用第一种方法,如果以后想把ArrayList替换成LinkedList只需要修改new后面的对象即可,而第二种方式还需要修改它的声明类型。
扩展一下,如果你又创建了一个list3,list3中包含的也是List类型,两种方式
方式1: List<List<int>> list3 = 。.
方式2: List<ArrayList<int>> list3 = 。
如果使用的是方式2 而且你把list1改成了LinkedList后 你就不能把list1放入到list3里面
但是如果你使用方式1 无论你把list1改成哪种List 都不用修改list3的创建方式
Java中创建对象的四种方式 1.用new语句创建对象,这是最常见的创建对象的方法。
2.运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。 3.调用对象的clone()方法。
4.运用反序列化手段,调用java.io.ObjectInputStream对象的 readObject()方法。下面演示了用前面3种方式创建对象的过程: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{//运用反射手段创建Customer对象 Class objClass=Class.forName("Customer"); Customer c1=(Customer)objClass.newInstance(); //会调用Customer类的默认构造方法 System.out.println("c1: "+c1); //打印name=unknown,age=0//用new语句创建Customer对象 Customer c2=new Customer("Tom",20); System.out.println("c2: "+c2); //打印name=tom,age=20//运用克隆手段创建Customer对象 Customer c3=(Customer)c2.clone(); //不会调用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种显式地创建对象的方式以外,在程序中还可以隐含地创建对象,包括以下几种情况:1.对于java命令中的每个命令行参数,Java虚拟机都会创建相应的String对象,并把它们组织到一个String数组中,再把该数组作为参数传给程序入口main(String args[])方法。
2.程序代码中的String类型的直接数对应一个String对象。3.字符串操作符“+”的运算结果为一个新的String对象。
4.当Java虚拟机加载一个类时,会隐含地创建描述这个类的Class实例.。
声明:本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
蜀ICP备2020033479号-4 Copyright © 2016 学习鸟. 页面生成时间:3.404秒