我们常说,Java是一种面向对象的语言,因而在Java中几乎所有的操作都离不开对象。而在Java语言中,最常见的创建对象的方法是通过对类构造器的调用,除此之外,其实还有下面几种可以创建对象的方法。

1)通过反射机制来创建对象;

class Person{
String name="Jack";
public Person(){
System.out.println("construct");
}
public String toString(){return name;}
} public class Test{
public static void main(String[] args){
Class classType;
try{
classType=Class.forname("Person");
Person p = (Person)classType.newInstance();
System.out.println(p);
}cathch(Exception e){
e.printStackTrace();
}
}
}

程序的运行结果为:

construct

Jack

2)调用对象的clone方法,需要以下几个步骤才能使用clone方法:

(1)实现clone的类首先需要继承Cloneable接口实质上是一个标识接口,没有任何的接口方法,这一点和序列化接口Serializable()很类似。

(2)在类中重写Object类的clone方法。

(3)在clone方法中调用super.clone()。无论clone类的继承结构是什么,super.clone()都会直接或间接的调用Java.long.Object类中的clone()方法。

实例代码如下:

class Obj implement Cloneable{
private int aInt=0;
public Obj(){
System.out.println("construct");
}
public int getAint(){return aInt;}
public void changeInt(){this.aInt=1; }
public Object clone(){
Object o=null;
try{
o=(Obj)super.clone();
}catch(CloneNotSuppertedException e){
e.printStackTrace();
}
return 0;
}
}
public class Test{
public static void main(String[] args){
Obj a = new Obj();
Obj b = (Obj)a.clone();
b.changeInt();
System.out.println("a:"+a.getAInt());
System.out.println("b:"+b.getAInt());
}
}

程序的运行结果为:

construct

a:0

b:1

从以上的程序运行可以看出,在调用a.clone()方法时,系统创建了新的对象,但是没有调用构造方法。

3)通过反序列化的方式创建对象,实例代码如下:

       import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class Person implement Serilalizable{
private String name;
public Person(){
this.name="lili";
System.out.println("Construct");
}
public Stream toString(){return this.name;}
public static void main(String args[]){
Person p = new People();
System.out.println(p);
ObjectOutputStream oos=null;
ObjectInputStream ois = null;
try{
FileOutputStream fos =new
FileOutputStream("perpke.out");
oos=new ObjectOutputStream(fos);
oos.writeObject(p);
oos.close(0);
} catch(Exception ex){}
People pl;
try{
FileInputStream fis = new
FileInputStream("perple.out");
ois = new ObjectInputStream(fis);
p1=(People)ois.readObject();
System.out.println(p);
if(p!=p1)
System.out.println("two different
objecrt")
ois.close();
}catch(Exception ex){}
}
}

程序的运行结果为:

construct

lili

lili

two fifferent object

Java中不通过构造方法创建对象的方法总结的更多相关文章

  1. Java中产生随机数的两个方法

    Java中产生随机数的两个方法 一.利用random方法来生成Java随机数. 在Java语言中生成Java随机数相对来说比较简单,因为有一个现成的方法可以使用.在Math类中,Java语言提供了一个 ...

  2. java中获取日期和时间的方法总结

    1.获取当前时间,和某个时间进行比较.此时主要拿long型的时间值. 方法如下:  要使用 java.util.Date .获取当前时间的代码如下 Date date = new Date(); da ...

  3. java中遍历map对象的多种方法

    在Java中如何遍历Map对象   How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有ma ...

  4. java中常用的字符串的截取方法

    java中常用的字符串的截取方法   1.length() 字符串的长度 例:char chars[]={'a','b'.'c'}; String s=new String(chars); int l ...

  5. Java中的五种单例模式实现方法

    [代码] Java中的五种单例模式实现方法   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 2 ...

  6. 谈谈java中遍历Map的几种方法

    java中的map遍历有多种方法,从最早的Iterator,到java5支持的foreach,再到java8 Lambda,让我们一起来看下具体的用法以及各自的优缺点 先初始化一个map public ...

  7. Java中创建数组的几种方法

    Java中创建数组的几种方法 public static void main(String[] args) { //创建数组的第一种方法 int[] arr=new int[6]; int intVa ...

  8. Java中遍历map的四种方法 - 转载

    在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...

  9. JAVA中生成指定位数随机数的方法总结

    JAVA中生成指定位数随机数的方法很多,下面列举几种比较常用的方法. 方法一.通过Math类 public static String getRandom1(int len) { int rs = ( ...

随机推荐

  1. Madgwick算法详细解读

    Madgwick算法详细解读 极品巧克力 前言 接上一篇文章<Google Cardboard的九轴融合算法>. Madgwick算法是另外一种九轴融合的方法,广泛应用在旋翼飞行器上,效果 ...

  2. python学习——查找计算机中文件位置

    有时想查找某个文件时,却忘记了文件在计算机中存放的位置,这是一个经常遇到的问题. 当然如果你使用windows 7的话,可以直接用右上角的搜索框来搜索. 最近在学习python,正好拿这个来练练手,写 ...

  3. UEFI下win10+Ubuntu双启动后完全纯净卸载Ubuntu,重建BCD

    以下内容操作具有风险,操作前请提前备份数据.建议由有丰富经验的人使用,需要掌握diskpart. 背景 使用ubuntu+win10 dual boot后,需要重置回纯净win10系统. BCD是Bo ...

  4. hibernate方言

    hibernate中,方言是解决hql翻译成sql保证语法的正确,首先数据库都是支持sql的,不同的数据库会存在一些语法上面的差异.HQL则是基于对象的查询语言,当系统需要数据库的变换时,那么用hib ...

  5. C# 实现对PPT编辑

    C# Presentation 文本替换 我们可以通过插入占位符的方式,使用新的字词替换已有幻灯片里的文字. 本文将详细描述如何使用Spire.Presentation 来替换Prsentation ...

  6. Smarty配置与实例化

    在smarty文件夹下建立一个test文件夹,test下建立如下: 编辑test.php如下: <?php require('../smarty/Smarty.class.php'); $sma ...

  7. python传递任意数量的实参

    1.传递任意的实参 def make(*test):#带*号 print(test) make("one")#传递一个实参 make("one","t ...

  8. 执行“hdfs dfs -ls”时报ConnectException

    原因可能是指定的端口号不对,该端口号由hdfs-site.xml中的属性"dfs.namenode.rpc-address"指定,即为NameNode的RPC服务端口号. 文件上传 ...

  9. WCF服务编程 读书笔记——第2章 服务契约

    操作重载诸如 C++ 和 C# 等编程语言都支持方法重载,即允许具有相同名称的两个方法可以定义不同的参数.例如,如下的 C# 接口就是有效的定义: interface ICalculator { in ...

  10. Git代码行统计命令集

    统计某人的代码提交量,包括增加,删除: git log --author="$(git config --get user.name)" --pretty=tformat: --n ...