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()方法创建对象的步骤如下:

  1. 实现clone的类首先要继承Cloneable接口,class Student implements Cloneable{};
  2. 在类中重写Object中的clone()方法,@Override public Object clone() {}
  3. 在clone()方法中调用super.clone(),Student stu2 = (Student)stu1.clone();
  4. 把浅复制的引用指向原型对象新的克隆体,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种方式的更多相关文章

  1. Java创建对象的4种方式?

     [Java创建对象的4种方式?] 1)通过new语句实例化一个对象 2)通过反射机制创建对象 3)通过clone()方法创建一个对象  (复制) 4)通过反序列化方式创建对象

  2. Java创建对象的几种方式

    解析:Java创建对象的几种方式(重要):(1) 用new语句创建对象,这是最常见的创建对象的方法.(2) 运用反射手段,调用java.lang.Class或者java.lang.reflect.Co ...

  3. &和&&的共同点和区别、Java字符含义和Java创建对象的几种方式

    一.&和&&的共同点和区别 1.&和&&的联系(共同点): &和&&都可以用作逻辑与运算符,但是要看使用时的具体条件来决定. 操 ...

  4. Java创建对象的几种方式。

    Java创建对象的几种方式(重要): (1) 用new语句创建对象,这是最常见的创建对象的方法. (2) 运用反射手段,调用java.lang.Class或者java.lang.reflect.Con ...

  5. 面试阿里,字节跳动,华为必须知道的Java创建对象的5种方式

    Java创建对象的5种方式 1.直接new,调用了构造器2.通过clone(),没有调用构造器3.通过反射,调用了构造器4.通过反序列化,没有调用构造器5.通过Unsafe类的allocateInst ...

  6. Java基础知识强化25:Java创建对象的四种方式

    1. Java程序中对象的创建有四种方式: ● 调用new语句创建对象,最常见的一种 ● 运用反射手段创建对象,调用java.lang.Class 或者 java.lang.reflect.Const ...

  7. 【Java基础】Java创建对象的五种方式

    Java中创建(实例化)对象的五种方式 1.用new语句直接创建对象,这是最常见的创建对象的方法. 2.通过工厂方法返回对象,如:String str = String.valueOf(23); 3. ...

  8. Java 创建对象的几种方式

    转自https://www.cnblogs.com/wxd0108/p/5685817.html 作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象.然而 ...

  9. java创建对象的四种方式

    1.最常见的 new 一个 2使用反射机制创建对象,直接调用非构造函数 Class obj=Class.forName("A"); A a=obj.newInstance(); C ...

随机推荐

  1. jQuery 核心函数

    $() ;/  jQuery () ;  就代表调用 jQuery 的核心函数. 1. 接收一个函数. $(function(){ alret('hello world'); }); 2. 接收一个字 ...

  2. js datagrid 移动去重

    function dataLeft(){ var checkedData = $(listTemplate_right).datagrid('getChecked'); var rows = $(li ...

  3. Linux系统调用列表(转)

    以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数.这可能是你在互联网上所能看到的唯一一篇中文注释的Linux系统调用列表,即使是简单的字母序英文列表,能做到这么完 ...

  4. MVP 实践

    今天有时间看了看google的官方文档,下载todo源码,仔细研读了一下,觉得其思想对开发还是有很大帮助的.个人认为,MVP通过Activity与业务逻辑的解耦,其作为Controller的职责更加单 ...

  5. python 函数返回值(总结)

    关键字:return 没有返回值的叫过程 def test1(): msg="我是一个过程" print(msg) 有return的叫函数 def test02(): msg=&q ...

  6. L342 Air Pollution Is Doing More Than Just Slowly Killing Us

    Air Pollution Is Doing More Than Just Slowly Killing Us In the future, the authorities might need to ...

  7. Shell 函数相关

    一.函数的两种定义方式 第一种:函数名(){ ...... } 第二种:function 函数名{ ...... } 调用时直接使用 函数名 调用,将函数当作一个“命令”即可.函数内部直接使用 $1. ...

  8. styled-components的基本使用

    一.官网地址 https://www.styled-components.com/ 二.styled-components 1.styled-components 样式化组件,主要作用是它可以编写实际 ...

  9. bat给文件追加换行内容

    如果有很多文件怎么给文件结尾追加换行内容呢? bat似乎没有专门的换行符,要实现似乎只能echo一下 set filename="123.txt" echo.>>%fi ...

  10. 运维chroot语法

    chroot命令 chroot命令用来在指定的根目录下运行指令.chroot,即 change root directory (更改 root 目录).在 linux 系统中,系统默认的目录结构都是以 ...