Java中不通过构造方法创建对象的方法总结
我们常说,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中不通过构造方法创建对象的方法总结的更多相关文章
- Java中产生随机数的两个方法
Java中产生随机数的两个方法 一.利用random方法来生成Java随机数. 在Java语言中生成Java随机数相对来说比较简单,因为有一个现成的方法可以使用.在Math类中,Java语言提供了一个 ...
- java中获取日期和时间的方法总结
1.获取当前时间,和某个时间进行比较.此时主要拿long型的时间值. 方法如下: 要使用 java.util.Date .获取当前时间的代码如下 Date date = new Date(); da ...
- java中遍历map对象的多种方法
在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有ma ...
- java中常用的字符串的截取方法
java中常用的字符串的截取方法 1.length() 字符串的长度 例:char chars[]={'a','b'.'c'}; String s=new String(chars); int l ...
- 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 ...
- 谈谈java中遍历Map的几种方法
java中的map遍历有多种方法,从最早的Iterator,到java5支持的foreach,再到java8 Lambda,让我们一起来看下具体的用法以及各自的优缺点 先初始化一个map public ...
- Java中创建数组的几种方法
Java中创建数组的几种方法 public static void main(String[] args) { //创建数组的第一种方法 int[] arr=new int[6]; int intVa ...
- Java中遍历map的四种方法 - 转载
在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...
- JAVA中生成指定位数随机数的方法总结
JAVA中生成指定位数随机数的方法很多,下面列举几种比较常用的方法. 方法一.通过Math类 public static String getRandom1(int len) { int rs = ( ...
随机推荐
- Linux安装设置VNC远程桌面
1,先检查一下服务器是否已经安装了VNC服务,没有安装,检查服务器的是否安装VNC的命令如下[root@linuxidc rpms]# ps -eaf|grep vncroot 1789 ...
- Git blame
一.简介 git blame可以将文件中的每一行的作者.最新的变更提交和提交时间展示出来. 二.实例 http://blog.csdn.net/hudashi/article/details/76 ...
- spark reduceByKey
reduce(binary_function) reduce将RDD中元素前两个传给输入函数,产生一个新的return值,新产生的return值与RDD中下一个元素(第三个元素)组成两个元素,再被传给 ...
- 最小生成树 prim
1.算法思想: 图采用邻接矩阵存储,贪心找到目前情况下能连上的权值最小的边的另一端点,加入之,直到所有的顶点加入完毕. 2.算法实现步骤: 设图G =(V,E),其生成树的顶点集合为U. (1)把v0 ...
- win10 64位 python3.6 django1.11 MysqlDB No module named 'MySQLdb' 安装MysqlDB报错 Microsoft Visual C++ 14.0 is required
在python3.6中操作数据库,再按python2.7安装MySQLdb进行数据库连接已经不可用了,我使用的是另外一个方法:PyMySQL,安装好之后还是不能直接连接MySQL的,启动项目后报No ...
- 【转载】Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式…)介绍
转载地址:http://blog.csdn.net/truong/article/details/46711045 关键字:Redis的Java客户端Jedis的八种调用方式(事务.管道.分布式…)介 ...
- javascript总结38: 神奇的this
1 this的特性 this 是在函数中的 this 的指向 是在函数调用的时候决定的 this的指向. 谁调用这个函数,函数中的this就指向谁 function fn (){ console.lo ...
- 解决Visual C++工程中包含 .c 或cpp文件编译时产生的.pch预编译头错误(C1853)的办法
2014-01-17 23:36 5128人阅读 评论(1) 收藏 举报 分类: 资料集(282) 版权声明:本文为博主原创文章,未经博主允许不得转载. 之前使用网上的一个开源代码,被封装成Windo ...
- Gym - 100989G (二分法)
There are K hours left before Agent Mahone leaves Amman! Hammouri doesn't like how things are going ...
- centos 7 安装jdk8
到官网下载jdk http://www.oracle.com/technetwork/java/javase/downloads/index.html 选择liunx的tar.gz文件下载 下载好后 ...