在java程序中,对象可以被显式地或者隐式地创建.
下面说说四种显式的创建对象的方式:
● 用new语句创建对象
● 运用反射手段,调用java.lang.Class 或者 java.lang.reflect.Constructor 类的newInstance()实例方法
● 调用对象的clone()方法
● 运用序列化手段,调用java.io.ObjectInputStream 对象的 readObject()方法.
例子
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
方法的子类也会抛出此异常,以指示无法克隆某个实例。
- 另请参见:
Cloneable
posted on 2007-10-29 14:12
Ke 阅读(1478)
评论(0) 编辑 收藏 所属分类:
java