📜  Java中的新运算符

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

Java中的新运算符

当你在Java中声明一个类时,你只是在创建一个新的数据类型。类提供对象的蓝图。您可以从一个类中创建一个对象。然而,获取一个类的对象是一个两步过程:

    1. 声明:首先,您必须声明一个类类型的变量。此变量未定义对象。相反,它只是一个可以引用对象的变量。以下是带有示例的声明的一般语法:
      Syntax :
      class-name var-name;
      
      Example :
      // declare reference to an object of class Box
      Box mybox;
      

      处于这种状态的变量,当前没有引用任何对象,可以说明如下(变量名,mybox,加上指向任何对象的引用):

    2. 实例化和初始化:其次,您必须获取对象的实际物理副本并将其分配给该变量。您可以使用new运算符执行此操作。 new运算符通过为新对象动态分配(即在运行时分配)内存并返回对该内存的引用来实例化一个类。然后将此引用存储在变量中。因此,在Java中,所有类对象都必须动态分配。

      new运算符之后还调用了一个类构造函数,该构造函数初始化了新对象。构造函数定义创建类的对象时发生的情况。构造函数是所有类的重要组成部分,具有许多重要的属性。在下面的示例中,我们将使用默认构造函数。下面是实例化和初始化的一般语法,带有一个示例:

      Syntax :
      var-name = new class-name();
      
      Example :
      // instantiation via new operator and 
      // initialization via default constructor of class Box
      mybox = new Box();
      

      在了解new是如何动态分配内存之前,我们先来看一下Box类的原型。

      class Box
      {
          double width;
          double height;
          double depth;
      }
      

      第二步后的一个变量,当前引用一个类对象,可以说明如下(变量名mybox,加上一个指向Box对象的引用):

    因此,类变量的声明、类的实例化和类对象的初始化可以一起说明如下:

    要点:

    1. 以上两条语句可以重写为一条语句。
      Box mybox = new Box();
      
    2. new运算符返回的引用不必分配给类变量。它也可以直接用在表达式中。例如:
      double height = new Box().height;
      
    3. 由于数组是Java中的对象,因此在实例化数组时,我们使用new运算符。例如:
      int arr[] = new int[5];
      
    4. 此时,您可能想知道为什么不需要对原始数据类型使用new运算符。答案是 Java 的原始类型不是作为对象实现的。相反,它们被实现为“正常”变量。这样做是为了提高效率。对于原始数据类型的对象版本,请参阅 Wrapper Classes。
    5. 短语“实例化一个类”与“创建一个对象”的含义相同。当您创建一个对象时,您正在创建一个类的“实例”,因此“实例化”了一个类。

    分配对象引用变量

    当您将一个对象引用变量分配给另一个对象引用变量时,您并没有创建对象的副本,您只是制作了引用的副本。让我们通过一个例子来理解这一点。

    // Java program to demonstrate assigning 
    // of object reference variables
      
    // Box class
    class Box
    {
        double width;
        double height;
        double depth;
    }
      
    // Driver class
    public class Test
    {
        // Driver method
        public static void main(String[] args) 
        {
            // creating box object
            Box b1 = new Box();
              
            // assigning b2 to b1
            Box b2 = b1;
              
            // height via b1 and b2
            System.out.println(b1.height);
            System.out.println(b2.height);
              
            // changing height via b2
            b2.height = 20;
              
            // height via b1 and b2
            // after modification through b2
            System.out.println(b1.height);
            System.out.println(b2.height);
        }
          
    }
    

    输出 :

    0.0
    0.0
    20.0
    20.0
    

    解释 :

    首先让我们了解以下片段在上述程序中的作用。

    Box b1 = new Box();
    Box b2 = b1;
    

    您可能认为b2被分配了对b1引用的对象副本的引用。也就是说,您可能认为b1b2指的是独立且不同的对象。然而,这是错误的。相反,在这个片段执行之后, b1b2都将引用同一个对象。 b1b2的分配没有分配任何内存或复制原始对象的任何部分。它只是让b2引用与b1相同的对象。因此,通过b2对对象所做的任何更改都会影响b1所引用的对象,因为它们是同一个对象。当我们通过b2改变盒子的高度时,同样可以通过输出来验证。

    这种情况可以说明如下:

    注意:虽然b1b2都引用同一个对象,但它们没有以任何其他方式链接。例如,对b1的后续分配将简单地将b1从原始对象中解开,而不影响对象或影响b2 。例如:

    Box b1 = new Box();
    Box b2 = b1;
    // ...
    b1 = null;
    

    在这里, b1已设置为null ,但b2仍指向原始对象。

    将对象引用变量传递给方法

    当我们将对象引用传递给方法时,接收它的参数将引用与参数引用的对象相同的对象。要通过示例了解更多信息,请参阅Java中的传递和返回对象。