我们常说,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. Maven详解【面试+工作】 各种安装 没用

    1 Maven介绍1.1 项目开发中遇到的问题 1.都是同样的代码,为什么在我的机器上可以编译执行,而在他的机器上就不行? 2.为什么在我的机器上可以正常打包,而配置管理员却打不出来? 3.项目组加入 ...

  2. C#中一个窗口是一个类呢,还是一个窗口类的实例呢?(转)

    C#中一个窗口是一个类呢,还是一个窗口类的实例呢? 答: 没有一个人说到重点上. 一个窗口,它不是仅仅用一个类可以描述的: 首先,这个窗口的数据类型类型,是从Form类派生下来的,也就是说它的定义是一 ...

  3. Spring.net页面属性注入

    .条件spring.web程序集 1.1 system.web配置 <httpHandlers> <add verb="*" path="*.aspx& ...

  4. [原创]COCOS2DX 3.8 增加protobuf为external库

    此处为记录防止忘记,最近使用COCOS练习一些新的库,所以需要把PROTOBUF编译进去,看上去很麻烦,这里记录一下,以防忘记. 首先下载protobuf 2.5.0版本,下载地址请自行百度. 准备工 ...

  5. windows server2012如何开启mysql远程登录

    开发的首要任务就是要搭建起自己的服务器,下面主要是我这搭建记录下 我的各种环境 服务器为Windows server2012  安装的MySQL数据的版本是5.6.10 ,64位.当然了版本对于安装没 ...

  6. 关于如何在服务器上搭建tomcat并发布自己的web项目

    最近在学习如何在服务起上搭建tomcat,并发布自己的项目,自己是花了一下午的时间才把里面的东西弄明白,各种百度,各种请教大神,真的是备受折磨啊.好了废话不多说,直接进入主题. 1:众所周知,tomc ...

  7. cef相关

    chrome命令行参数:https://www.cnblogs.com/hushaojun/p/5981646.html cef启动调试,启动的命令行:--disable-web-security - ...

  8. linux命令的笔记

    1.改变目录的用户组和所有者 chown 命令 如下图: 可以看到test1与test2的的所有者和所属组都是root,其中 第三个字段是说明目录拥有者, 第四个字段是文件拥有者所在的组, 第五个字段 ...

  9. iOS应用开发之Persistence持久化[转]

    持久化(Persistence) 持久化(Persistence)意思就是当你退出app的时候它还会存在.NSUserDefaults就是一个非常简单的持久化方案,不过这有限制,它只能是很小的东西,通 ...

  10. (转)jQuery插件编写学习+实例——无限滚动

    原文地址:http://www.cnblogs.com/nuller/p/3411627.html 最近自己在搞一个网站,需要用到无限滚动分页,想想工作两年有余了,竟然都没有写过插件,实在惭愧,于是简 ...