【初心者】Java質問・相談スレッド82【大歓迎】
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001デフォルトの名無しさん
2006/02/25(土) 23:38:06質問をする前に、貴方が見なければならないサイトについての情報は、
下のwikiのページにまとめてあります。
http://www.wikiroom.com/java/
これからJavaでプログラミングを始めたいが、何をすればいいかわからない人も、
wikiからのリンクをおたどりください。
よくある質問
・「コマンドまたはファイル名が違います」
「'javac' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。」
「Exception in thread "main" java.lang.NoClassDefFoundError: 」
http://www.wikiroom.com/java/?path,classpath
・String に == は使うな。equals を使え。
前スレッド
【初心者】Java質問・相談スレッド81【大歓迎】
http://pc8.2ch.net/test/read.cgi/tech/1139654818/
/* 既出の質問や、他に適切なスレが存在する質問は、容赦なく無視されます。
質問をする前にwikiで過去ログ、関連スレ、FAQをチェックしてください。 */
また、当スレで質問をするかたは、回答をもらえたときに、
wikiの更新をして頂ければ、忝なく存じます。
JavaScriptの質問は、ここでは受け付けていません。
Web製作板をご利用ください。http://pc5.2ch.net/hp/
次スレは>>980あたりで。
0809デフォルトの名無しさん
2006/03/13(月) 01:11:47違和感を覚えない人はオブジェクト指向をもう一度学習
し直すことをおすすめする。
(→�Aの出力が"次の文字列"となることを期待する人。)
どの言語からJavaに移行してきたかなんて関係ない。
オブジェクト指向として変であることを感じましょう。
風を感じるよりは現実的。
これを理解した上で、C++ならできる、Javaならできない
ということを知ればいい。
Class A {
String foo = "最初の文字列";
getFoo() {return foo;}
setFoo(String hoge) {foo = hoge;}
}
Class B {
execute() {
A anObject = new A();・・・・・・・・・・・・・�@
bar(anObject.getFoo());
System.out.print(anObject.getFoo());・・�A
}
bar(String foo) {
foo = "次の文字列";・・・・・・・・・・・・・・・�B
}
}
0810デフォルトの名無しさん
2006/03/13(月) 01:12:25正>下記例の�Bの処理で、�@の状態を変えようとすることに
0811デフォルトの名無しさん
2006/03/13(月) 01:14:310812デフォルトの名無しさん
2006/03/13(月) 01:15:09C言語なら
int array[] = {1,2};
func(&array); //これが値渡し。「参照の値渡し」的に言うなら「ポインタの値渡し」
C++には参照渡しあるけどね。
0813デフォルトの名無しさん
2006/03/13(月) 01:15:120814デフォルトの名無しさん
2006/03/13(月) 01:16:580815デフォルトの名無しさん
2006/03/13(月) 01:17:11たまに「ポインタを渡す=参照渡し」とかアホな事を書いてるC言語の入門本見て
参照渡しと値渡しの区別が付かなくなってる可哀そうな人が来るんですよ。
0816デフォルトの名無しさん
2006/03/13(月) 01:18:05基礎を知らずにCommonsを語る奴とそうでない奴との違いだと分かった。
0817806
2006/03/13(月) 01:20:14ええと、hoge()でstrの指すものをnullにしている。このとき参照渡しならsもnullになるはず。でもならない。
つまり、内部でs=strとやってからhoge()が実行されるってこと。これが「参照の値渡し」。
0818デフォルトの名無しさん
2006/03/13(月) 01:22:01void func(hoge x); → 値渡し
void func(hoge* x); → 値の参照渡し
void func(hoge& x); → 参照渡し
って言ってるの? だったら Java が値の参照渡しだってのは納得。
0819デフォルトの名無しさん
2006/03/13(月) 01:22:03俺の関わったソフトが世の中に流れてると思うと、マジで恐ろしい。
次の職に就けるわけでもないから、辞めるに辞められんしなぁ。
0820806
2006/03/13(月) 01:22:56ちなみに俺はVBA→HSP→Java。VBAにも参照渡しって指定できたような気がする。
Cなんてさっぱり。ポインタって参照のことでしょ?
0821デフォルトの名無しさん
2006/03/13(月) 01:24:04ちなみに中間のは値渡しだから。
一番下は単なる C++の参照渡し。
0822デフォルトの名無しさん
2006/03/13(月) 01:24:12http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rls=GGLD,GGLD:2003-39,GGLD:ja&q=C%E8%A8%80%E8%AA%9E%E3%80%80%E5%8F%82%E7%85%A7%E6%B8%A1%E3%81%97
こいつら殆ど間違ってるんだな勉強になったよ
・・・ってなんでJavaスレでC言語の勉強してるんだよ俺
0823デフォルトの名無しさん
2006/03/13(月) 01:26:35じゃあ参照渡しって 「参照の参照渡し」 って呼んだほうが良いんじゃね?
ポインタのポインタでしょ。
0824デフォルトの名無しさん
2006/03/13(月) 01:28:10ポインタの値渡しで代用してるってことでしょ
0825デフォルトの名無しさん
2006/03/13(月) 01:29:23ごめん、真ん中の呼び方間違い。参照の値渡しって書くつもりだった。
真ん中のが参照の値渡しってことで良いわけね?
0826デフォルトの名無しさん
2006/03/13(月) 01:29:490827デフォルトの名無しさん
2006/03/13(月) 01:31:43ここ見ててよかったよ。
参照の参照渡しか。
0828デフォルトの名無しさん
2006/03/13(月) 01:32:420829デフォルトの名無しさん
2006/03/13(月) 01:33:17VBA は知らんが、VB は値渡しか参照渡しか指定できたはず。 ByVal とか ByRef とかで。
0830デフォルトの名無しさん
2006/03/13(月) 01:34:33面倒だから放っておこう。
0831デフォルトの名無しさん
2006/03/13(月) 01:34:58OK、分かった。
でもポインタの値渡しと参照渡しを言葉上明確に区別する必要が出てきたのって
C++ で参照型 & が出てきてからでしょ。後から来たのに「実はこっちが本当の
参照型」ってことになったから、昔のままの認識で来てんじゃね?
0832デフォルトの名無しさん
2006/03/13(月) 01:36:59は?C時代から参照元を上書きできますが?
0833デフォルトの名無しさん
2006/03/13(月) 01:37:20n = null;
}
Nanka n = new Nanka();
hoge(n);
このとき、
nへの参照がコピーされて、
渡されるってことか。
nそのものの参照が渡されるわけではなくて。
0834デフォルトの名無しさん
2006/03/13(月) 01:39:05昔から、例えば Fortran とか参照渡しする言語は普通にあったのよ。
C言語しか出来ない人には、C言語に参照渡しがなかったため、参照渡しを理解できなかった人も居た。
彼等の中の一部は「ポインタの値渡し」を「参照渡し」と呼んだ
0835デフォルトの名無しさん
2006/03/13(月) 01:39:10そう、Nankaはhogeなんかに束縛されないのだ
0836デフォルトの名無しさん
2006/03/13(月) 01:39:15正しく使わないと馬鹿に見られる試金石になったとさ。
0837デフォルトの名無しさん
2006/03/13(月) 01:40:00だれが上書きの話なんかしてんの?
0838デフォルトの名無しさん
2006/03/13(月) 01:41:07「参照型」と「参照渡し」は違うから。
0839デフォルトの名無しさん
2006/03/13(月) 01:42:300840デフォルトの名無しさん
2006/03/13(月) 01:44:08若い諸君らは、Bufferを駆使してJavaの常識を一新してくれよ
0841806
2006/03/13(月) 01:49:27ごめん、ポインタがわからん。でも参照の参照渡しじゃないと思う。値の参照渡しもあるから。
悪いけど、いきなり俺言語で説明する。
(1)hoge(int a As値渡し){a=10}//値の値渡し
(2)hoge(int a As参照渡し){a=10}//値の参照渡し。
main{
int foo=1;
hoge(foo);
}
とすると、
(1)を呼び出すとfooは1のまま。aとfooは別の変数。
(2)を呼び出すとfooは10になる。aとfooは同一。
参照渡しってのは、#const a fooってのがメソッド内だけ適用されるようなものだと思う。
わかりにくくてごめんなさい。
>>829
それです。ありがとうございます。
0842デフォルトの名無しさん
2006/03/13(月) 01:49:56ああ、C/C++/Java と来た今の俺がまさにそれだな。メモリブロックのコピーが渡る、
メモリブロックを指すポインタのコピーが渡る、メモリブロックそのものが渡る、って
のは理解できるんだが、「参照渡し」 から連想するものがちょっと混乱する。
0843デフォルトの名無しさん
2006/03/13(月) 01:51:200844デフォルトの名無しさん
2006/03/13(月) 01:54:48実体渡しとかいう名前に変えた方がよくない?
0845デフォルトの名無しさん
2006/03/13(月) 01:58:39やりたきゃ、どうぞご勝手に。
世間が従うとは限らんけどね。
0846833
2006/03/13(月) 01:59:46>>833の
Nanka に
public int value;
があるとして、
public void setValue(Nanka n){
n.value = 100;
}
としたときに、参照のコピーをいじったことにより
参照アドレスのデータが変わったから、
まるで参照渡しの様に見えたというわけですか。
0847デフォルトの名無しさん
2006/03/13(月) 02:18:470848デフォルトの名無しさん
2006/03/13(月) 02:22:160849デフォルトの名無しさん
2006/03/13(月) 02:25:04代入することで呼び出した方の値を変えられる。
参照の値渡しだったら変えられない。
本当の参照渡しを体験するためにFortranでもやってこい。
0850デフォルトの名無しさん
2006/03/13(月) 02:26:170851デフォルトの名無しさん
2006/03/13(月) 02:27:28>>846のメソッド内で
n = xxx;
と参照を変えた場合に、
参照渡しだと思ってたら、
呼び出し元も変わると思っちゃうんじゃね?
0852デフォルトの名無しさん
2006/03/13(月) 02:27:30いや、全然違うだろ。
0853デフォルトの名無しさん
2006/03/13(月) 02:28:13そして明日はみんな遅刻。
0854デフォルトの名無しさん
2006/03/13(月) 02:29:38単にわかってる人とわかってない人がいるだけ。
0855デフォルトの名無しさん
2006/03/13(月) 02:31:01うふ、明日はお休み。
0856デフォルトの名無しさん
2006/03/13(月) 02:31:180857デフォルトの名無しさん
2006/03/13(月) 02:35:540858デフォルトの名無しさん
2006/03/13(月) 02:36:070859デフォルトの名無しさん
2006/03/13(月) 02:36:080860デフォルトの名無しさん
2006/03/13(月) 02:40:07日本語でおk
0861デフォルトの名無しさん
2006/03/13(月) 02:41:020862デフォルトの名無しさん
2006/03/13(月) 02:42:22世の中のCの本で「参照を渡すから参照渡し」とか書いてるのは、バカが書いたんで
あって全部間違い。Cには値渡ししかないってのが言語仕様だしカーニハンに聞こうが
リッチーに聞こうがそう言う。
参照渡しというのはVBのByRefとか、Pascalのデフォルト動作をいうの。
String hoge = "hoge";
func( hoge);
System.out.println( hoge);
void func( String arg) {
//なんか処理
}
参照渡しでは、hogeとargは完全に同一の変数として扱われる。だからfunc内でarg="nullpo"と
やると、argはもちろん、hogeの値も「nullpo」になる。イメージとして変数を考えると、変数を渡すと、
変数がもってる値じゃなくて、変数という参照自体が渡ってるような感じなので「参照渡し」という。
一方で、変数の値が渡るのが「値渡し」。
CとかJavaは値渡しだから、func( hoge)としたときには、hoge変数のもつ値(この場合は
String参照。C言語だったらポインタ)が、hoge変数とはまったく関係ない、argというまったく別の
変数に格納される。
argはhogeとは別の変数だからarg="nullpo"とかやろうが、hogeには関係ない。
これが値渡し。CにもJavaにも昔からこの方式しかない。
参照渡しが死滅した方式なら別に参照の値渡しを参照渡しと呼んだっていいが、未だに
VBなんかでも普通に使ってるんだから、ちゃんと区別しないと今みたいに恥ずかしい目にあう
ってことだ。
0863756
2006/03/13(月) 02:42:460864デフォルトの名無しさん
2006/03/13(月) 02:52:39周りに童思われるでしょうか。>>865 さん、お答えください。
0866756
2006/03/13(月) 02:54:36変数hogeもしくはargを経由して操作できるオブジェクトは同じものだよ。
値渡しは、同値だが同一ではないオブジェクトを渡すことだ。
Javaでは実際には比較できないが、hoge==argかつhoge.equals(arg)かつarg.equals(hoge)を満たす。
あと、Stringではなく、Listなどのオブジェクトで考えてみな。
arg.clear()を行えば、hoge.isEmpty()だ。
>argはhogeとは別の変数だからarg="nullpo"とかやろうが、hogeには関係ない。
つまり、これは部分的に正しくない表現。
0867756
2006/03/13(月) 02:56:59今日からそう呼ぼうぜ。
0868デフォルトの名無しさん
2006/03/13(月) 02:57:540869デフォルトの名無しさん
2006/03/13(月) 02:58:280870デフォルトの名無しさん
2006/03/13(月) 02:58:290871デフォルトの名無しさん
2006/03/13(月) 02:58:440872デフォルトの名無しさん
2006/03/13(月) 02:59:49> VBなんかでも普通に使ってるんだから、
あれ? Java や C のコンテキストで話す分には参照の値渡しを参照渡しと表現してもかまわない、
と読めるますなw
0873デフォルトの名無しさん
2006/03/13(月) 03:02:170874デフォルトの名無しさん
2006/03/13(月) 03:02:24Adaでも学習した方がいいよ
0875デフォルトの名無しさん
2006/03/13(月) 03:06:38Call by 俺
Call by オマエ
0876デフォルトの名無しさん
2006/03/13(月) 03:07:21と、蒲団の中からノートPCで書く俺。
0877デフォルトの名無しさん
2006/03/13(月) 03:07:420878デフォルトの名無しさん
2006/03/13(月) 03:10:36おいおい、なんで「参照渡しが死滅したら」がJavaやCのコンテキストだったらに
変換されるんだよw
JavaやCのコンテキストから出た途端にバカにされるやつが続出の予感。
0879デフォルトの名無しさん
2006/03/13(月) 03:19:410880デフォルトの名無しさん
2006/03/13(月) 03:36:11カワイソス
0881デフォルトの名無しさん
2006/03/13(月) 03:40:270882デフォルトの名無しさん
2006/03/13(月) 03:53:490883デフォルトの名無しさん
2006/03/13(月) 03:56:39protected
だけで80%はいける
0884デフォルトの名無しさん
2006/03/13(月) 04:30:49public は最重要
0885デフォルトの名無しさん
2006/03/13(月) 04:53:11ポインタ渡しの目的を理解できなくて付けた名前じゃね?
ポインタ渡しの目的を理解できてりゃ素直に参照渡しって呼んでると思うけど。
0886デフォルトの名無しさん
2006/03/13(月) 05:02:48「本来の参照渡し」が実現できない言語がポインタ渡しで代用したものを
誤 っ て 「参照渡し」と呼んだのがおかしいんだよ。
「本来の参照渡し」も知らないでアホなこと言うのはやめてくれ。
というかお前、オブジェクト自体とオブジェクトへの参照との違いもわかってないだろ?
0887デフォルトの名無しさん
2006/03/13(月) 05:06:31プッ 苦しくなったらレッテル貼りw
おまえ、参照渡しをサポートしている言語が内部で暗黙的に参照の値渡しをやってると理解してないだろ?
0888デフォルトの名無しさん
2006/03/13(月) 05:13:24単なる言語上の糖衣でしかないんだよ。プログラマがやりたいことも言語がやってることも
実質何も変わってない、だがなんとなくポインタには抵抗あるので差別化したい、が本音だろw
0889デフォルトの名無しさん
2006/03/13(月) 07:06:34違う。言語機能の違いを表してるから。
その主張は、例えば ++i; も i = i + 1; も結果は同じ。
結果が同じだから i = i + 1; を「前置インクリメント式」と呼んで何が悪い?
って言ってるのと同じ。
同じ動作をするからといって同じ呼び名がついてるとは限らん。
0890デフォルトの名無しさん
2006/03/13(月) 07:09:000891デフォルトの名無しさん
2006/03/13(月) 07:11:58つ「ただの言葉遊びで、設計上の意味は同じじゃね?」
0892デフォルトの名無しさん
2006/03/13(月) 07:12:410893デフォルトの名無しさん
2006/03/13(月) 07:13:010894デフォルトの名無しさん
2006/03/13(月) 07:13:08自分が用語を間違ってたのは調べりゃわかったろうし。
0895デフォルトの名無しさん
2006/03/13(月) 07:15:390896デフォルトの名無しさん
2006/03/13(月) 07:16:380897デフォルトの名無しさん
2006/03/13(月) 07:18:040898デフォルトの名無しさん
2006/03/13(月) 07:19:010899デフォルトの名無しさん
2006/03/13(月) 07:19:560900デフォルトの名無しさん
2006/03/13(月) 07:20:320901デフォルトの名無しさん
2006/03/13(月) 07:21:120902デフォルトの名無しさん
2006/03/13(月) 07:21:260903デフォルトの名無しさん
2006/03/13(月) 07:22:550904デフォルトの名無しさん
2006/03/13(月) 07:24:010905デフォルトの名無しさん
2006/03/13(月) 07:25:500906デフォルトの名無しさん
2006/03/13(月) 07:27:26悪い。まさか相手が 未だに燃え上がるよーな粘着質だったとは知らなんだ。
0907デフォルトの名無しさん
2006/03/13(月) 07:28:200908デフォルトの名無しさん
2006/03/13(月) 07:29:57レス数が900を超えています。1000を超えると表示できなくなるよ。