Java中的新运算符
当你在Java中声明一个类时,你只是在创建一个新的数据类型。类提供对象的蓝图。您可以从一个类中创建一个对象。然而,获取一个类的对象是一个两步过程:
- 声明:首先,您必须声明一个类类型的变量。此变量未定义对象。相反,它只是一个可以引用对象的变量。以下是带有示例的声明的一般语法:
Syntax : class-name var-name; Example : // declare reference to an object of class Box Box mybox;
处于这种状态的变量,当前没有引用任何对象,可以说明如下(变量名,mybox,加上指向任何对象的引用):
- 实例化和初始化:其次,您必须获取对象的实际物理副本并将其分配给该变量。您可以使用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对象的引用):
因此,类变量的声明、类的实例化和类对象的初始化可以一起说明如下:
要点:
- 以上两条语句可以重写为一条语句。
Box mybox = new Box();
- new运算符返回的引用不必分配给类变量。它也可以直接用在表达式中。例如:
double height = new Box().height;
- 由于数组是Java中的对象,因此在实例化数组时,我们使用new运算符。例如:
int arr[] = new int[5];
- 此时,您可能想知道为什么不需要对原始数据类型使用new运算符。答案是 Java 的原始类型不是作为对象实现的。相反,它们被实现为“正常”变量。这样做是为了提高效率。对于原始数据类型的对象版本,请参阅 Wrapper Classes。
- 短语“实例化一个类”与“创建一个对象”的含义相同。当您创建一个对象时,您正在创建一个类的“实例”,因此“实例化”了一个类。
分配对象引用变量
当您将一个对象引用变量分配给另一个对象引用变量时,您并没有创建对象的副本,您只是制作了引用的副本。让我们通过一个例子来理解这一点。
// 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引用的对象副本的引用。也就是说,您可能认为b1和b2指的是独立且不同的对象。然而,这是错误的。相反,在这个片段执行之后, b1和b2都将引用同一个对象。 b1到b2的分配没有分配任何内存或复制原始对象的任何部分。它只是让b2引用与b1相同的对象。因此,通过b2对对象所做的任何更改都会影响b1所引用的对象,因为它们是同一个对象。当我们通过b2改变盒子的高度时,同样可以通过输出来验证。
这种情况可以说明如下:
注意:虽然b1和b2都引用同一个对象,但它们没有以任何其他方式链接。例如,对b1的后续分配将简单地将b1从原始对象中解开,而不影响对象或影响b2 。例如:
Box b1 = new Box();
Box b2 = b1;
// ...
b1 = null;
在这里, b1已设置为null ,但b2仍指向原始对象。
将对象引用变量传递给方法
当我们将对象引用传递给方法时,接收它的参数将引用与参数引用的对象相同的对象。要通过示例了解更多信息,请参阅Java中的传递和返回对象。