Java创建对象的4种方式
Java创建对象的方式共有四种:
- 使用new语句实例化一个对象;
- 通过反射机制创建对象;
- 通过clone()方法创建一个对象;
- 通过反序列化的方式创建对象。
一.使用new语句实例化一个对象
new语句实例化一个对象是最常见的用来创建对象的方式。我们看看通过反射机制创建对象。
二.通过反射机制创建对象
1.什么是反射机制?
反射机制是java的一个非常重要的特性,它允许程序在运行时进行自我检查,同时也允许对其内部的成员进行操作。反射机制提供的功能主要有:得到一个对象所属的类;获取一个类的所有成员变量和方法;在运行时创建对象;在运行时调用对象的方法。
2.通过反射机制创建对象
package com.java.test;
class Base{
public void f(){
System.out.println("Base");
}
}
class Sub extends Base{
//重写父类的成员方法
public void f(){
System.out.println("Sub");
}
}
public class CreateInstanceTest {
public static void main(String[] args){
try{
//参数必须为类的全路径
Class c=Class.forName("com.java.test.Sub");
//创建对象
Base b=(Base)c.newInstance();
b.f();
}catch(Exception e){
e.printStackTrace();
}
}
}
通过反射机制创建对象时,首先通过反射机制加载类获得Class类,获得Class类的方法主要有以下三种:
- Class.forName("类的全路径");
- 类名.Class;
- 实例.getClass();
其次使用newInstance()方法创建该类的对象。
3.new和newInstance()创建对象的区别在哪里?
- new是关键字,创建一个新类;newInstance()是方法,使用类加载机制,使用newInstance()必须保证这个类已经被加载;
- newInstance: 弱类型,低效率,只能调用无参构造;new: 强类型,相对高效,能调用任何public构造。
三.使用clone()方法创建一个对象
package com.java.test;
class Student implements Cloneable{
public int number;
public void setInt(int number){
this.number=number;
}
public int getInt(){
return number;
}
@Override
public Object clone(){
Student stu=null;
try{
stu=(Student)super.clone();
}catch(Exception e){
e.printStackTrace();
}
return stu;
}
}
public class CloneTest {
public static void main(String[] args){
Student stu1=new Student();
Student stu2=(Student)stu1.clone();
boolean flag=(stu1==stu2);
System.out.println("stu1和stu2是同一个对象吗?"+flag);
}
}
//stu1和stu2是同一个对象吗?false
使用clone()方法创建对象的步骤如下:
- 实现clone的类首先要继承Cloneable接口,class Student implements Cloneable{};
- 在类中重写Object中的clone()方法,@Override public Object clone() {}
- 在clone()方法中调用super.clone(),Student stu2 = (Student)stu1.clone();
- 把浅复制的引用指向原型对象新的克隆体,Student stu2 = (Student)stu1.clone();
四.通过反序列化创建一个对象
1.什么是反序列化?
序列化是一种将对象以一连串的字节描述的过程,可以将对象写在流里进行网络传输,或者保存到文件、数据库等系统里。与序列化相反的是反序列化,它将流转换为对象。
2.通过反序列化创建一个对象
package com.java.test; import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable; //Serializable-->标志性接口,表示该类的数据成员可以被序列化
public class People implements Serializable{
public String name;
public int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public People(){
this.name="Lili";
this.age=18;
}
public static void main(String[] args){
People p=new People();
ObjectOutputStream oos=null;
ObjectInputStream ois=null;
try{
FileOutputStream fos=new FileOutputStream("people.txt");
oos=new ObjectOutputStream(fos);
oos.writeObject(p);
oos.close();
}catch(Exception e){
e.printStackTrace();
}
//反序列化
try{
FileInputStream fis=new FileInputStream("people.txt");
ois=new ObjectInputStream(fis);
People p1=(People) ois.readObject();
System.out.println("p1和p是同一个对象吗?"+(p1==p));
}catch(Exception e){
e.printStackTrace();
}
}
}
//p1和p是同一个对象吗?false
序列化时首先创建一个输出流对象oos,使用oos的writeObject()方法将p对象写入oos对象中去。使用反序列化创建对象时,首先创建一个输入流对象ois,使用输入流对象ois的readObject()方法将序列化存入的对象读出,重新创建一个对象。
Java创建对象的4种方式的更多相关文章
- Java创建对象的4种方式?
[Java创建对象的4种方式?] 1)通过new语句实例化一个对象 2)通过反射机制创建对象 3)通过clone()方法创建一个对象 (复制) 4)通过反序列化方式创建对象
- Java创建对象的几种方式
解析:Java创建对象的几种方式(重要):(1) 用new语句创建对象,这是最常见的创建对象的方法.(2) 运用反射手段,调用java.lang.Class或者java.lang.reflect.Co ...
- &和&&的共同点和区别、Java字符含义和Java创建对象的几种方式
一.&和&&的共同点和区别 1.&和&&的联系(共同点): &和&&都可以用作逻辑与运算符,但是要看使用时的具体条件来决定. 操 ...
- Java创建对象的几种方式。
Java创建对象的几种方式(重要): (1) 用new语句创建对象,这是最常见的创建对象的方法. (2) 运用反射手段,调用java.lang.Class或者java.lang.reflect.Con ...
- 面试阿里,字节跳动,华为必须知道的Java创建对象的5种方式
Java创建对象的5种方式 1.直接new,调用了构造器2.通过clone(),没有调用构造器3.通过反射,调用了构造器4.通过反序列化,没有调用构造器5.通过Unsafe类的allocateInst ...
- Java基础知识强化25:Java创建对象的四种方式
1. Java程序中对象的创建有四种方式: ● 调用new语句创建对象,最常见的一种 ● 运用反射手段创建对象,调用java.lang.Class 或者 java.lang.reflect.Const ...
- 【Java基础】Java创建对象的五种方式
Java中创建(实例化)对象的五种方式 1.用new语句直接创建对象,这是最常见的创建对象的方法. 2.通过工厂方法返回对象,如:String str = String.valueOf(23); 3. ...
- Java 创建对象的几种方式
转自https://www.cnblogs.com/wxd0108/p/5685817.html 作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象.然而 ...
- java创建对象的四种方式
1.最常见的 new 一个 2使用反射机制创建对象,直接调用非构造函数 Class obj=Class.forName("A"); A a=obj.newInstance(); C ...
随机推荐
- Java泛型之自限定类型
在<Java编程思想>中关于泛型的讲解中,提到了自限定类型: class SelfBounded<T extends SelfBounded<T>> 作者说道: 这 ...
- Java 错误提示org.apache.poi.POIXMLException: java.lang.reflect.InvocationTargetException
java 操作excel文件 发布后报错 org.apache.poi.POIXMLException: java.lang.reflect.InvocationTargetException XSS ...
- Vue语法学习第四课(2)——class与style的绑定
之前学到的指令 v-bind 在用于绑定class和style时,表达式结果可以是字符串.数组.对象. 一.绑定HTMLClass ① 对象语法 <div class="static& ...
- 2018-2019-2 网络对抗技术 20165326 Exp3 免杀原理与实践
免杀原理与实践 目录 知识点问答 实践内容 遇到的问题 心得体会 知识点 meterpreter免杀 基础问题回答 杀软是如何检测出恶意代码的? 特征码(基于签名):模式匹配,比对特征码库 启发式:通 ...
- C 设计模式:装饰模式
最近在公司分享了下C语言版的设计模式,记录一下吧. 参考:<设计模式之禅>中“装饰模式”章节. 上面书中是用C++来实现的,我使用了书中的例子,改用C语言来实现. 一.基础知识 面向对象最 ...
- wpf binging(四) 不明确的目标绑定
并不是每个控件都被设置了 Name 属性 ,有时候 我们只知道 他与某个控件的层级关系, 示例: AncestorType:类型代表要寻找的控件的类型 Ancestprlevel:偏移量 ,比如 1 ...
- L1 loss 与 MSE
---恢复内容开始--- 今天在训练时遇到的问题 把损失函数由 MSE 改成 L1 Loss 的时候 Loss 有了明显的下降 以前一直觉得 MSE 相对来说会更好 ,因为求导的话有标签与结果的差值作 ...
- Date对象方法
创建Date new Date() Date对象方法: get系列: getDate() 返回一个月中的某一天(1-31) getDay() ...
- asp.net 获取 repeater checkbox 值
webform中获取repeat控件列表下的checkbox选中的值: 码农上代码: public static string getSelectedIDs(Repeater Rpt_) { stri ...
- Could not find a version that satisfies the requirement PIL
Python Imageing Library 简称 PIL Python常用的图像处理库之一 Pillow是PIL一个fork. C:\Users\dangzhengtao>pip insta ...