当您在java中声明一个类时,您只是在创建一个新的数据类型。类为对象提供蓝图。您可以从类中创建对象。然而,获取类的对象需要两个步骤:
声明:首先,必须声明一个类类型的变量。这个变量没有定义对象。相反,它只是一个可以引用对象的变量。下面是声明的一般语法和一个示例:
Syntax :
class-name var-name;
Example :
// declare reference to an object of class Box
Box mybox;
处于这种状态的变量当前不引用任何对象, 可以如下所示(变量名称mybox加上指向无内容的引用):
实例化和初始化:其次,您必须获得对象的实际、物理副本,并将其赋值给该变量。您可以使用new操作符来实现这一点。new操作符通过动态分配(i。e,在运行时分配)新对象的内存,并返回对该内存的引用。然后,这个引用被存储在变量中。因此,在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如何动态分配内存之前,让我们先来看看class Box prototype。
class Box
{
double width;
double height;
double depth;
}
变量在第二步之后,当前引用的是一个类对象,如下所示(变量名mybox,加上一个指向Box对象的引用):
因此, 可以一起说明类变量的声明, 类的实例化和类的对象的初始化:
重要事项:
- 以上两个语句可以重写为一个语句。
Box mybox = new Box();
- 引用返回的新运算符不必分配给类变量。也可以直接在表达式中使用。例如:
double height = new Box().height;
- 以来数组是Java中的对象, 因此在实例化数组时, 我们使用新操作员。例如:
int arr[] = new int[5];
- 此时, 你可能想知道为什么不需要使用新运算符基本数据类型。答案是Java的原始类型未实现为对象。相反, 它们被实现为"普通"变量。这样做是为了提高效率。有关原始数据类型的对象版本, 请参见包装类.
- 短语"实例化一个类"的含义与"创建对象"相同。创建对象时, 将创建类的"实例", 因此将"实例化"一个类。
分配对象参考变量
当将一个对象引用变量分配给另一对象引用变量时, 你不是在创建对象的副本, 而只是在创建引用的副本。让我们通过一个例子来理解这一点。
// 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都将引用同一个对象。的分配b1tob2没有分配任何内存或复制原始对象的任何部分。它只是使b2引用相同的对象b1。因此, 通过b2会影响到哪个对象b1是指, 因为它们是同一对象。当我们更改时可以通过输出验证相同高度盒装b2.
这种情况可以说明如下:
注意 :虽然b1和b2两者都引用同一个对象, 因此没有其他任何链接。例如, 后续分配给b1只会脱钩 b1从原始对象开始, 而不影响对象或影响b2。例如 :
Box b1 = new Box();
Box b2 = b1;
// ...
b1 = null;
这里, b1已设置为null, 但是b2仍然指向原始对象。
将对象引用变量传递给方法
当我们将对象引用传递给方法时, 接收该方法的参数将引用与参数所引用的对象相同的对象。要了解更多有关示例的信息, 请参阅Java中的传递和返回对象。
如果发现任何不正确的地方, 或者想分享有关上述主题的更多信息, 请写评论。