📜  在Java创建包装类实例的不同方法

📅  最后修改于: 2022-05-13 01:54:55.418000             🧑  作者: Mango

在Java创建包装类实例的不同方法

包装类 其对象包装或包含原始数据类型的类。当我们为包装类创建一个对象时,它包含一个字段,在这个字段中,我们可以存储原始数据类型。换句话说,我们可以将原始值包装到包装类对象中。

方法:

我们可以使用两种方式来构造 Wrapper Classes 的实例

  1. 使用包装类的构造函数
  2. 使用 Wrapper 类提供的 valueOf() 方法
  3. 使用自动装箱的概念

让我们分别详细讨论这两种方式

方法一:使用包装类的构造函数



句法:

ClassName object = new ClassName(argument);

插图:

Integer number = new Integer(5);

方法二:使用 Wrapper 类提供的 valueOf() 方法

句法:

ClassName object = ClassName.valueOf(argument);

插图:

Integer number = Integer.valueOf(5);

现在问题来了,这两种方法在创建 Wrapper 类的实例时有什么区别,哪种方法更适合构造实例。让我们实现这两种方法以在它们之间公平竞争。

执行:

例子



Java
// Importing input output classes 
import java.io.*;
  
// Main class
class GFG {
  
    // Main driver method
    public static void main (String[] args) {
  
        // Creating and initializing two integer numbers
        // Value is passed as an argument to which it is initialized
          
        // Custom entries  
        // Number 1 where N = 5
        Integer num1 = new Integer(5);
        // Number 2 where N = 5
        Integer num2 = new Integer(5);
          
        // Creating objects of Integer class
        // using valueOf() method
      
        // Again, creating and initializing two integer numbers
        // Value is passed as an argument to which it is initialized
        Integer num3 = Integer.valueOf(5);
        Integer num4 = Integer.valueOf(5);
          
  
        // Now by far, all the objects contain the same value
        // N = 5
          
        // Boolean will return true if numbers are equal
        // else eturning false
  
        // Comparing two numbers  
        boolean value1 = (num1 == num2);
        boolean value2 = (num3 == num4);
          
        // Print and display the bool results 
        System.out.println(value1);
        System.out.println(value2);
    }
}


Java
// Importing input output classes
import java.io.*;
  
// Main class 
class GFG {
    
    // Main driver method 
    public static void main (String[] args) {
          
      // Creating Instances using AutoBoxing
      Integer num1 = 5;
      Integer num2 = 5;
        
      boolean bool = (num1 == num2);
      System.out.println(bool);
    }
}


输出:

false
true

输出说明:

请注意,类的实例指向在堆中分配的内存位置,并且它们本身不保存该值。当我们在包装类的构造函数的帮助下创建对象时,每次在堆中分配新的内存并且对象指向不同的内存位置。因此,在上面的例子中,在这种情况下,num1 和 num2 都指向不同的内存位置,因此在比较时,它们返回 false。

请注意 valueOf() 方法的情况并非如此,因为 valueOf() 方法检查是否有任何内存分配给堆中该类的相同值。如果找到该值,则它将先前分配给新实例的内存位置提供给新实例,并且两者都开始指向堆中的相同内存位置。因此,在比较时,它返回 true。

由于包装类对象的值与 String 一样是不可变的,因此一旦分配就无法更改,因此它不会影响指向同一内存位置的实例数量。因此,在上面的示例中,内存分配给值 5 并且 num3 指向该内存位置,但是当我们创建另一个具有相同值的实例 num4 时,它也开始指向与 num3 指向的相同内存位置.

目前,不推荐使用构造函数创建实例的方法,因此最好使用 valueOf() 方法。因此,让我们继续讨论自动装箱的新概念。

方法三:使用自动装箱的概念

AutoBoxing 是为了减少我们每次创建实例时编写 valueOf() 方法的工作量,实现了 AutoBoxing。将基本类型自动转换为其相应包装器类的对象称为自动装箱。

到目前为止,我们一直在使用valueOf()方法创建包装类,但是当我们可以使用 AutoBoxing 时似乎很长。在 AutoBoxing 中,我们的工作由编译器完成,即后台的Java编译器将执行 valueOf() 操作并创建它的实例。



使用自动装箱创建的实例在后台遵循 valueOf() 的过程,因此在这种情况下,具有相同值的多个实例指向相同的内存位置。

说明:在上面的例子中,它也可以写成Integer.valueOf(15) ) 并将它的引用放在对象中(即一个数字)。

Integer number = 15;

句法:

ClassName object = value;                 
// of primitive data type associated with the wrapper class.

例子:

Java

// Importing input output classes
import java.io.*;
  
// Main class 
class GFG {
    
    // Main driver method 
    public static void main (String[] args) {
          
      // Creating Instances using AutoBoxing
      Integer num1 = 5;
      Integer num2 = 5;
        
      boolean bool = (num1 == num2);
      System.out.println(bool);
    }
}
输出
true

输出说明:

num1 和 num2 都指向堆中相同的内存位置,正如我们在valueOf()方法中讨论的那样。