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 ...
随机推荐
- python3.6 连接mysql数据库问题
最近有个项目欲安装MySQL-python/1.2.5一直失败. 环境: win7 python3.6.2 报错信息如下: Creating library build\temp.win32-3.6\ ...
- Xcode Archive打包失败问题
ionic3项目 完成 模拟器 真机测试均可以打包安装成功 在Archive的时候报错了 错误如下 code signing is required for product type 'Applic ...
- 修改VScode行号区的背景颜色
vs code是相当不错的一个编辑器,现阶段我用来编写nim程序. vs code非常丧心病狂一点就是行号区和编辑区的背景颜色都是一样, 这样会导致要看行首有没有对齐会非常吃力.这个问题让我纠结了非常 ...
- protel项目创建
File->New->Project->PCB Project//新建PCB项目 Save Project As... Project->Add New to Project- ...
- CSS效果:checkbox点选效果
HTML: <html lang="en"> <head> <meta charset="UTF-8"> <meta ...
- vue项目中如何使用less
首先你的vue-cli下载完成 第一步 安装less-loader 依赖 npm install less less-loader --save-dev 直接自动就配置上了,不用手动配置 ...
- QT自定义控件系列(二) --- Loading加载动画控件
本系列主要使用Qt painter来实现一些基础控件.主要是对平时自行编写的一些自定义控件的总结. 为了简洁.低耦合,我们尽量不使用图片,qrc,ui等文件,而只使用c++的.h和.cpp文件. 由于 ...
- Github远程仓库提交代码步骤
1.克隆远程仓库 1)当没有设置默认目录时 git clone 仓库地址 本地存放目录 //没有目录的情况 2)当设置了本地存放目录时 先打开路径,命令: ...
- django 模型操作
# 添加 Fruit.objects.create(name='Apple') # 更新 UserProfile.objects.filter(user=admin).update(**{'onlin ...
- 2017年java面试题【集合篇】
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大和简单易用两个特征. 这里有10个经典的Java面试题,也为大 ...