2011-08-03 9 views
9

ここでポインタを使用しないのはなぜですか?Javaでポインタを使用できないのはなぜですか?

Javaではポインタの代わりにどの概念が使用されていますか?

+1

http://stackoverflow.com/questions/2629357/does-java-have-pointers – nidhin

+0

Cスタイルのメモリアドレスポインタを意味しますか?または一般的な意味でのポインタですか? –

+0

"参照"はポインタです。それらはちょうど "保護された"ポインタであり、内部の値を操作することはできません。 –

答えて

21

Javaでポインタを使用できないのはなぜですか?

言語設計者は、言語にポインタを含めることを選択しなかったためです。

なぜここでポインタを使用していないのですか?

のJavaの設計者は、それが、使いトリッキーとエラーが発生しやすい構造だと思ったので。

Javaではポインタの代わりにどの概念が使用されていますか? (あなたはポインタ演算から無視あればポインタと非常に似ている)

参照。

作成するすべてのオブジェクトは、ヒープ上に作成することを覚えておいてください(newキーワードを使用)。この事実は、「参照解除演算子」(C/C++では*)が存在しないという事実とともに、オブジェクトを保持する方法がないことを意味します。オブジェクトを保持することはできないので、オブジェクトを変数に格納する方法はありません。そのため、すべての変数(プリミティブ型を保持するものを除く)は参照型です。

0

Javaでは、単純型への参照は常に値によって行われ、オブジェクトへの参照 は常に特殊なオブジェクトを除いてポインタです。

10

言語設計の決定でした。

日のホワイトペーパーThe Java Language Environmentから:

ほとんどの研究は、ポインタがそのコードにバグを注入するプログラマを有効 主な特徴の一つであることに同意します。 の構造体がなくなり、配列と文字列がオブジェクトであるとすれば、 のこれらの構造体へのポインタの必要性はなくなります。したがって、Javaにはポインタデータがありません タイプです。 Cに配列、構造体、およびポインタを必要とするタスクは、オブジェクト宣言とオブジェクト配列 によってより簡単に確実に実行できます。配列 ポインターの複雑なポインター操作の代わりに、算術インデックスで配列にアクセスします。 Java 実行時システムは、すべての配列インデックスをチェックして、インデックスが の範囲内にあることを確認します。

Javaにポインタが存在しないため、 ポインタが正しくないため、ポインタがぶら下がったりメモリが壊れたりすることはなくなりました。

-1

作成するすべてのオブジェクトnew();実際にポインタです..

XXX a=new XXX(); 

a実際にポインタ..です それはちょうどあなたが(安全上の理由のために)Cであなたのようにそれらへのポインタ演算のような派手なことをすることができないことができます。

実際にオブジェクトを渡す場合は、オブジェクトにポインタを渡しています(new()によって作成されたオブジェクトはヒープにあります)。

2

いいですね。あなたはCプログラミングの意味でポインタを持っていないので、仮想マシンはそれをすべて見ます。しかし、それはあなたが似たような能力を持っていないと言っているわけではありません。例えば、オブジェクトの変数は参照であり、参照を渡すオブジェクトの変数を渡すときは、のソートのポインタです。また、変数を使って項目のインデックスを配列に格納することもできます。これは、やはりプログラマティックな意味でポインタの一種です。

+0

Cのポインタはシンプルで、正しく使用すると非常に強力です。マジックはありません。あらかじめ定義されたバイト数のアドレスを指しています。 – Will03uk

+0

私は同意しますが、JavaにはCスタイルのポインタはありません。どんなにシンプルであっても、Javaがそれらを使用していないことは間違いありません。ウィルに同意しますか? –

+1

はい。私のコメントは、Java自体にもかかわらず、管理された言語であった。明らかにJVMはJavaのコンセプトに合っていなければなりませんが、C/C++はJavaと同様によく構築された多様なライブラリ(qtなど)でも使用できると信じています – Will03uk

1

Javaのすべてがポインタを介してのみアクセスされます。 Java参照はポインタです。 Java Dr.Goslingの作成者は、彼の著書「The Java Language Specification」(1つのエディションのp.40のどこかで)でこれを述べています。

「Java仮想マシン」という本は、「参照は一対のポインタへのポインタであり、この2つのポインタのうちの1つは別のポインタ[...]を指しています。

Javaの参照とCのポインタには大きな違いがありますが、参照はポインタです。

+1

ポインタは参照とは異なります。実際のメモリを指してはいけません。 JVMはそれをすべて処理します。オブジェクトを指すだけで、ガベージコレクション中に移動することができます。さらに、この質問は1年前に尋ねられたので、あなたが電子メールを受け取ることはほとんどありません。電子メール収穫業者にあなたの電子メールを送信することを推奨しません。あなたは多くの迷惑メールを受け取ります。さて、あなたはYahoo!すでにメールが届いています。 (私はYahoo!アカウントを一度作ったことがあり、それを使ったことはありませんでした。私はそれに戻って、かつてはスパムでいっぱいでした。) – eboix

-1

C関数の変数の値を変更する場合は、変数のアドレス(ポインタ)を関数に渡します。関数内の変数の値を使用し、その値を変更したくない場合は、変数の名前(参照)を関数に渡します。多くのプログラマーは、リンクされたリストやbツリーのような他のもののためのポインタを使用しませんでした。 Cのポインタと構造体は、いくつかのアプリケーションを無限に簡単にすることができます。配列とは違った構造体にはさまざまなタイプの変数を含めることができ、それらをグループ化することでより簡単に使用できます。リンクリストの構造には、ポインタ(リスト内の次のリンクのアドレス、およびリストが二重リンクの場合は前のリンクへのアドレス)が含まれます。

リストのリンクには、

メモリは、配列のように次元化されるのではなく、必要な場所に、必要に応じて割り当てられるため、非常に柔軟性があります。私がこれを使用した主なアプリケーションは、入札するプロジェクトのコストを計算することです。

この柔軟性は、detデバッグを禁止しています。

+1

質問はJavaに関するものでした。なぜCについて話しているのですか? –

+0

私はJesseに同意しますが、Javaについての質問はありますが、代わりにCプログラミング言語を参照しているようです。 – Alex

0

java.misc.unsafeを使用してポインタメカニックスにアクセスできますが、それは... mmm ... 安全でないです。

ああ、コンセプトを置き換える。あなたはどんな面に興味がありますか?変数は既にそれらへの参照によって表されています - それは1つの視点です。効率的なデータ構造を実装するためのポインターが必要な場合は、おそらくすでに存在しているか、またはその機能を提供するライブラリがあるか、またはネイティブコードを記述してJavaラッパーから呼び出すことができます。とにかく、あなたが興味を持っている側面を定義してください。多分コミュニティはあなたにもっと詳細な答えを与えます。

0

Javaは、の呼び出しに従います。値を呼び出します。したがって、オブジェクトを作成すると、作成されたオブジェクトへの参照のコピーがヒープ領域に戻されます。この参照のコピーは、変数が割り当てられるものです。この変数をメソッド呼び出しの引数として使用すると、その参照のコピーが作成され、代わりに使用されます。 Javaはリファレンスやポインタを使用しません! javaのすべてがコピーです。したがって、Javaはcall by valueの原則に従います。

0

プログラミング言語で操作するのが最も難しいのはポインタです。 もしあなたが何かを見逃してしまったら、セグメンテーションフォールトのエラーがたくさんあります。 Javaはそのような言語の1つで、CALL BY VALUEを使用してユーザーに柔軟性を提供します。

+0

この回答はあまり包括的ではありません。あなたの答えが完全に質問に答えると感じない限り、他のより詳しい投稿にあなたの知識をコメントとして追加することを検討してください。 –

関連する問題