关闭

java中创建对象的几种方法

标签: java
1005人阅读 评论(0) 收藏 举报
分类:
  java中几种创建对象的方式 






在java程序中,对象可以被显式地或者隐式地创建.
下面说说四种显式的创建对象的方式:
    ●  用new语句创建对象
    ●  运用反射手段,调用java.lang.Class 或者 java.lang.reflect.Constructor 类的newInstance()实例方法
    ●  调用对象的clone()方法
    ●  运用序列化手段,调用java.io.ObjectInputStream 对象的 readObject()方法.


例子:


package dgut.ke.javatest;


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 CloneNotSupportedException {
  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 "customer.name = "+name+" customer.age = "+age;
 }
  /**
   * @param args
   */
 public static void main(String[] args) throws Exception{
  // 运用反射手段创建Customer对象
  Class objectClass = Class.forName("dgut.ke.javatest.Customer");
  Customer c1 = (Customer) objectClass.newInstance();
  System.out.println("c1 --> " + c1);
   
  //用new创建Customer对象
  Customer c2 = new Customer("Tom",20);
  System.out.println("c2 --> " + c2);
   
  //运用克隆手段创建Customer对象
  Customer c3 = (Customer) c2.clone();
  System.out.println("c3 --> " + c3);
  System.out.println("c2 == c3 " + (c2==c3));
  System.out.println("c2.equals(c3) " + c2.equals(c3));
 }


}


 


Class类的forName方法public static Class<?> forName(String className)
throws ClassNotFoundException
返回与带有给定字符串名的类或接口相关联的 Class 对象。调用此方法等效于: 
  Class.forName(className, true, currentLoader)


其中 currentLoader 表示此类的定义类加载器。 
例如,以下代码片段返回 java.lang.Thread 类的运行时 Class 描述符。 


   Class t = Class.forName("java.lang.Thread")


调用 forName("X") 将导致名为 X 的类被初始化。 


 


参数: 
className - 所需类的完全限定名。 
返回: 
具有指定名的类的 Class 对象。 
抛出: 
LinkageError - 如果链接失败 
ExceptionInInitializerError - 如果此方法所激发的初始化失败 
ClassNotFoundException - 如果找不到该类
Object类的clone()方法


protected Object clone()
throws CloneNotSupportedException
创建并返回此对象的一个副本。“副本”的准确含义可能依赖于对象的类。一般来说,对于任何对象 x,如果表达式: 
x.clone() != x
是正确的,则表达式: 
x.clone().getClass() == x.getClass()
将为 true,但这些不是绝对条件。一般情况下是: 
x.clone().equals(x)
将为 true,但这不是绝对条件。 
按照惯例,返回的对象应该通过调用 super.clone 获得。如果一个类及其所有的超类(Object 除外)都遵守此约定,则 x.clone().getClass() == x.getClass()。 


按照惯例,此方法返回的对象应该独立于该对象(正被克隆的对象)。要获得此独立性,在 super.clone 返回对象之前,有必要对该对象的一个或多个字段进行修改。这通常意味着要复制包含正在被克隆对象的内部“深层结构”的所有可变对象,并使用对副本的引用替换对这些对象的引用。如果一个类只包含基本字段或对不变对象的引用,那么通常不需要修改 super.clone 返回的对象中的字段。 


Object 类的 clone 方法执行特定的克隆操作。首先,如果此对象的类不能实现接口 Cloneable,则会抛出 CloneNotSupportedException。注意:所有的数组都被视为实现接口 Cloneable。否则,此方法会创建此对象的类的一个新实例,并像通过分配那样,严格使用此对象相应字段的内容初始化该对象的所有字段;这些字段的内容没有被自我克隆。所以,此方法执行的是该对象的“浅表复制”,而不“深层复制”操作。 


Object 类本身不实现接口 Cloneable,所以在类为 Object 的对象上调用 clone 方法将会导致在运行时抛出异常。 


 


返回: 
此实例的一个克隆。 
抛出: 
CloneNotSupportedException - 如果对象的类不支持 Cloneable 接口,则重写 clone 方法的子类也会抛出此异常,以指示无法克隆某个实例。
0
0
查看评论

java中常见创建对象的方式有哪几种?

1、通过new语句实例化一个对象 2、通过反射机制动态创建对象 3、通过clone()创建对象 4、通过反序列化的方式创建对象
  • yuleichun
  • yuleichun
  • 2017-03-06 16:23
  • 434

Java 创建对象的几种方式

我们总是讨论没有对象就去new一个对象,创建对象的方式在我这里变成了根深蒂固的new方式创建,但是其实创建对象的方式还是有很多种的,不单单有new方式创建对象,还有使用反射机制创建对象,使用clone方法去创建对象,通过序列化和反序列化的方式去创建对象。这里就总结一下创建对象的几种方式,来好好学习一...
  • w410589502
  • w410589502
  • 2017-02-22 17:09
  • 1142

创建对象(实例))的4种方式

public class Dog{ public Dog(){ super(); } } 1、创建对象有什么难的,我们new一个就是的………………对,没错,这只是其中一种 Dog jack = new Dog(); 2、利用class的反射机制,该种方式适用于有无参构造方法的 C...
  • cadi2011
  • cadi2011
  • 2016-06-17 10:38
  • 3757

java中创建对象的几种方法和clone

对象创建的几种方法:1.使用new关键字2.使用clone方法3.反射机制4.反序列化以上四种都可以产生java对象1,3都会明确的显式的调用构造函数2是在内存上对已有对象的影印 所以不会调用构造函数4是从文件中还原类的对象 也不会调用构造函数不用构造方法也能创建对象?http://www.itey...
  • jethai
  • jethai
  • 2016-08-28 14:09
  • 1458

JS创建对象几种不同方法详解

1、工厂模式弊端:没有解决对象的识别问题,即怎么知道一个对象的类型。 2、构造函数模式 与工厂模式相比: 1、没有显式的创建对象 2、直接将属性和方法赋给了this对象 3、没有return语句 要创建person的实例,必须使用new操作符,以这种方式调用构造函数实际上会经历4个步骤:...
  • liuyan19891230
  • liuyan19891230
  • 2016-02-29 14:28
  • 6848

C++三种创建对象的方法区别

我们都知道C++中有三种创建对象的方法,如下: 复制代码代码如下: #include using namespace std; class A { private:     int n; public:     A(...
  • lx627776548
  • lx627776548
  • 2016-07-29 18:08
  • 2831

JavaScript中的对象,如何创建对象,创建对象的7种模式

ECMA-262把对象定义为:”无需属性的集合,其属性可以包含基本值、对象或者函数。”严格来讲,这就相当于说明对象是一组没有特定顺序的值。对象的每个属性或方法都有一个名字,而每个名字都映射到一个值。正因为这样,我们可以把ECMAScript的对象想象成散列表:无非就是一组名对值,其中值可以是数据或函...
  • u014346301
  • u014346301
  • 2016-08-14 16:33
  • 9625

java 创建对象的四种方式、java对象初始化顺序

java创建对象的几种方式: (1) 用new语句创建对象,这是最常见的创建对象的方法。 (2) 运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。 (3) 调用对象的clone()方法。 (4) ...
  • SilenceCarrot
  • SilenceCarrot
  • 2016-09-05 16:39
  • 2739

java中创建对象的几种方式

创建对象的几种方式
  • syp_24
  • syp_24
  • 2017-06-26 15:58
  • 273

spring3种创建对象的方式

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:context="http://www.springframework.or...
  • elfenliedef
  • elfenliedef
  • 2011-02-12 11:05
  • 4179
    个人资料
    • 访问:371603次
    • 积分:5977
    • 等级:
    • 排名:第5075名
    • 原创:240篇
    • 转载:29篇
    • 译文:2篇
    • 评论:34条
    最新评论