`
waomaowei
  • 浏览: 9347 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

java创建对象的途径

阅读更多

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创建对象的五种方法demo

    以上五种方法都是Java中创建对象的常见途径,各有优缺点。选择哪种方式取决于具体需求,如代码的可读性、性能要求以及对对象创建的控制程度。在实际开发中,通常会结合使用这些方法,以实现最佳的编程效果。

    java问题解决途径

    ### Java问题解决途径 在Java开发过程中,遇到各种问题是难以避免的。为了更好地解决这些问题,本文将基于一系列链接资源,探讨不同方面的Java知识点及其应用场景,为开发者提供实用的解决方案。 #### 1. 使用XML...

    JAVA面向对象编程源代码-孙卫琴

    在Java中,类是创建对象的蓝图,它定义了对象的状态(属性)和行为(方法)。继承、封装和多态是OOP的三大核心特征。 1. **继承**:继承允许一个类(子类)继承另一个类(父类)的属性和方法,减少了代码重复,提高...

    Java面向对象程序设计(第2版)-课件、习题、例子源代码

    1. 类与对象:类是创建对象的模板,对象则是类的实例。在Java中,我们使用`class`关键字定义类,通过`new`关键字实例化对象。 2. 封装:这是OOP的基本原则之一,它将数据和方法绑定在一起,对外提供接口,隐藏内部...

    孙卫琴版《Java面向对象程序设计》思考题及答案

    类是开发者定义的自定义类型,Java允许创建任意数据类型以适应不同问题域的需求。 **8. 对象、类、属性、行为和状态实例** 以小王减肥为例: - **对象**:小王。 - **类**:人。 - **属性**:体重。 - **行为**:...

    java面向对象 - 类与对象代码.zip

    类是创建对象的模板,对象是类的实例。在Java中,类是由属性和方法组成的,属性代表对象的状态,方法代表对象的行为。面向对象编程(OOP)的原则包括封装、继承和多态,它们允许程序员设计模块化的、可重用的代码,...

    利用反射生成泛型类对象

    反射和泛型是一种重要的解决途径。 此代码是一个生成泛型对象的类。 比如: Pool<Point> pool = new Pool(){}; Point p = pool.get(x, y); //在此构造Point对象 ... pool.put(p); 希望能帮助那些为查找泛型构造器、...

    Java面向对象程序设计

    Java面向对象程序设计是Java开发的核心,通过定义类和对象,可以构建出复杂的应用系统。在Java中,类是描述对象的模板,它定义了一组数据(称为域或属性)和能够对这些数据进行操作的方法。类是抽象的概念,而对象是...

    Java第三章习题

    在 Java 中,可以通过 clone() 方法实现对象的浅拷贝,或者通过手动创建对象的副本来实现深拷贝。 Java 面向对象编程的基本概念和实现 在 Java 中,面向对象编程的基本概念包括: 1. 类和对象:类是对象的模板,...

    JAVA对象易语言模块源码

    在易语言中,通过特定的模块和接口,可以将Java的对象类封装起来,使得易语言程序能够创建、操作Java对象,如同调用易语言内置的类一样。这大大提高了代码的可复用性和兼容性。 其次,提到“编码转换支持库”,这是...

    普通java类中获取pageContext对象

    在探讨如何在普通的Java类中获取`PageContext`对象之前,我们先来了解一下`PageContext`的基本概念及其在JavaWeb开发中的重要性。`PageContext`是JavaServer Pages(JSP)技术的核心类之一,它提供了对当前页面的上...

    Java反射机制,通过对象访问调用类的私有成员或方法

    一旦我们有了`Class`对象,我们就可以利用反射来创建对象,调用方法和访问属性。例如,我们可以使用`newInstance()`方法创建一个新对象,但前提是没有参数的构造函数: ```java Person person = (Person) person...

    Java基础之面向对象.docx

    - 使用:在创建对象时,根据传递的参数,系统会自动选择合适的构造方法进行调用,完成对象的初始化工作。 3. 继承:继承是面向对象的另一个关键特性,它允许一个类(子类)继承另一个类(父类)的属性和方法。子类...

    易语言仿java集合 list map源码

    在易语言中,通过定义类(Class)来创建对象,类是具有相同属性和方法的对象的模板或蓝图。 标题提到的“仿java集合 list, 以及map工具类”,是指易语言中对Java集合框架的模拟实现。在Java中,List和Map是两种主要...

    java面向对象教程 应用软件工程原理编程

    在学习“Java面向对象教程 应用软件工程原理编程”时,你可能会接触到类和对象的创建、接口的使用、异常处理、集合框架、多线程编程、IO流、网络编程以及设计模式等内容。每个主题都深度广阔,值得深入研究。此外,...

    总结一下java获取路径几种途径

    使用`Paths.get`方法可以创建一个`Path`对象,然后通过`Path`类提供的方法获取文件的绝对路径、父目录、文件名等信息。 ### 5. 使用系统环境变量 有时候路径可能存储在系统环境变量中,比如`PATH`环境变量包含了...

    北邮java可见

    4. **面向对象技术讲义-1.doc**:这是面向对象编程的入门部分,可能介绍了什么是面向对象编程,以及它相对于过程编程的优势,还有类的定义和对象的创建。 5. **Java语言程序设计讲义-3.doc**:这部分可能涉及到了更...

    JAVA反射机制动态调用 计算器对象的加法,减法函数;JAVA反射机制修改一个学生对象 的私有数据成员

    Java反射机制是Java语言提供的一种强大功能,它允许我们在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个机制在处理不确定类型或者需要灵活操作类的场景中非常有用。在这个...

    Java入门小实验:简易学生信息管理系统(窗体实现)

    在本Java入门小实验中,我们将探讨如何使用Java语言创建一个简易的学生信息管理系统。这个系统是通过图形用户界面(GUI)窗体实现的,旨在帮助初学者...在实践中不断学习和探索,将是成为专业Java开发者的有效途径。

    luajava-1.1.0

    例如,Java开发者可以创建一个Java对象,然后注册到Lua环境中,这样Lua脚本就可以通过全局变量或者函数调用来访问和操作这个对象。反之,Lua脚本也可以创建新的全局变量或函数,供Java代码调用。 luajava-1.1.0的...

Global site tag (gtag.js) - Google Analytics