java - new + 类名,一定需要申明一个对象吗?
巴扎黑
巴扎黑 2017-04-18 10:53:33
0
4
588
public class CodeBlock02
{
    {
      System.out.println("第一代码块");    
    }
    
    public CodeBlock02()
    {
        System.out.println("构造方法");
        }
        
        {
          System.out.println("第二构造块");
      }
   public static void main(String[] args) 
    {
          new CodeBlock02();
          new CodeBlock02();
          new CodeBlock02();
           
    }
}    

在这里, new CodeBlock02(); 或者换成 CodeBlock02 code = new CodeBlock02();
他们是一样的吗!

巴扎黑
巴扎黑

membalas semua(4)
Ty80

Pertama-tama jelaskan beberapa konsep kod Java dijalankan dalam jvm, dan kawasan memori jvm dibahagikan kepada beberapa modul:

  • Daftar Kaunter Program: Kaunter program ialah kawasan memori yang agak kecil yang digunakan untuk menunjukkan baris kod bait yang dilaksanakan oleh utas semasa telah dilaksanakan Ia boleh difahami sebagai Nombor baris penunjuk untuk benang semasa. Apabila jurubahasa bytecode berfungsi, ia akan mengambil arahan pernyataan dengan menukar nilai kaunter ini.

  • JVM Stack: Apabila setiap kaedah thread dilaksanakan, bingkai tindanan (Statck Frame) akan dibuat dan jadual pembolehubah setempat disimpan dalam bingkai tindanan , stesen operasi , pautan dinamik, kaedah keluar, dsb. Apabila kaedah dipanggil, bingkai tindanan ditolak ke dalam tindanan JVM Apabila pelaksanaan kaedah selesai, bingkai tindanan akan muncul daripada tindanan.

  • Timbunan Kaedah Asli: Timbunan kaedah asli adalah sama dengan timbunan mesin maya dari segi fungsi, mekanisme pengendalian, jenis pengecualian, dll. Satu-satunya perbezaan ialah: timbunan mesin maya ialah Laksanakan kaedah Java, manakala tindanan kaedah tempatan digunakan untuk melaksanakan kaedah asli Dalam banyak mesin maya (seperti mesin maya HotSpot lalai Sun), tindanan kaedah tempatan dan tindanan mesin maya digunakan bersama.

  • Timbunan: Kawasan timbunan ialah kawasan paling penting untuk memahami mekanisme Java GC, tiada bar. Kawasan timbunan ialah sekeping memori terbesar yang diuruskan oleh JVM Kawasan timbunan juga merupakan kawasan ingatan utama yang diuruskan oleh mekanisme GC Java Kawasan timbunan dikongsi oleh semua benang dan dicipta apabila mesin maya dimulakan. Kawasan timbunan wujud untuk menyimpan contoh objek Pada dasarnya, semua objek diperuntukkan memori pada kawasan timbunan (tetapi dalam teknologi moden, ini tidak begitu mutlak, dan beberapa objek diperuntukkan secara langsung pada timbunan).

  • Kaedah Kawasan: (juga dikenali sebagai generasi kekal Kawasan kaedah ialah kawasan yang dikongsi oleh setiap benang dan digunakan untuk menyimpan maklumat kelas yang telah dimuatkan oleh mesin maya (). iaitu Maklumat yang perlu dimuatkan semasa memuatkan kelas, termasuk versi, medan, kaedah, antara muka dan maklumat lain), pemalar akhir, pembolehubah statik, kod yang disusun oleh pengkompil secara on-the-fly, dsb.

  • Memori Langsung: Memori langsung bukan memori yang diuruskan oleh JVM Ia boleh difahami bahawa memori langsung ialah memori mesin selain daripada JVM Sebagai contoh, jika anda mempunyai memori 4G, JVM menduduki 1G, dan baki 3G adalah memori langsung Terdapat kaedah peruntukan memori berdasarkan saluran dan penimbal dalam JDK Pustaka fungsi asli yang dilaksanakan dalam bahasa C diperuntukkan dalam ingatan langsung, dan disimpan dalam DirectByteBuffer dalam timbunan JVM untuk rujukan. . Memandangkan memori langsung dihadkan oleh memori mesin ini, pengecualian OutOfMemoryError juga mungkin berlaku.

Setelah memahami konsep asas ini, mari kita lihat kawasan yang meragui penyoal. Sebenarnya, apa yang ditanyakan oleh penyoal ialah apakah rujukan objek di Jawa dan apakah hubungannya dengan proses instantiasi objek.

Jangan risau, mari kita analisa dahulu cara rujukan dilaksanakan dalam Java:

Akses rujukan Java melibatkan tiga kawasan ingatan: JVM tindanan, timbunan dan kawasan kaedah.

Ambil rujukan pembolehubah tempatan yang paling mudah: Object obj = new Object() sebagai contoh:

  • Obj objek mewakili rujukan setempat, yang disimpan dalam jadual pembolehubah setempat bagi timbunan JVM dan mewakili data jenis rujukan;

  • Objek() baharu disimpan dalam timbunan sebagai data objek contoh;
  • Alamat maklumat jenis kelas Objek (antara muka, kaedah, medan, jenis objek, dll.) juga direkodkan dalam timbunan dan data yang dilaksanakan oleh alamat ini disimpan dalam kawasan kaedah;

  • Terdapat banyak kaedah pelaksanaan khusus, pemegang adalah salah satu daripadanya, dan hubungannya adalah seperti yang ditunjukkan dalam rajah.


Anda harus memahaminya apabila anda melihat ini. Maklumat kelas itu sendiri, data contoh kelas, dan maklumat rujukan yang menunjuk ke objek diletakkan di kawasan kaedah, kawasan timbunan, dan kawasan timbunan java masing-masing. Dalam contoh soalan:

CodeBlock02 code = new CodeBlock02();

kod ialah rujukan yang disimpan dalam jadual pembolehubah setempat, yang menunjuk kepada data contoh objek dalam timbunan. Data contoh objek ini diperoleh melalui

.

Sedikit lebih spesifik:

1. 你写的 CodeBlock02.java 文件存放了 CodeBlock02 类的定义,当 jvm 的类加载器加载这个java文件的时候,将其中的类型定义语句存放在了 jvm 的方法区中。

2. 但是这个时候并没有在堆中生成这个对象的实例,也就是说,这个时候因为没有对象,你并不能调用 CodeBlock02 类的非静态方法。

3. 什么时候获取的对象呢?就是在用 new 关键字执行了本类的构造方法以后 new CodeBlock02() 从这时候开始通过 new 关键字和类的构造器, jvm 在虚拟机的堆区创建了一个 CodeBlock02 类的实例,并返回这个实例的引用,同时你也可以通过这个引用调用它的非静态方法了。
new CodeBlock02()Ringkasnya, kod ialah "kawalan jauh" yang anda gunakan untuk menerima tika yang dihasilkan oleh yang baharu. Ia menunjukkan lokasi khusus objek ini dalam kawasan timbunan.
PHPzhong

Anda perlu memahami rujukan java

Kod CodeBlock02 = CodeBlock02();

Yang di sebelah kiri dipanggil pembolehubah jenis CodeBlock02.

Yang di sebelah kanan dipanggil objek jenis CodeBlock02.

Anda juga boleh membiarkan pembolehubah ini menghala ke dua objek berbeza daripada jenis yang sama secara bergilir-gilir.

CodeBlock02 code;
CodeBlock02 code1 = new CodeBlock02();
CodeBlock02 code2 = new CodeBlock02();
code = code1;
//code.doSomething(); 相当于 code1.doSomething();
code = code2;
//code.doSomething(); 相当于 code2.doSomething();

Anda juga boleh membuat pembolehubah jenis ini menunjuk ke objek subkelas jenis ini:

MyClass m = new SubMyClass(); //SubMyClass 继承于 MyClass

Anda juga boleh memanggil kaedah terus pada objek yang dicipta oleh baru seperti ini:

new CodeBlock02().doSomething();
Peter_Zhu

Kedua-duanya adalah objek pengisytiharan

Jika anda tidak meneruskan operasi pada nilai ini kemudian, ia akan menjadi sama sama ada anda menetapkannya atau tidak

codeBlock02() baharu // Jika tiada nilai diberikan selepas pengisytiharan, tiada cara untuk terus beroperasi pada objek ini

kod CodeBlock02 = new CodeBlock02(); // Berikan objek yang diisytiharkan kepada pembolehubah, dan seterusnya operasi boleh dilakukan

PHPzhong

Yang di sebelah kiri ialah pembolehubah rujukan objek, dan yang di sebelah kanan ialah objek yang sebenarnya diperuntukkan dalam ingatan.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!