初始化类和实例化对象之间的区别?

时间:2013-02-25 18:44:23

标签: java

我尝试通过搜索引擎搜索这个问题但是可以找到一个主题来解释初始化类和实例化对象之间的区别。

有人可以解释他们的不同之处吗?

5 个答案:

答案 0 :(得分:20)

有三个与此主题相关的术语:声明,初始化和实例化。

从后到前工作。

<强>实例化

这是为对象分配内存的时候。这就是new关键字正在执行的操作。从new关键字返回对创建的对象的引用。

<强>初始化

这是将值放入已分配的内存中的时间。这是使用new关键字时类的Constructor

还必须通过将对内存中某个对象的引用传递给它来初始化变量。

<强>声明

这是当你向程序说明将存在某种类型的对象以及该对象的名称时。

同一行的初始化和实例化示例

SomeClass s; // Declaration
s = new SomeClass(); // Instantiates and initializes the memory and initializes the variable 's'

在与内存不同的行上初始化变量的示例

void someFunction(SomeClass other) {
    SomeClass s; // Declaration
    s = other; // Initializes the variable 's' but memory for variable other was set somewhere else
}

我还强烈建议阅读this article关于Java如何处理传递变量的性质。

答案 1 :(得分:3)

当Java类“加载”到JVM中时,必须以多种方式初始化类表示。

  • 将类的“常量池”扩展为运行时结构,并初始化其中的某些值。
  • 该类的超类(通过常量池)及其提取的属性。
  • 为类的方法构造方法表。各个方法都标记为“尚未验证”。
  • 对类表示执行了几项验证操作。
  • 初始化静态字段。
  • 在第一次引用时,字符串文字是“实习”,并且实习字符串指针放在常量池中
  • 首次参考方法已经过“验证”。
  • 等。

有一组特定的术语用于引用类初始化,但我不记得具体细节。某些事情只能在一个类初始化到特定点之后发生,等等。

实例化对象只能在加载和初始化类之后发生(尽管所有方法都不需要验证)。对象的大小是从类中获得的,并且定位了多个堆并将其归零。使用指向类的指针和用于管理类的其他字段填充对象标头。然后调用类的相应构造函数方法(它将调用任何超级构造函数)。

答案 2 :(得分:3)

点originOne =新的点(23,94); -示例1

矩形rectOne =新的Rectangle(originOne,100,200); -示例2

1)声明:粗体设置的代码都是将变量名与对象类型相关联的所有变量声明。

2)实例化:新关键字是创建对象的Java运算符。

3)初始化:在new运算符之后是对构造函数的调用,该构造函数将初始化新对象。

参考:https://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html#:~:text=Instantiation%3A%20The%20new%20keyword%20is,which%20initializes%20the%20new%20object

答案 3 :(得分:-1)

使用静态初始化块完成类的初始化。 (静态的 { })。它不是一种方法,它是一个初始化器。它是在第一次引用类本身时执行的。

通过调用其构造函数,使用new关键字实例化对象。那时静态初始化块将不会被执行。

答案 4 :(得分:-1)

让我们测试吧!

初始化是指构造函数执行时。和实例化意味着将对象放置在ram上!

bash $ docker container ls -a --format="{{ json .Names }}" | jtc -J
[
   "hopeful_payne",
   "trusting_turing",
   "stupefied_morse",
   "unruffled_noyce",
   "pensive_fermi",
   "objective_neumann",
   "confident_bhaskara",
   "unruffled_cray",
   "epic_newton",
   "boring_bartik",
   "priceless_sinoussi",
   "naughty_grothendieck",
   "hardcore_bose",
   "sad_jones",
   "optimistic_napier",
   "trusting_stallman",
   "xenodochial_dijkstra",
   "pedantic_cocks"
]
bash $ 

输出

class Test{  

    Test(){
        System.out.println("The test class is initialized.");
    }  

    {
        System.out.println("The test class is instantiated.");
    }  

    public static void main(String args[]){  
        Test test = new Test();  
    }      
}