java如何声明对象_Java中创建对象的⼏种⽅式
java接口可以创建对象吗作为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 =
wInstance();
使⽤Constructor类的newInstance⽅法:本⽅法和Class类的newInstance⽅法很像,lect.Constructor类⾥也有⼀个newInstance⽅法可以创建对象。我们可以通过这个newInstance⽅法调⽤有参数的和私有的构造函数。如: Constructor constructor = Instance(); Student stu = wInstance(); 这两种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 = (adObject();
从上⾯的例⼦可以看出来,除了使⽤new关键字之外的其他⽅法全部都是转变为invokevirtual(创建对象的直接⽅法),使⽤被new的⽅式转变为两个调⽤,new和invokespecial(构造函数调⽤)。
另外:两种newInstance⽅法有没有区别?
☆ Class类位于java的lang包中,⽽构造器类是java反射机制的⼀部分。
☆ Class类的newInstance只能触发⽆参数的构造⽅法创建对象,⽽构造器类的newInstance能触发有参数或者任意参数的构造⽅法来创建对象。
☆ Class类的newInstance需要其构造⽅法是共有的或者对调⽤⽅法可见的,⽽构造器类的newInstance可以在特定环境下调⽤私有构造⽅法来创建对象。
☆ Class类的newInstance抛出类构造函数的异常,⽽构造器类的newInstance包装了⼀个InvocationTargetException异常。
Class类本质上调⽤了反射包构造器类中⽆参数的newInstance⽅法,捕获了InvocationTargetException,将构造器本⾝的异常抛出。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论