您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

5种创建Java对象的方式

时间:2020-03-08 17:12:01  来源:  作者:

在本篇文章中,将介绍5种创建JAVA对象的方式。类是创建对象的基本模板,接下来将介绍5种不同的方式,利用Java类来实例化Java对象。

 

5种创建Java对象的方式

 

 

1. 使用new关键字

​ 采用new关键字实例化对象是Java中最为常见的方法,下面是采用new关键字实例化对象的示例。在开始之前,我们先准备好一个Java类:Student.java。

package com.ramostear.oops;

public class Student{
    private String name;
    private String nickname;

    public Student(String name,String nickname){
        this.name = name;
        this.nickname = nickname;
    }

    public String getName(){
        return name;
    }
    public void setName(String name){
        this.name = name;
    }

    public String getNickname(){
        return nickname;
    }
    public void setNickname(String nickname){
        this.nickname = nickname;
    }

}

接下来,我们通过new关键字来创建几个学生:

package com.ramostear.oops;
public class TestNewStudent{

    public static void main(String[] args){
        Student zhangsan = new Student("Zhangsan","张三");

        Student lisi = new Student();
        lisi.setName("Lisi");
        lisi.setNickname("李四");
    }
}

2. 使用Class类的newInstance()方法

​ 首先,我们可以通过Class.forName()方法动态加载目标类,然后再调用newInstance()方法,动态实例化对象。同理,在开始之前,我们需要准备一个目标类:Student.java。

package com.ramostear.oops;
public class Student{
    private String name = "Zhangsan";
    private String nickname = "张三";

    public Student(){
        super();
    }

    public Student(String name,String nickname){
        super();
        this.name = name;
        this.nickname = nickname;
    }

    public String getName(){
        return name;
    }
    public void setName(String name){
        this.name = name;
    }
    public String getNickname(){
        return nickname;
    }
    public void setNickname(String nickname){
        this.nickname = nickname;
    }
}

接下来,将演示如何通过newInstance()方法来创建新的对象:

package com.ramostear.oops;
public class TestUseNewInstanceMethod{
    public static void main(String[] args){
        try{
            String className = "com.ramostear.oops.Student";
            Class clz = Class.forName(className);
            Student student = (Student) clz.newInstance();
            System.out.println("student name :"+ student.getName()+", nickname: "+student.getNickname());
        }catch(InstantiationException | IllegalAccessException | ClassNotFoundException e){
            e.printStackTrace();
        }
    }
}

运行main()方法,将输出如下信息:

student name :Zhangsan, nickname:张三

3. 使用Constructor.newInstance()方法

​ 与Class类的newInstance()方法相似,我们还可以使用java.lang.reflect.Constructor类的newInstance()方法来创建新的对象。同样,我们先准备一个目标类:

package com.ramostear.oops;
public class Student{
    private String name = "Constructor";
    private String nickname = "构造器";

    public Student(){
        super();
    }

    public Student(String name,String nickname){
        super();
        this.name = name;
        this.nickname = nickname;
    }

    public String getName(){
        return name;
    }
    public void setName(String name){
        this.name = name;
    }
    public String getNickname(){
        return nickname;
    }
    public void setNickname(String nickname){
        this.nickname = nickname;
    }
}

接下来,我们看看如何使用Constructor的newInstance()方法创建新的对象:

package com.ramostear.oops;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class UseConstructorNewInstanceMethod{

    public static void main(String[] args){
        Constructor<Student> studentConstructor;
        try{
            studentConstructor = Student.class.getConstructor();
            Student student = studentConstructor.newInstance();
             System.out.println("student name :"+ student.getName()+", nickname: "+student.getNickname());
        }catch(InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException |
               NoSuchMethodException | SecurityException e){
            e.printStackTrace();
        }
    } 
}

执行main()方法,将在控制台输出如下信息:

student name:Constructor, nickname:构造器

4. 使用反序列化

​ 如果要使用反序列化创建对象,则目标类首先要实现Serializable接口。Serializable是一个标记接口。在本次示例中,我们先创建一个Student对象,并将其保存到data.txt文件中,然后在通过反序列化操作,读取data.txt中的数据,并创建新的对象。

package com.ramostear.oops;

import java.io.Serializable;

public class Student implements Serializable{
 private String name;
 private String nickname;

 public Student() {
  super();
 }

 public Student(String name, String nickname) {
  super();
  this.name = name;
  this.nickname = nickname;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public String getNickname() {
  return nickname;
 }

 public void setNickname(String nickname) {
  this.nickname = nickname;
 }
}

接下来,将通过一个简单的示例,演示如何使用反序列化的方式创建新的对象:

package com.ramostear.oops;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class StudentDemo {
    public static void main(String[] args) {
        String filePath = "data.txt";
        Student student1 = new Student("Deserialization", "反序列化");
        try {
            FileOutputStream fileOutputStream = new FileOutputStream(filePath);
            ObjectOutputStream outputStream = new ObjectOutputStream(fileOutputStream);
            outputStream.writeObject(student1);
            outputStream.flush();
            outputStream.close();

            FileInputStream fileInputStream = new FileInputStream(filePath);
            ObjectInputStream inputStream = new ObjectInputStream(fileInputStream);
            Student student2 = (Student) inputStream.readObject();

            inputStream.close();

            System.out.println("Student name:"+student2.getName()+", nickname:"+student2.getNickname());
        } catch (Exception ee) {
            ee.printStackTrace();
        }
    }
}

执行上述代码,将在控制台输出如下信息:

Student name:Deserialization,nickname:反序列化

5. 使用对象克隆创建新的对象

​ clone()方法可以创建现有对象的副本,但在使用clone()方法前,需保证模板类实现了Cloneable接口,Cloneable接口也是一个标记类接口。下面是使用克隆方式创建新对象的完整示例:

package net.javaguides.corejava.oops;

import java.io.Serializable;

public class Student implements Cloneable {
    private String name;
    private String nickname;

    public Student() {
        super();
    }

    public Student(String name, String nickname) {
        super();
        this.name = name;
        this.nickname = nickname;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    public static void main(String args[]) {
        Student stu1 = new Student("Clone", "克隆");
        try {
            Student stu2 = (Student) stu1.clone();
            System.out.println("Student name :"+stu2.getName()+",nickname:"+stu2.getNickanme());
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }
}

运行上述代码,控制台将输出如下信息:

Student name: Clone,nickname:克隆


Tags:Java对象   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
Redis具有很多值得推荐的功能,包括速度,可伸缩性和可用性。但是,有一个问题是Redis不包括对Java之类的编程语言的内置支持。相反,用户需要为Redis安装第三方Java客户端,例如Redis...【详细内容】
2020-06-03  Tags: Java对象  点击:(63)  评论:(0)  加入收藏
在本篇文章中,将介绍5种创建Java对象的方式。类是创建对象的基本模板,接下来将介绍5种不同的方式,利用Java类来实例化Java对象。 1. 使用new关键字​ 采用new关键字实例化对...【详细内容】
2020-03-08  Tags: Java对象  点击:(52)  评论:(0)  加入收藏
Java中的Live对象是什么?Java是一种面向对象的编程语言,这意味着在Java中几乎没有比对象更重要的概念了。Java中的对象的强大功能分布式对象,使您能够跨多个进程或计算机构建分...【详细内容】
2020-03-07  Tags: Java对象  点击:(63)  评论:(0)  加入收藏
Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Jav...【详细内容】
2019-10-15  Tags: Java对象  点击:(94)  评论:(0)  加入收藏
对象是什么Java是一个面向对象的语言,在Java中可以使用new关键字来产生一个对象,但这个对象到底是什么,应该具有哪些属性?首先跟我们自己先想下,Java对象已经有以下几个属性: 属于...【详细内容】
2019-08-05  Tags: Java对象  点击:(254)  评论:(0)  加入收藏
作者 l Hollis 来源 l Hollis(ID:hollischuang)JVM内存结构,是很重要的知识,相信每一个静心准备过面试的程序员都可以清楚的把堆、栈、方法区等介绍的比较清楚。 上图,是一张在作...【详细内容】
2019-07-30  Tags: Java对象  点击:(300)  评论:(0)  加入收藏
▌简易百科推荐
面向对象的特征之一封装 面向对象的特征之二继承 方法重写(override/overWrite) 方法的重载(overload)和重写(override)的区别: 面向对象特征之三:多态 Instanceof关键字...【详细内容】
2021-12-28  顶顶架构师    Tags:面向对象   点击:(2)  评论:(0)  加入收藏
一、Redis使用过程中一些小的注意点1、不要把Redis当成数据库来使用二、Arrays.asList常见失误需求:把数组转成list集合去处理。方法:Arrays.asList 或者 Java8的stream流式处...【详细内容】
2021-12-27  CF07    Tags:Java   点击:(3)  评论:(0)  加入收藏
文章目录 如何理解面向对象编程? JDK 和 JRE 有什么区别? 如何理解Java中封装,继承、多态特性? 如何理解Java中的字节码对象? 你是如何理解Java中的泛型的? 说说泛型应用...【详细内容】
2021-12-24  Java架构师之路    Tags:JAVA   点击:(5)  评论:(0)  加入收藏
大家好!我是老码农,一个喜欢技术、爱分享的同学,从今天开始和大家持续分享JVM调优方面的经验。JVM调优是个大话题,涉及的知识点很庞大 Java内存模型 垃圾回收机制 各种工具使用 ...【详细内容】
2021-12-23  小码匠和老码农    Tags:JVM调优   点击:(12)  评论:(0)  加入收藏
前言JDBC访问Postgresql的jsonb类型字段当然可以使用Postgresql jdbc驱动中提供的PGobject,但是这样在需要兼容多种数据库的系统开发中显得不那么通用,需要特殊处理。本文介绍...【详细内容】
2021-12-23  dingle    Tags:JDBC   点击:(13)  评论:(0)  加入收藏
Java与Lua相互调用案例比较少,因此项目使用需要做详细的性能测试,本内容只做粗略测试。目前已完成初版Lua-Java调用框架开发,后期有时间准备把框架进行抽象,并开源出来,感兴趣的...【详细内容】
2021-12-23  JAVA小白    Tags:Java   点击:(11)  评论:(0)  加入收藏
Java从版本5开始,在 java.util.concurrent.locks包内给我们提供了除了synchronized关键字以外的几个新的锁功能的实现,ReentrantLock就是其中的一个。但是这并不意味着我们可...【详细内容】
2021-12-17  小西学JAVA    Tags:JAVA并发   点击:(11)  评论:(0)  加入收藏
一、概述final是Java关键字中最常见之一,表示“最终的,不可更改”之意,在Java中也正是这个意思。有final修饰的内容,就会变得与众不同,它们会变成终极存在,其内容成为固定的存在。...【详细内容】
2021-12-15  唯一浩哥    Tags:Java基础   点击:(17)  评论:(0)  加入收藏
1、问题描述关于java中的日志管理logback,去年写过关于logback介绍的文章,这次项目中又优化了下,记录下,希望能帮到需要的朋友。2、解决方案这次其实是碰到了一个问题,一般的情况...【详细内容】
2021-12-15  软件老王    Tags:logback   点击:(19)  评论:(0)  加入收藏
本篇文章我们以AtomicInteger为例子,主要讲解下CAS(Compare And Swap)功能是如何在AtomicInteger中使用的,以及提供CAS功能的Unsafe对象。我们先从一个例子开始吧。假设现在我们...【详细内容】
2021-12-14  小西学JAVA    Tags:JAVA   点击:(22)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条