この記事では、Java の値による呼び出しを例とともに分析します。皆さんの参考に共有してください。具体的な分析は次のとおりです。
Java は参照によってオブジェクト インスタンスを操作します
確認できるのは、Javaでオブジェクトを操作する方法は参照によるオブジェクトの操作であるということです。これをより深く理解するために、次のコードを書きました。
まずカスタム タイプを定義します。コードは次のとおりです。
文字列名。
人(文字列名){
this.name = 名前;
}
}
ここでの名前はデフォルトで public になります (これは C++ のクラスのデフォルト属性とは異なります)。
Main 関数の呼び出しは次のようになります。
次のようにコードをコピーします。 public class Main {
/**
* @param 引数
*/
public static void main(String[] args) {
// TODO 自動生成されたメソッド スタブ
人物 p1 = 新しい人物("ポール");
人物 p2 = 新しい人物("グリーフェン");
System.out.println("p1.name = " + p1.name + " p2.name = " + p2.name);
人の体温
tmp = p1;
p1 = p2;
System.out.println("tmp.name = " + tmp.name + " p1.name = " + p1.name + " p2.name = " + p2.name);
}
}
このときの出力は以下の通りです。
次のようにコードをコピーします: p1.name = Paul p2.name = Griefen
tmp.name = ポール p1.name = グリーフェン p2.name = グリーフェン
はぁ?なぜこのような結果になるのでしょうか? CPPerとして私は混乱しています!参照なので、次のステートメントを実行した後、次のようにコードをコピーします。
tmp = p1;
p1 = p2;
この操作は C++ の参照の概念に従って理解しているため、この時点では tmp p1 p2 はすべて同じオブジェクトである必要があります。つまり、これらはすべてオブジェクト p2 を指しているはずです。しかし、出力はこの理解が間違っていることを明らかに証明しています。 Java の参照は C++ の参照と同じではないのでしょうか? ! ! ! C++のポインタと同じものでしょうか?
良い!この演算処理をC++のポインタに従って理解してみましょう。
まず、 Person tmp; はポインターを宣言します。これは C++ のポインター宣言に似ています。 C++ では、このように参照宣言を個別に記述することはできないと明確に規定されています。参照宣言が行われるときは、最初のステップの推論が正しいことは明らかです。これは良いスタートです!次に、 tmp = p1; p1 = p2; 明らかに、tmp は p1 を指し、p1 は p2 を指します。一貫性があることが分かりました!
つまり、Java の参照を C++ のデータ操作と比較すると、C++ のポインターの概念により似ているはずです。
C++ のポインターは上記の関数を実装します。
Java でオブジェクトを操作する上記のメソッドは C++ のポインターに似ているため、次のようにコードをコピーして C++ で上記のメソッドを実装する方法を見てみましょう。
#include <文字列>
#include <iostream>
クラス人
{
公共:
std::文字列名;
公共:
人(std::文字列名)
{
this->name = 名前;
};
};
int _tmain(int argc, _TCHAR* argv[])
{
人* p1 = 新しい人("ポール");
人* p2 = 新しい人("グリーフェン");
std::cout<< "p1.name " << p1->name << " p2.name = " << p2->name << std::endl;
人* tmp;
tmp = p1;
p1 = p2;
std::cout<<"tmp.name" << tmp->name << " p1.name " << p1->name << " p2.name = " << p2->name << std::endl ;
tmpを削除します。
p1 を削除します。
0を返します。
}
デバッグ後、出力結果は上記の Java 実行結果と同じであることがわかりました。
どの言語でも基本的な実装は同じです
Java での参照効果は C++ でのポインタと同じように見えるのに、なぜ Java では直接ポインタと呼ばれないのでしょうか?明らかに違いがあります。たとえば、Java の参照は ++ 操作を実行できませんが、C++ のポインタは自由に移動できます。明らかに、現時点で Java はポインタを制限し、より安全に実行できるようにするために、ポインタに対して多くの作業を行っています。しかし、上の層がどんなに大きく見えても、下の層に到達するとメモリを申請する必要があり、メモリが使い果たされた後は解放する必要があります。これはどの言語でも機能します。
この記事が皆さんの Java プログラミングに役立つことを願っています。