[ジャワ] Javaでの順列機能 – Javaでのスワップ
関数スワップの実装 (スワップ – 変換) Javaでは、C / C やPascalとは多少異なります,… 関数の外に変数の値を変更するには、オブジェクトを使用する必要があります. あなたはを参照することができます 2 VDは、あなたがそれが混乱し、コードを読むために発見した場合、最初に以下の説明を読んでいただくか、下記の詳細を読みたい場合は、以下のその後、その後、コンテンツを交換するためのコードに戻る.
VD1: オブジェクトを使用して、
package VietSource.net.temp; import java.util.Scanner; class Number { // lop Number int num; public Number(int num) { // ham khoi tao this.num = num; } public int getNum() { // ham tra ve gia tri num return num; } public void setNum(int num) { // ham set gia tri num this.num = num; } } public class MySwap { private void swap(Number a, Number b) { // ham hoan vi int temp = a.getNum(); // gan num cua a cho temp a.setNum(b.getNum()); // gan num cua b cho a b.setNum(temp); // gan temp cho num cua b } public static void main(String[] args) { Number a, b; // hai doi tuong Number a va b MySwap sw = new MySwap(); // doi tuong sw thuoc lop MySwap Scanner scan = new Scanner(System.in); System.out.print("Nhap a = "); a = new Number(scan.nextInt()); // khoi tao a voi num la so nhap vao System.out.print("Nhap b = "); b = new Number(scan.nextInt()); // khoi tao b voi num la so nhap vao scan.close(); System.out.println("Befor swap: a = " + a.getNum() + " b = " + b.getNum()); sw.swap(a, b); // su dung ham swap System.out.println("After swap: a = " + a.getNum() + " b = " + b.getNum()); } }
最高経営責任者(CEO 2 最後のセグメントを使用してください (物質はまた、オブジェクト配列である)
package VietSource.net.temp; import java.util.Scanner; public class SwapArray { private void swapArray(int arr[], int i, int j){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } public static void main(String[] args) { SwapArray sw = new SwapArray(); Scanner scan = new Scanner(System.in); int arr[] = new int[2]; System.out.print("Nhap a = "); arr[0] = scan.nextInt(); System.out.print("Nhap b = "); arr[1] = scan.nextInt(); System.out.println("Befor swap: a = " + arr[0] + " b = " + arr[1]); sw.swapArray(arr, 0, 1); System.out.println("After swap: a = " + arr[0] + " b = " + arr[1]); scan.close(); } }
困難の一つ (と物議を醸す) 値渡しとして、JavaプログラミングのC プログラマのためか
パス参照により. 例:
Object a = new Object("Object A"); //kỳ quặc với C++: Object* a = new ... Object b = a; b.setNewName("Object B");
はっきりと名前を変更しているC オブジェクトBの開発者の理解によると、全体のオブジェクトの関係もありません. 実際には別のJavaによる, 「オブジェクトB」は両方のBオブジェクトのようであるように、オブジェクトには名前を持つことになります. オブジェクトAと完全に「独立した「Bオブジェクトへ: オブジェクトB = a.clone();
しかし、関数のスワップ() このような方法で動作するJavaは参照渡し.
private void swap(Type arg1, Type arg2) { Type temp = arg1; arg1 = arg2; arg2 = temp; }
だから、!!! Javaは、実際にどのように? 迷路を採用した論争の陰に隠れるので、何?
最初は値渡し、関数内で使用される「可変」のパラメータ値のコピーによって送信されることを理解する必要がある. 関数が戻るときに、それがコピーされたパラメータを破壊する, と渡されたパラメータが変更を影響されない. それに反して、実際には、実際のパラメータを作成するには、別名参照渡しです. ときに直接渡されたパラメータを変更するパラメータの内容変更. ラージオブジェクトにCPUを保存した後にC でコピーを作るに失敗, コピーと/の複合体を初期化する.
それが邪魔に値渡し動作するので、Javaでスワップ機能が動作しません. スワップ機能はARG1とarg2のを返した後、側面を切り替えることができません. しかし、奇妙なことに、関数本体のスワップは、オブジェクト型を変更するメソッドを呼び出した場合, 例えば: arg1.setValue(“変更”);
この考え方によると、値渡し関数スワップの終了後に変更することはできませARG1. 現実は異なっている, ARG1と呼ばれるのsetValue() 機能を終了するときに、引数1の値が変更されました. Cの参照の概念が存在しないことを思い出してください (&). しかし、Cがポインタ (ポインタ) そしてそれは参照することなく強力なCの柔軟性を行う. Javaはポインタを持っていない? 多くの人々がいることを信じている: オブジェクト参照渡しでもあるさプリミティブは値渡しされる (Javaで, オブジェクトは参照によって渡されます, そしてプリミティブは値で渡されます。) この句は、半分だけ正しい. 合格-値によってđượcKhongのPHAIđược参照渡し馬のLAオブジェクトの参照です. 私たちはその答えに知っている:
Javaで上記のすべての答えは奇数CでJavaがあったことを「クリーン」なポインタ構文です. Javaはポインタを持っていますが、ポインタが宣言され、非常にきれいに使用されている. そしてもちろん、それが、Cのように強くはないポインタが、それはまた、すべての潜在的なエラーを「修正」と危険な (キャスティング, ポインタ干し草のポインタ演算をリリース) Cでのポインタの.
Javaで:
オブジェクトa;
C / C のよう
オブジェクト* A;
だから、時
オブジェクトb = aで;
C / C を意味
オブジェクト* B = A; // Bされ、ポインタ
と
b.setName(“オブジェクトB”);
に相当
B->のsetName(“オブジェクトB”);
b.setNameだから、(「オブジェクトB」) 同じオブジェクトへとBポイントの名前の「オブジェクトB」によっても配置されたオブジェクト "ポイント".
と
private void swap(Object a, Object b) { Object temp = a; a = b; b = temp; }
対応する
void swap(Object* a, Object* b) { Object* temp = a; a = b; b = temp; }
明らかにCでこの関数は、この変更がない限り動作しません:
void swap(Object* a, Object* b) { Object temp = *a; *a = *b; *b = temp; }
「カーソル」a、bはスタイル値渡し渡され (JavaはCのようであることを理解することができます, すべてのパラメータは、スタイルが値渡し渡され) そのように機能した後にスワップを返す, B不変または割り当てA = Bは意味がありません. しかしa.setValue("...") カーソルが指す変更されたオブジェクト.
リファレンス:
http://javadude.com/articles/passbyvalue.htm
http://java.forumvi.net/t23-topic
この問題は、非常に興味深いです。. ニースの記事, それはあなたがより良いカーソルのいくつかを理解するのに役立ちます. あなたが正しいことを言って、Javaでのパートポインタ. しかし、より深いレベルでの, あなたのいくつかは、問題の本質を理解していない可能性がある. 私はいくつかのレビューでは、抗議してもらってください:
– C IN, C , OBJ-Cの干し草のJava, これを使用してコンテンツへ送信, すべての場合において, 参照または値で、変数の値だけです。, または、コピーでもある. “参照渡し、それは実際にtrueパラメータにエイリアスを作成します” これはどこ先生右ではない. これは価値の単なるコピーであるのみ. あなたは、渡された引数の値を変更することはありません.
– 値渡しすると、パラメータは、あなただけで合格することを意味します 1 定数, あなたは何を変更することはできません.
– 参照渡しすると、パラメータを使用すると、ポインタを渡すことを意味します, あなたが参照できるポインタ変数の値を変更することができ、そこからこのポインタ. ただし、このポインタの値を変更することはできません.
プライベートボイドスワップ(タイプARG1, arg2に入力し) {
タイプTEMP = ARG1;
引数1引数2 =;
arg2に= TEMP;
}
この例では, ポイント # JavaとCの間 は何ですか:
– Javaを: 引数の型は、基本的にタイプです *: あなたは男の値を変更することができARG1.
– Javaを: パラメータの型は、タイプです: あなたは男の値を変更することはできませんARG1.
あなたはC言語で記述した場合 :
プライベートボイドスワップ(タイプ * ARG1, タイプ * arg2に) {
}
あなたは、引数の値を変更することができると思う場合は、誤解を持っている.
まず、変数の型を変更, あなたの引数はタイプタイプに渡される * 筋肉.
本当に恥, C Hの前に彼女の唯一と参照によるパススルーとそのJava、C を知っているべきではありません. 昨夜私の最初学ぶC . そして、私は参照渡して、objへの参照を混乱させる. 今朝読み理解MY. 別の危険な新しいDCを証明した愚かなCMTを忘れることを試みなければならない. ^^.
ブログを訪問していただきありがとうございます. 😀
全体的に、それはこの複合体の小さな一部だ, あなたはそれらの概念を学び、改訂する必要が確信しています. 何かがうまくいかない場合は、共有することを望むかもしれない.
あなたはいつも過ごすためにクラスを追加Numberクラスに機能をスワップしなかった理由を自問しMYSWAP?
実際には、あなたのクラスああでよくするために. しかし、便宜のために、私はそれに書いた, もしそうなら、それは、クラス数に使用されるため 1 Numberオブジェクトは、CLASです, Bまたはあなた宣言 1 スワップを呼び出すために他のオブジェクト.
cảm ơn Bạn, giờ mới biết một object là object reference được pass by value. trước giờ mình cứ nghĩ 1 object như một pointer.
phức tạp quá bạn có thể lấy thêm ví dụ dễ hiểu hơn nữa được không ?
phần con trỏ trong c mình cũng chưa nắm chắc nữa.