创建对象的方式
在Java程序中,对象可以被显式地或者隐含地创建。
有4种显式地创建对象的方式:
1、用new语句创建对象,这是最常用的创建对象的方式。
Something somethingNew = new Something();
2、运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。
Class objClass = Class.forName("cn.softkid.test.Something");
Something somethingNew = (Something)objClass. newInstance();
如果包下不存在相应.class文件,则会抛出ClassNotFoundException。
或者
//创建Something类的对象实例可以使用下面的语句(这样需要一个已经存在的对象实例)。
Class objClass = somethingNew.getClass();
Something somethingNew = (Something)objClass. newInstance();
注意:newInstance创建对象实例的时候会调用无参的构造函数,所以必需确保类中有无参数的构造函数,否则将会抛出java.lang.InstantiationException异常。无法进行实例化。
3、调用对象的clone()方法。
若程序写成如下,则可以根据当前对象(this)建立一个新实例对象(没有调用构造函数).
public class Something implements Cloneable{
private Something obj;
public Something cloneSomething()
{
try {
obj = (Something)this.clone();
// obj = (Something)clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return obj;
}
}
如果需要复制上面的那个obj指向的对象实例时,调用somethingNew.cloneSomething()方法就ok了。
但是为什么不直接使用somethingNew.clone()呢?
JDK中Object# clone()方法的原型是:
protected native Object clone() throws CloneNotSupportedException;
方法修饰符是protected,而不是public。这种访问的不可见性使得我们对Object#clone()方法不可见。
所以,必需重写Object的clone方法后才能使用。
public Object clone()throws CloneNotSupportedException{
Something obj;
obj= (Something)super.clone();
return obj;
}
值得注意的是 :
Object类的clone()方法具有以下特点:
(1)声明为protected类型,Object的子类如果希望对外公开clone()方法,就必须扩大访问权限,例如在以上Something类中,把clone()方法的访问级别改为public。
(2)如果需要使用clone方法,必需实现java.lang.Cloneable接口,否则会抛出java.lang.CloneNotSupportedException。
(3)另外clone方法所做的的操作是直接复制字段的内容,换句话说,这个操作并不管该字段对应的对象实例内容。像这样字段对字段的拷贝(field to field copy)就成为"浅拷贝",clone方法所做的正是"浅拷贝".
4、运用反序列化手段,调用java.io.ObjectInputStream对象的readObject()方法。
除了以上4种显式地创建对象的方式以外,在程序中还可以隐含地创建对象,包括以下几种情况:
l 对于java命令中的每个命令行参数,Java虚拟机都会创建相应的String对象,并把它们组织到一个String数组中,再把该数组作为参数传给程序入口main(String args[])方法。
l 程序代码中的String类型的直接数对应一个String对象,例如:
String s1="Hello";
String s2="Hello"; //s2和s1引用同一个String对象
String s3=new String("Hello");
System.out.println(s1==s2); //打印true
System.out.println(s1==s3); //打印false
执行完以上程序,内存中实际上只有两个String对象,一个是直接数,由Java虚拟机隐含地创建,还有一个通过new语句显式地创建。
l 字符串操作符“+”的运算结果为一个新的String对象。例如:
String s1="H";
String s2=" ello";
String s3=s1+s2; //s3引用一个新的String对象
System.out.println(s3=="Hello"); //打印false
System.out.println(s3.equals("Hello")); //打印true
l 当Java虚拟机加载一个类时,会隐含地创建描述这个类的Class实例,参见第10章的10.2.1节(类的加载)。
不管采取哪种方式创建对象,Java虚拟机创建一个对象都包含以下步骤。
(1)给对象分配内存。
(2)将对象的实例变量自动初始化为其变量类型的默认值。
(3)初始化对象,给实例变量赋予正确的初始值。
对于以上第三个步骤,Java虚拟机可采用3种方式来初始化对象,到底采用何种初始化方式取决于创建对象的方式。
l 如果对象是通过clone()方法创建的,那么Java虚拟机把原来被克隆对象的实例变量的值拷贝到新对象中。
l 如果对象是通过ObjectInputStream类的readObject()方法创建的,那么Java虚拟机通过从输入流中读入的序列化数据来初始化那些非暂时性(non-transient)的实例变量。
在其他情况下,如果实例变量在声明时被显式初始化,那么就把初始化值赋给实例变量,接着再执行构造方法。这是最常见的初始化对象的方式。
分享到:
相关推荐
JAVA 创建对象的四种方法 ...- 本文总结了 Java 中创建对象的四种方法,每种方法都有其优缺,选择哪种方式创建对象取决于具体的应用场景和需求,了解不同的创建对象方式可以帮助开发者更好地设计和实现 Java 应用程序。
这是最常见也是最直接的创建对象方式。当我们使用new关键字时,Java虚拟机(JVM)会在堆内存中创建一个新对象,并自动调用该对象的构造方法。例如,使用new关键字创建Customer类对象的代码如下: ```java Customer c2 ...
不同的创建对象方式适用于不同的场景,选择合适的方法可以有效提高代码的性能和可读性。例如,在需要大量实例化对象的情况下,推荐使用通过原型链的方式创建对象,因为它可以显著减少内存消耗。而在需要保持每个对象...
在JavaScript中,创建对象是编程的基本操作之一,它支持多种方式来实现这一目的。这篇博客“javascript创建对象的方式(二)”可能详细介绍了在JavaScript中除了最基础的字面量语法之外的其他创建对象的方法。这里...
这些不同的创建对象方式在不同场景下各有优势。XML配置适合传统应用,注解配置简化了配置且易于理解和维护。Java配置提供了更多的灵活性,同时可以结合其他Spring特性。Prototype scope和FactoryBean则解决了特殊...
"易语言对象创建快捷方式"是一个关于如何使用易语言来创建桌面快捷方式的源码实例。 在Windows操作系统中,快捷方式是一个指向特定文件或程序的链接,它方便用户快速访问所需内容,而无需深入文件系统寻找。在编程...
在Qt框架中,动态创建对象是一项重要的编程技巧,它允许我们根据字符串形式的类名来实例化对应的对象。这样的功能在实现插件机制、运行时加载不同组件或处理未知类型对象时尤为有用。本篇文章将深入探讨如何在Qt中...
1、C++创建对象方式 在C++中我们可以采用如下两种方式来创建对象, 1 Dog dog;//Dog为类名 2 Dog *p = new Dog(); 这两种方式在C++中都能完成对象的创建,但是在内存中的处理却完全不同。 对于...
本文将深入探讨两种常见的对象创建方式:使用`new`关键字创建对象和直接定义对象。这两种方法虽然最终都能创建类的实例,但它们在内存分配、作用域和生命周期等方面存在显著差异。 ### 1. `new`关键字创建对象 `...
这篇博文主要探讨了JavaScript创建对象的几种常见方式,这对于理解和掌握JavaScript面向对象编程至关重要。在实际开发中,了解并灵活运用这些方法能够提高代码的可读性和可维护性。下面,我们将详细讲解标题中提到的...
首先,最基础的创建对象方式是使用`Object`构造函数或者对象字面量。例如: ```javascript var o = { a: 1 }; var o2 = new Object(); o2.a = 1; ``` 这种方式简单直接,但如果需要创建大量具有相似结构的对象时,将...
利用反射,我们可以动态地创建对象,这意味着在代码执行时,我们能够实例化未知类型的对象,这在处理插件系统、动态加载用户界面组件或根据配置文件创建对象时非常有用。 标题中提到的"利用反射动态创建对象",主要...
本文将深入探讨JavaScript创建对象的8种常见方式,帮助你更好地理解和掌握这门动态类型的编程语言。 1. **字面量(Literal)方式** 这是最简单直接的创建对象的方式,通过大括号{}来定义一个对象,然后在内部用...
在C#编程中,反射是一种强大的机制,它允许我们在运行时检查类型信息并动态地创建对象。通过反射,我们可以操作程序集、类型、接口、属性、方法等,从而增加了代码的灵活性和可扩展性。本篇文章将深入探讨如何利用...
JavaScript 提供了多种创建对象的方式,每种都有其适用场景。字面量方式适用于简单对象,构造函数和原型对象适用于复杂且需要复用的情况,`Object.create()` 适用于创建新对象并指定原型,而 ES6 类则提供了面向对象...
### JavaScript面向对象之常见创建对象的方式 #### 引言 JavaScript 的灵活性体现在其创建对象的多种方式上。本文将详细介绍三种常见的对象创建方法:工厂模式、构造函数模式以及原型模式,并探讨它们各自的优缺点...
在创建快捷方式时,我们需要用到的是与快捷方式相关的对象,通常是“快捷方式”对象或者“外壳接口”对象,这些对象提供了创建、修改快捷方式的方法。 2. **API调用**:由于易语言的标准库可能并未直接提供创建快捷...
【C#创建COM对象】是将.NET Framework的C#代码暴露给使用COM技术的其他编程语言,如VC++。在C#中创建COM对象主要涉及以下几个关键步骤和知识点: 1. **创建类库项目**:首先,我们需要在Visual Studio中创建一个新...
易语言是一种专为中国人设计的编程语言,它以简明的中文语法,降低了编程的门槛,使得更多非专业程序员能够...通过学习和理解这些源码,开发者可以掌握在易语言中创建对象和操作快捷方式的技术,提升自己的编程技能。
### Unity中创建对象后在Scene中不可见的问题分析与解决 #### 问题描述 在Unity中,用户在创建了一系列地形、天空盒等景物后,加入了飞机作为漫游工具。然而,当飞机被添加到场景中后,在Scene视图中却无法看到飞机...