设为首页收藏本站language→→ 语言切换

鸿鹄论坛

 找回密码
 论坛注册

QQ登录

先注册再绑定QQ

查看: 905|回复: 1
收起左侧

5种Java程序员必备的创建对象方式 南京Java培训

[复制链接]
发表于 2016-8-19 15:19:34 | 显示全部楼层 |阅读模式
  作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象。有很多创建对象的方法也许你还不知道,南京万和Java培训给你整理好了:

  Java中有5种创建对象的方式,下面给出它们的例子还有它们的字节码:

  如果你运行了末尾的的程序,你会发现方法1,2,3用构造函数创建对象,方法4,5没有调用构造函数。

  1、使用new关键字

  这是最常见也是最简单的创建对象的方式了。通过这种方式,我们可以调用任意的构造函数(无参的和带参数的)。

  Employee emp1 = new Employee();

  0: new           #19          // class org/programming/mitra/exercises/Employee

  3: dup

  4: invokespecial #21          // Method org/programming/mitra/exercises/Employee."")V

  2、Class类的newInstance方法

  我们也可以使用Class类的newInstance方法创建对象。这个newInstance方法调用无参的构造函数创建对象。

  我们可以通过下面方式调用newInstance方法创建对象:

  Employee emp2 = (Employee)

  Class.forName("org.programming.mitra.exercises.Employee").newInstance();

  或者

  Employee emp2 = Employee.class.newInstance();

  51: invokevirtual    #70    // Method java/lang/Class.newInstance)Ljava/lang/Object;

  3、使用Constructor类的newnstance方法

  和Class类的newInstance方法很像, java.lang.reflect.Constructor类里也有一个newInstance方法可以创建对象。我们可以通过这个newInstance方法调用有参数的和私有的构造函数。

  Constructor<Employee> constructor = Employee.class.getConstructor();

  Employee emp3 = constructor.newInstance();

  111: invokevirtual  #80  // Method java/lang/reflect/Constructor.newInstance[Ljava/lang/Object;)Ljava/lang/Object;

  newInstance方法内部调用Constructor的newInstance方法。这也是众多框架,如Spring、Hibernate、Struts等使用后者的原因。

  4、使用clone方法

  无论何时我们调用一个对象的clone方法,jvm就会创建一个新的对象,将前面对象的内容全部拷贝进去。用clone方法创建对象并不会调用任何构造函数。

  要使用clone方法,我们需要先实现Cloneable接口并实现其定义的clone方法。

  Employee emp4 = (Employee) emp3.clone();’

  162: invokevirtual #87  // Method org/programming/mitra/exercises/Employee.clone ()Ljava/lang/Object;

  5、使用反序列化

  当我们序列化和反序列化一个对象,jvm会给我们创建一个单独的对象。在反序列化时,jvm创建对象并不会调用任何构造函数。

  为了反序列化一个对象,我们需要让我们的类实现Serializable接口。更多内容,请咨询南京万和Java培训

  ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj"));

  Employee emp5 = (Employee) in.readObject();

  261: invokevirtual  #118

  // Method java/io/ObjectInputStream.readObject)Ljava/lang/Object;

  我们从上面的字节码片段可以看到,除了第1个方法,其他4个方法全都转变为invokevirtual(创建对象的直接方法),第一个方法转变为两个调用,new和invokespecial(构造函数调用)。

  例子

  让我们看一看为下面这个Employee类创建对象:

  class Employee implements Cloneable, Serializable {

  private static final long serialVersionUID = 1L;

  private String name;

  public Employee() {

  System.out.println("Employee Constructor Called...");

  }

  public String getName() {

  return name;

  }

  public void setName(String name) {

  this.name = name;

  }

  @Override

  public int hashCode() {

  final int prime = 31;

  int result = 1;

  result = prime * result + ((name == null) ? 0 : name.hashCode());

  return result;

  }

  @Override

  public boolean equals(Object obj) {

  if (this == obj)

  return true;

  if (obj == null)

  return false;

  if (getClass() != obj.getClass())

  return false;

  Employee other = (Employee) obj;

  if (name == null) {

  if (other.name != null)

  return false;

  } else if (!name.equals(other.name))

  return false;

  return true;

  }

  @Override

  public String toString() {

  return "Employee [name=" + name + "]";

  }

  @Override

  public Object clone() {

  Object obj = null;

  try {

  obj = super.clone();

  } catch (CloneNotSupportedException e) {

  e.printStackTrace();

  }

  return obj;

  }

  }

  下面的Java程序中,我们将用5种方式创建Employee对象。你可以从GitHub找到这些代码。

  public class ObjectCreation {

  public static void main(String... args) throws Exception {

  // By using new keyword

  Employee emp1 = new Employee();

  emp1.setName("Naresh");

  System.out.println(emp1 + ", hashcode : " + emp1.hashCode());

  // By using Class class's newInstance() method

  Employee emp2 = (Employee) Class.forName("org.programming.mitra.exercises.Employee")

  .newInstance();

  // Or we can simply do this

  // Employee emp2 = Employee.class.newInstance();

  emp2.setName("Rishi");

  System.out.println(emp2 + ", hashcode : " + emp2.hashCode());

  // By using Constructor class's newInstance() method

  Constructor<Employee> constructor = Employee.class.getConstructor();

  Employee emp3 = constructor.newInstance();

  emp3.setName("Yogesh");

  System.out.println(emp3 + ", hashcode : " + emp3.hashCode());

  // By using clone() method

  Employee emp4 = (Employee) emp3.clone();

  emp4.setName("Atul");

  System.out.println(emp4 + ", hashcode : " + emp4.hashCode());

  // By using Deserialization

  // Serialization

  ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("data.obj"));

  out.writeObject(emp4);

  out.close();

  //Deserialization

  ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj"));

  Employee emp5 = (Employee) in.readObject();

  in.close();

  emp5.setName("Akash");

  System.out.println(emp5 + ", hashcode : " + emp5.hashCode());

  }

  }

  程序会输出:

  public class ObjectCreation {

  Employee Constructor Called...

  Employee [name=Naresh], hashcode : -1968815046

  Employee Constructor Called...

  Employee [name=Rishi], hashcode : 78970652

  Employee Constructor Called...

  Employee [name=Yogesh], hashcode : -1641292792

  Employee [name=Atul], hashcode : 2051657

  Employee [name=Akash], hashcode : 63313419

  想学习更多的使用java技能?想了解更多编程的技巧?希望学习更专业的java技术知识?来江苏万和计算机培训中心吧!


 楼主| 发表于 2016-8-19 15:20:34 | 显示全部楼层
想要学习Java开发、UI设计的小伙伴,可以咨询江苏万和的老师哦,tel:400-110-1100。
或者进入官网了解:http://www.wanho.net/
江苏万和作为专业IT中高端技术培训解决方案供应商、IT职业发展个性化解决方案提供商,江苏万和立足于为广大学员提供全球最先进的IT技术培训服务,23年来已培养了各类专业IT技术人才超过10w+人,服务的企业超过2000家,成为中国十大IT培训品牌。
沙发 2016-8-19 15:20:34 回复 收起回复
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

QQ|Archiver|手机版|小黑屋|sitemap|鸿鹄论坛 ( 京ICP备14027439号 )  

GMT+8, 2025-1-22 21:49 , Processed in 0.082338 second(s), 13 queries , Redis On.  

  Powered by Discuz!

  © 2001-2025 HH010.COM

快速回复 返回顶部 返回列表