面试关:同学你好,请Java有几种创建对象的方式? 我这有有台 Mac ,你能否手写实现?
Java创建对象的4种方式
1. Java 反序列化创建对象
2.Java 通过 new 创建对象
3. Java 通过 new 创建对象 Java 通过 克隆创建对象
4. Java通过 反射 创建对象
下面用到的User对象
/**
* @author ggbond
* date2022-06-22
* User 对象
**/
public class User implements Cloneable, Serializable {
//历史序列化对象的反序列化 版本号不一致的情况解决
private static final long serialVersionUID = 1L;
private String username;
private String pwd;
@Override
protected User clone() throws CloneNotSupportedException {
return (User) super.clone();
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
public User(String username, String pwd) {
this.username = username;
this.pwd = pwd;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
-
Java 反序列化创建对象
- 先 序列化保存对象
/** * @author ggbond * date2022-06-22 * 01序列化和反序列化进行对象生成 **/ public class B_0622 { //序列化 保存对象 public static void main(String[] args) throws IOException { FileOutputStream fileOutputStream = null; ObjectOutputStream objectOutputStream =null; //序列化 try { fileOutputStream = new FileOutputStream("user01.object"); objectOutputStream = new ObjectOutputStream(fileOutputStream); User user01=new User("ggbond","123456"); objectOutputStream.writeObject(user01); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { objectOutputStream.flush(); objectOutputStream.close(); } } }
/** * @author ggbond * date2022-06-22 **/ public class B_0622_1 { public static void main(String[] args) throws IOException, ClassNotFoundException { //反序列化 FileInputStream fileInputStream = new FileInputStream("user01.object"); ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream); User user = (User) objectInputStream.readObject(); System.out.println(user.toString()); } }
-
Java 通过 new 创建对象
/** * @author ggbond * date2022-06-22 * 02 new 一个对象 **/ public class B_0622_2 { public static void main(String[] args) throws CloneNotSupportedException { User user = new User("ggbond02", "123456"); } }
-
Java 通过 克隆创建对象
/** * @author ggbond * date2022-06-22 * 03 通过实现Cloneable 接口 的clone 方法实现 克隆对象 **/ public class B_0622_3 { public static void main(String[] args) throws CloneNotSupportedException { User user = new User("ggbond03", "123456"); User user02 = user.clone(); System.out.println(user02.toString()); } }
-
Java通过 反射 创建对象
/** * @author ggbond * date2022-06-22 * 04 反射 获得对象 **/ public class B_0622_4 { public static void main(String[] args) throws CloneNotSupportedException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { //01.多种获得类对象方法- 通过 User类的全路径 获得类对象 再获取类对象实例 User user04_1 = (User) Class.forName("blog.User").getConstructor().newInstance(); user04_1.setUsername("ggbond04_00"); user04_1.setPwd("123456"); System.out.println(user04_1.toString()); //02.多种获得类对象方法- 通过 User类.class 调用构造器方法 获得类对象 再获取类对象实例 User user04_2 = User.class.getConstructor().newInstance(); user04_2.setUsername("ggbond04_01"); user04_2.setPwd("123456"); System.out.println(user04_2.toString()); //02.多种获得类对象方法- 通过 User类.class 直接 获得类对象 再获取类对象实例 // jdk 9 以后就 不建议 使用 ,建议通过 上面02 构造器方法 User user04_3 = User.class.newInstance(); user04_3.setUsername("ggbond04_02"); user04_3.setPwd("123456"); System.out.println(user04_3.toString()); } }