java创建对象的四种方式
1.使用new创建对象
使用new关键字创建对象应该是最常见的一种方式,但我们应该知道,使用new创建对象会增加耦合度。无论使用什么框架,都要减少new的使用以降低耦合度。
package yunche.test; /** * @ClassName: Hello * @Description: 待创建的类 * @author: yunche * @date: 2018/08/24 */ public class Hello { public void sayWorld() { System.out.println("Hello world!"); } }
package yunche.test; /** * @ClassName: NewClass * @Description: 使用new关键字创建对象 * @author: yunche * @date: 2018/08/24 */ public class NewClass { public static void main(String[] args) { Hello h = new Hello(); h.sayWorld(); } }
2.使用反射的机制创建对象
使用Class类的newInstance方法
Hello类的代码不变,NewClass类的代码如下:
package yunche.test; /** * @ClassName: NewClass * @Description: 使用Class类的newInstance方法 * @author: yunche * @date: 2018/08/24 */ public class NewClass { public static void main(String[] args) { try { Class heroClass = Class.forName("yunche.test.Hello"); Hello h =(Hello) heroClass.newInstance(); h.sayWorld(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } } }
使用Constructor类的newInstance方法
package yunche.test; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; /** * @ClassName: NewClass * @Description: 使用Constructor类的newInstance方法 * @author: yunche * @date: 2018/08/24 */ public class NewClass { public static void main(String[] args) { try { //获取类对象 Class heroClass = Class.forName("yunche.test.Hello"); //获取构造器 Constructor constructor = heroClass.getConstructor(); Hello h =(Hello) constructor.newInstance(); h.sayWorld(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }
3.采用clone
clone时,需要已经有一个分配了内存的源对象,创建新对象时,首先应该分配一个和源对象一样大的内存空间。
要调用clone方法需要实现Cloneable接口,由于clone方法是protected的,所以修改Hello类。
package yunche.test; /** * @ClassName: Hello * @Description: 待创建的类 * @author: yunche * @date: 2018/08/24 */ public class Hello implements Cloneable { public void sayWorld() { System.out.println("Hello world!"); } public static void main(String[] args) { Hello h1 = new Hello(); try { Hello h2 = (Hello)h1.clone(); h2.sayWorld(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } } }
4.采用序列化机制
使用序列化时,要实现实现Serializable接口,将一个对象序列化到磁盘上,而采用反序列化可以将磁盘上的对象信息转化到内存中。
package yunche.test; import java.io.*; /** * @ClassName: Serialize * @Description: 序列化与反序列化对象 * @author: yunche * @date: 2018/08/24 */ public class Serialize { public static void main(String[] args) { Hello h = new Hello(); //准备一个文件用于存储该对象的信息 File f = new File("hello.obj"); try(FileOutputStream fos = new FileOutputStream(f); ObjectOutputStream oos = new ObjectOutputStream(fos); FileInputStream fis = new FileInputStream(f); ObjectInputStream ois = new ObjectInputStream(fis) ) { //序列化对象,写入到磁盘中 oos.writeObject(h); //反序列化对象 Hello newHello = (Hello)ois.readObject(); //测试方法 newHello.sayWorld(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }
不积跬步,无以至千里;不积小流,无以成江海
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!