用 Java 创建对象的不同方法

原文: https://javabeginnerstutorial.com/core-java-tutorial/different-ways-to-create-an-object-in-java/

您必须知道使用new关键字创建类的对象,但这不是创建对象的唯一方法。

还有其他几种创建类对象的方法:

  • 使用new关键字
  • 使用新实例(反射)
  • 使用克隆
  • 使用反序列化
  • 使用ClassLoader
  • …不知道了 🙂

使用new关键字

使用new关键字是创建对象的最基本方法。 new关键字可用于创建类的对象。

  1. public class ObjectCreationExample {
  2. public static void main(String[] args) {
  3. // Here we are creating Object of JBT using new keyword
  4. JBT obj = new JBT();
  5. }
  6. }
  7. class JBT{
  8. String Owner;
  9. }

使用newInstance(反射)

您是否曾经尝试使用 Java 中的 JDBC 驱动程序连接到数据库? 如果您的回答是肯定的,那么您必须已经看到“Class.forName”。 我们还可以使用它来创建类的对象。 Class.forName实际上是在 Java 中加载该类,但未创建任何对象。 要创建对象,必须使用Class类的newInstance方法。

  1. /*
  2. * Here we will learn to create Object of a class without using new Operator.
  3. * But newInstance method of Class class.
  4. */
  5. class CreateObject {
  6. public static void main(String[] args) {
  7. try {
  8. Class cls = Class.forName("JBTClass");
  9. JBTClass obj = (JBTClass) cls.newInstance();
  10. JBTClass obj1 = (JBTClass) cls.newInstance();
  11. System.out.println(obj);
  12. System.out.println(obj1);
  13. } catch (ClassNotFoundException e) {
  14. e.printStackTrace();
  15. } catch (InstantiationException e) {
  16. e.printStackTrace();
  17. } catch (IllegalAccessException e) {
  18. e.printStackTrace();
  19. }
  20. }
  21. }
  22. class JBTClass {
  23. static int j = 10;
  24. JBTClass() {
  25. i = j++;
  26. }
  27. int i;
  28. @Override
  29. public String toString() {
  30. return "Value of i :" + i;
  31. }
  32. }

如果要以这种方式创建对象,则类需要具有公开的默认构造器。

使用Clone

我们还可以使用Clone()方法创建现有对象的副本

  1. /*
  2. * Here we will learn to create an Object of a class without using new Operator.
  3. * For this purpose we will use Clone Interface
  4. */
  5. class CreateObjectWithClone {
  6. public static void main(String[] args) {
  7. JBTClassClone obj1 = new JBTClassClone();
  8. System.out.println(obj1);
  9. try {
  10. JBTClassClone obj2 = (JBTClassClone) obj1.clone();
  11. System.out.println(obj2);
  12. } catch (CloneNotSupportedException e) {
  13. e.printStackTrace();
  14. }
  15. }
  16. }
  17. class JBTClassClone implements Cloneable {
  18. @Override
  19. protected Object clone() throws CloneNotSupportedException {
  20. return super.clone();
  21. }
  22. int i;
  23. static int j = 10;
  24. JBTClassClone() {
  25. i = j++;
  26. }
  27. @Override
  28. public String toString() {
  29. return "Value of i :" + i;
  30. }
  31. }

关于克隆的其他说明

  • 在这里,我们正在创建现有对象而不是任何新对象的克隆。
  • 克隆方法在Object类中声明为受保护的。 因此,只能在子类或同一包中对其进行访问。 这就是为什么它在类上被覆盖的原因。
  • 类需要实现Cloneable接口,否则它将引发CloneNotSupportedException

使用对象反序列化

对象反序列化也可以用于创建对象。 它产生与序列化对象相反的操作。

使用ClassLoader

我们也可以使用ClassLoader创建类的对象。 这种方式与Class.forName选项相同。

  1. /*
  2. * Here we will learn to Create an Object using Class Loader
  3. */
  4. public class CreateObjectWithClassLoader {
  5. public static void main(String[] args) {
  6. JBTClassLoader obj = null;
  7. try {
  8. obj = (JBTClassLoader) new CreateObjectWithClassLoader().getClass()
  9. .getClassLoader().loadClass("JBTClassLoader").newInstance();
  10. // Fully qualified classname should be used.
  11. } catch (InstantiationException e) {
  12. e.printStackTrace();
  13. } catch (IllegalAccessException e) {
  14. e.printStackTrace();
  15. } catch (ClassNotFoundException e) {
  16. e.printStackTrace();
  17. }
  18. System.out.println(obj);
  19. }
  20. }
  21. class JBTClassLoader {
  22. static int j = 10;
  23. JBTClassLoader() {
  24. i = j++;
  25. }
  26. int i;
  27. @Override
  28. public String toString() {
  29. return "Value of i :" + i;
  30. }
  31. }
下一篇文章