Java类的实例化

Java中,类的实例化方法一共有四种途径:

1.使用new操作符

2.调用Class对象的newInstance()方法

我们在自定义图书类这个例子中,编写了有参数的构造方法public Book(String name, String author, String ISBN)。但如果类中没有定义构造方法,编译器便会自动添加一个无参数的构造方法。使用构造方法创建对象虽然常用,但并不灵活。因此,我们再来了解一下动态化实例类,也就是调用Class对象的newInstance()方法,通过反射创建对象。了解一下反射的概念:

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

package com.shiyanlou.course;

import java.io.File;
import java.lang.reflect.Constructor;
//需要引用上述两个包

public class Test {

        public static void main(String[] args) {
            try {

                Constructor<File> constructor = File.class.getDeclaredConstructor(String.class);
                //获得File类的Constructor对象

                System.out.println("Create File Object with reflection."); 
                //使用反射创建File对象
                File file = constructor.newInstance("/home/shiyanlou/Desktop/MyFile.txt");
                System.out.println("Use File Object to create MyFile.txt on desktop.");
                //指定了创建的路径为桌面,名称为“MyFile.txt”

                file.createNewFile(); //创建新的文件
                System.out.println("File is created ?" + file.exists());
                //验证文件是否创建成功

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
}


3.调用clone()方法,对现有实例的拷贝。虽然Clone方法在Object中存在的,但是如果想要调用clone必须实现Cloneable接口。要实现深拷贝必须在clone方法中调用相应对象的clone函数。

public class Glasses implements Cloneable {
 
    private String color;
 
    public String getColor() {
       return color;
    }
 
    public void setColor(String color) {
       this.color = color;
    }
 
 
    protected Object clone() throws CloneNotSupportedException {
      
       return super.clone();
    }
   
}
 
//在Student类中包含Glasses,代码如下:
 
public class Student implements Cloneable{
 
    private String studentName;
 
    private Glasses glasses;
   
    private int age;
   
    public int getAge() {
       return age;
    }
 
    public void setAge(int age) {
       this.age = age;
    }
 
    public String getStudentName() {
       return studentName;
    }
 
    public void setStudentName(String studentName) {
       this.studentName = studentName;
    }
 
   
    public Glasses getGlasses() {
       return glasses;
    }
 
    public void setGlasses(Glasses glasses) {
       this.glasses = glasses;
    }
 
    protected Object clone() throws CloneNotSupportedException {
      
       Student student =  (Student) super.clone();
      
       student.glasses=   (Glasses) glasses.clone();
      
       return student;
      
    }
   
}
 
//如果想对Glasses进行拷贝,而不是仅仅克隆Glasses的引用,在clone方法中增加了student.glasses=   (Glasses) glasses.clone();
 
 

    public static void main(String args[]){
      
       Student student = new Student();
       student.setAge(10);
       student.setStudentName("xiaobai");
      
       Glasses glasses = new Glasses();
      
       glasses.setColor("red");
      
       student.setGlasses(glasses);
      
       try {
           Student s1  = (Student) student.clone();
           s1.setStudentName("xiaohei");
                 
           System.out.println("s1.color:"+s1.getGlasses().getColor());
       } catch (CloneNotSupportedException e) {
          
           e.printStackTrace();
       }
 
    }



4.通过ObjectInputStreamreadObject()方法反序列化类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值