Java类的实例化

来源:互联网 发布:排序算法比较次数 编辑:程序博客网 时间:2024/05/23 10:48

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()方法反序列化类

0 0