java中可以通过4种途径创建对象:
1 通过new创建
2 通过clone创建
3 通过反射机制
4 对象的序列化与反序列化
通过new创建
在B类中创建A类对象 A a=new A(); 要求A类的构造函数在B类中是可见的
通过clone创建
对于克隆(Clone),Java有一些限制:
1、被克隆的类必须自己实现Cloneable 接口,以指示 Object.clone() 方法可以合法地对该类实例进行按字段复制。Cloneable 接口实际上是个标识接口,没有任何接口方法。
2、实现Cloneable接口的类应该使用公共方法重写 Object.clone(它是受保护的)。某个对象实现了此接口就克隆它是不可能的。即使 clone 方法是反射性调用的,也无法保证它将获得成功。
3、在Java.lang.Object类中克隆方法是这么定义的:
protected Object clone()
throws CloneNotSupportedException
创建并返回此对象的一个副本。表明是一个受保护的方法,同一个包中可见。
克隆方法构造对象与构造函数无关,即不要求构造函数是可见的,只要有一个克隆对象就行。
克隆创建对象举例:
package clone;
public class PrivateB implements Cloneable {
public String b = "bb";
private static PrivateB pb = new PrivateB();
private PrivateB() {
}
public static PrivateB getInstance() {
return pb;
}
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
package clone;
public class CreateB {
public void create(){
PrivateB pb=PrivateB.getInstance();
try {
PrivateB pb1=(PrivateB) pb.clone();
//pb1.b="ddss";
System.out.print(pb1.b);
System.out.print(pb.b);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
public static void main(String args[]){
new CreateB().create();
}
}
运行CreateB输出结果为:bbbb
因为用克隆方法创建对象与构造函数无关,所以使用单例模式的类不要用克隆方法。
通过反射机制
package reflect.model;
public class PrivateA {
public String a = "private";
public PrivateA() {
}
}
package reflect;
import reflect.model.PrivateA;
public class Test {
public void get() {
String name="reflect.model.PrivateA";
try {
PrivateA pa = (PrivateA)Class.forName(name).newInstance();
System.out.println(pa.a);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static void main(String args[]){
new Test().get();
}
}
运行test输出结果为:private
通过反射机制创建对象就是解决只知道类名时怎么创建对象。
注意:Test 之所以可以通过反射机制创建PrivateA 的对象是因为PrivateA 的构造函数是可见的。如果PrivateA 的构造函数是不可见的,则不能通过反射机制创建PrivateA 的对象。
对象的序列化与反序列化
package objectoutput;
import java.io.Serializable;
public class A implements Serializable
{
private static A a=new A();
public String aa="aa";
public A(){}
public static A getInstanse(){
return a;
}
}
package objectoutput;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class CreatA {
public static void main(String[] args)
{
try
{
File testFile=new File("E:/Info.dat");
ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream(testFile,true));
out.writeObject(A.getInstanse());
out.flush();
out.close();
ObjectInputStream in=new ObjectInputStream(new FileInputStream(testFile));
A temp;
try
{
temp= (A) in.readObject();
System.out.println("Object :"+temp.aa);
}
catch(Exception e)
{
e.printStackTrace();
}
in.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
运行结果:Object :aa
作用:保存对象的运行状态并回复他
分享到:
相关推荐
以上五种方法都是Java中创建对象的常见途径,各有优缺点。选择哪种方式取决于具体需求,如代码的可读性、性能要求以及对对象创建的控制程度。在实际开发中,通常会结合使用这些方法,以实现最佳的编程效果。
### Java问题解决途径 在Java开发过程中,遇到各种问题是难以避免的。为了更好地解决这些问题,本文将基于一系列链接资源,探讨不同方面的Java知识点及其应用场景,为开发者提供实用的解决方案。 #### 1. 使用XML...
在Java中,类是创建对象的蓝图,它定义了对象的状态(属性)和行为(方法)。继承、封装和多态是OOP的三大核心特征。 1. **继承**:继承允许一个类(子类)继承另一个类(父类)的属性和方法,减少了代码重复,提高...
1. 类与对象:类是创建对象的模板,对象则是类的实例。在Java中,我们使用`class`关键字定义类,通过`new`关键字实例化对象。 2. 封装:这是OOP的基本原则之一,它将数据和方法绑定在一起,对外提供接口,隐藏内部...
类是开发者定义的自定义类型,Java允许创建任意数据类型以适应不同问题域的需求。 **8. 对象、类、属性、行为和状态实例** 以小王减肥为例: - **对象**:小王。 - **类**:人。 - **属性**:体重。 - **行为**:...
类是创建对象的模板,对象是类的实例。在Java中,类是由属性和方法组成的,属性代表对象的状态,方法代表对象的行为。面向对象编程(OOP)的原则包括封装、继承和多态,它们允许程序员设计模块化的、可重用的代码,...
反射和泛型是一种重要的解决途径。 此代码是一个生成泛型对象的类。 比如: Pool<Point> pool = new Pool(){}; Point p = pool.get(x, y); //在此构造Point对象 ... pool.put(p); 希望能帮助那些为查找泛型构造器、...
Java面向对象程序设计是Java开发的核心,通过定义类和对象,可以构建出复杂的应用系统。在Java中,类是描述对象的模板,它定义了一组数据(称为域或属性)和能够对这些数据进行操作的方法。类是抽象的概念,而对象是...
在 Java 中,可以通过 clone() 方法实现对象的浅拷贝,或者通过手动创建对象的副本来实现深拷贝。 Java 面向对象编程的基本概念和实现 在 Java 中,面向对象编程的基本概念包括: 1. 类和对象:类是对象的模板,...
在易语言中,通过特定的模块和接口,可以将Java的对象类封装起来,使得易语言程序能够创建、操作Java对象,如同调用易语言内置的类一样。这大大提高了代码的可复用性和兼容性。 其次,提到“编码转换支持库”,这是...
在探讨如何在普通的Java类中获取`PageContext`对象之前,我们先来了解一下`PageContext`的基本概念及其在JavaWeb开发中的重要性。`PageContext`是JavaServer Pages(JSP)技术的核心类之一,它提供了对当前页面的上...
一旦我们有了`Class`对象,我们就可以利用反射来创建对象,调用方法和访问属性。例如,我们可以使用`newInstance()`方法创建一个新对象,但前提是没有参数的构造函数: ```java Person person = (Person) person...
- 使用:在创建对象时,根据传递的参数,系统会自动选择合适的构造方法进行调用,完成对象的初始化工作。 3. 继承:继承是面向对象的另一个关键特性,它允许一个类(子类)继承另一个类(父类)的属性和方法。子类...
在易语言中,通过定义类(Class)来创建对象,类是具有相同属性和方法的对象的模板或蓝图。 标题提到的“仿java集合 list, 以及map工具类”,是指易语言中对Java集合框架的模拟实现。在Java中,List和Map是两种主要...
在学习“Java面向对象教程 应用软件工程原理编程”时,你可能会接触到类和对象的创建、接口的使用、异常处理、集合框架、多线程编程、IO流、网络编程以及设计模式等内容。每个主题都深度广阔,值得深入研究。此外,...
使用`Paths.get`方法可以创建一个`Path`对象,然后通过`Path`类提供的方法获取文件的绝对路径、父目录、文件名等信息。 ### 5. 使用系统环境变量 有时候路径可能存储在系统环境变量中,比如`PATH`环境变量包含了...
4. **面向对象技术讲义-1.doc**:这是面向对象编程的入门部分,可能介绍了什么是面向对象编程,以及它相对于过程编程的优势,还有类的定义和对象的创建。 5. **Java语言程序设计讲义-3.doc**:这部分可能涉及到了更...
Java反射机制是Java语言提供的一种强大功能,它允许我们在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个机制在处理不确定类型或者需要灵活操作类的场景中非常有用。在这个...
在本Java入门小实验中,我们将探讨如何使用Java语言创建一个简易的学生信息管理系统。这个系统是通过图形用户界面(GUI)窗体实现的,旨在帮助初学者...在实践中不断学习和探索,将是成为专业Java开发者的有效途径。
例如,Java开发者可以创建一个Java对象,然后注册到Lua环境中,这样Lua脚本就可以通过全局变量或者函数调用来访问和操作这个对象。反之,Lua脚本也可以创建新的全局变量或函数,供Java代码调用。 luajava-1.1.0的...