java中的this随处可见,用法也多。通常情况下理解this关键字还是很容易的,但是在我初学的时候,有一个疑问却一直不能很清晰的理解,现在慢慢的理解了,下面通过本文给大家记录下,有需要的朋友参考下
我们通常在用Java中的this关键字的时候,都知道this是代表正在调用这个类的方法的当前实例。通常情况下理解this关键字还是很容易的,但是在我初学的时候,有一个疑问却一直不能很清晰的理解,现在慢慢的理解了,就想把它记下来,也许有人和我有相同的疑问,说不定可以帮助到别人。我们还是先简单的看看通常情况下this的作用吧。比如下面的代码:
public class Leaf { private int i = 0; Leaf increment() { i++; return this; } void print() { System.out.println("i = " + i); } public static void main(String[] args) { Leaf x = new Leaf(); x.increment().increment().print(); } }
在Leaf类的main方法中,我们new了一个Leaf实例 x,然后x实例调用increment()
方法。如果increment()是普通的方法或者void方法,这个地方就没有什么值得我们研究的了。特殊的是,在increment()
方法中,我们return的是一个this,这个this代表的就是我们刚刚创建的x。因为x正在调用increment()方法,所以,increment()
方法this就很明显代表的是Leaf的x实例了。
这看起来没有什么可讨论的,this就是代表的调用该方法的实例x。可是,假如我们把main()函数修改成下面的样子
public static void main(String[] args) { Leaf x = new Leaf(); x.increment().increment().print(); Leaf y = new Leaf(); y.increment().increment().print(); }
以上修改的代码中,我们增加创建了一个Leaf实例y,然后y也连续调用调用了两次increment()。现在问题来了,假如 x,y同时调用的increment()方法,那么this到底能代表谁呢?你可能会觉得这有什么问题,x调用increment()方法,this就代表x, y调用increment()方法,this就代表y。可问题是,当我们讲调用方法的时候,在jvm层面上是找到Leaf类中increment()
方法所在的内存地址,然后在java虚拟机栈中创建栈帧.
然后在栈帧中执行方法里面的代码。现在看到了吧,也就是说,在jvm执行方法层面,没有所谓的x调用,y调用了,那么,方法中的this到底是怎么确定指向哪个实例的呢?
我们还是来看看Leaf类字节码中是怎么展示的,是不是我们漏了什么,如果我们没有把x实例或者y实例传递到方法里面去,那么,在jvm执行方法的时候,是不可能知道this具体指向哪个实例的。
到这里,我们看到在increment()
方法中,编码中没有参数,但是在字节码里面却显示参数个数为1,仔细想想,结果已经很明显了:jvm在执行编译的时候,在实例方法中,会默认隐藏的传递一个参数,这个参数就是当前调用的实例本身。比如x调用,隐藏就把x传过去,y调用,就把y传过去。所以,我们的this才能在jvm执行方法层面确定到底指向的是谁。
上面的结论是我们自己推断出来的,有没有那本书对这个有详细的描述呢?《java编程思想》里面,对这块是这样描述的:
假定我们在一个方法的内部,并希望获得当前对象的句柄。由于那个句柄是由编译器“秘密”传递的,所以没有标识符可用。然而,针对这一目的有个专用的关键字:this。
在里面讲的这个编译器秘密传递的句柄,就是我们这里的这个隐藏参数。
到此为止,关于this的描述想必已经很清楚了,我们在jvm层面对它进行了理解。那么,各位有没有兴趣在看下下面的这个例子,想想这个基类B中的this代表了什么呢?
public class B { public B() { System.out.println(this.getClass().getSimpleName()); System.out.println(((A) this).a); } } public class A extends B { public int a = 100; public A() { a = 200; } public static void main(String[] args) { new A(); } }
这个例子原本是为了了解java具有继承结构的时候类是怎么完成初始化的,可是这里面的B类中的构造函数比较特殊:B类中的构造函数中的this输出的SimpleName是A。通常我们遇到的情况,B类中的this输出的SimpleName应该是B,可是这里却是A?为什么?
在上面我们讲this的过程中,其实已经涉及到这块了,在调用java方法创建栈帧的时候,jvm会秘密的传递一个当前实例。所以,当我们在执行A的构造函数的时候,默认会调用父类B的构造函数,在调用父类B构造函数的时候,秘密的传进去的当前实例是 A的实例----因为是在A的构造函数中调用的B,所以,这个地方的this反而代表了A。
Atas ialah kandungan terperinci 详解Java关键字this(动力节点整理). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

JVM Mengendalikan Perbezaan API Sistem Operasi melalui JavanativeInterface (JNI) dan Perpustakaan Standard Java: 1. JNI membenarkan kod Java untuk memanggil kod tempatan dan terus berinteraksi dengan API Sistem Operasi. 2. Perpustakaan Standard Java menyediakan API bersatu, yang dipetakan secara dalaman kepada API sistem operasi yang berbeza untuk memastikan kod tersebut berjalan di seluruh platform.

modularitydoesnotdirectlyaffectjava'splatformindected.java'splatformindectenceismaintybythejvm, butmodularityinfluencesapplicationstructureandManagement, indirectlyimpactingplatformindect.1) DeploymentandmentandmentweMbecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecombecom

BytecodeinjavaistheintermediaterepresentationThateNableSplatformindant.1) javacodeiscompiledintobytecodestoredin.classfiles.2)

JavaachievesplatformindependencethroughavavaVirtualMachine (JVM), yang mana -yexeCuteSbytecodeonanydeviceWIjvm.1)

Kemerdekaan platform dalam pembangunan Javagui menghadapi cabaran, tetapi boleh ditangani dengan menggunakan swing, javafx, penampilan penyatuan, pengoptimuman prestasi, perpustakaan pihak ketiga dan ujian silang platform. Pembangunan Javagui bergantung pada AWT dan Swing, yang bertujuan untuk menyediakan konsistensi rentas platform, tetapi kesan sebenar berbeza dari sistem operasi ke sistem operasi. Penyelesaian termasuk: 1) Menggunakan Swing dan Javafx sebagai Toolkit GUI; 2) menyatukan penampilan melalui uimanager.setlookandfeel (); 3) mengoptimumkan prestasi untuk memenuhi platform yang berbeza; 4) menggunakan perpustakaan pihak ketiga seperti Apachepivot atau SWT; 5) Melaksanakan ujian silang platform untuk memastikan konsistensi.

Javadevelopmentisnotentirelyplatform-independentduetoseveralfactors.1) jvmvariationsaffecperformanceandbehavioracrossdifferentos.2) nativelibrariesviajniintroduceplatform-specificiSsues.3)

Kod Java akan mempunyai perbezaan prestasi apabila berjalan pada platform yang berbeza. 1) Strategi pelaksanaan dan pengoptimuman JVM adalah berbeza, seperti OracleJDK dan OpenJDK. 2) Ciri -ciri sistem operasi, seperti pengurusan memori dan penjadualan thread, juga akan menjejaskan prestasi. 3) Prestasi boleh ditingkatkan dengan memilih JVM yang sesuai, menyesuaikan parameter JVM dan pengoptimuman kod.

Java'splatformindecthaslimitationscludingperformanceOverhead, VersionCompateIssues, cabaranwithnativelibraryintegration, platform-specificfeatures, danjvminstallation/penyelenggaraan.


Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Pelayar Peperiksaan Selamat
Pelayar Peperiksaan Selamat ialah persekitaran pelayar selamat untuk mengambil peperiksaan dalam talian dengan selamat. Perisian ini menukar mana-mana komputer menjadi stesen kerja yang selamat. Ia mengawal akses kepada mana-mana utiliti dan menghalang pelajar daripada menggunakan sumber yang tidak dibenarkan.

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

Penyesuai Pelayan SAP NetWeaver untuk Eclipse
Integrasikan Eclipse dengan pelayan aplikasi SAP NetWeaver.

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

EditPlus versi Cina retak
Saiz kecil, penyerlahan sintaks, tidak menyokong fungsi gesaan kod
