トップページ⇒tech
1001コメント321KB

【初心者】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の処理で、�@の状態を変えようとすることに
違和感を覚えない人はオブジェクト指向をもう一度学習
し直すことをおすすめする。
(→�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
誤>下記例の�Aの処理で、�@の状態を変えようとすることに
正>下記例の�Bの処理で、�@の状態を変えようとすることに
0811デフォルトの名無しさん2006/03/13(月) 01:14:31
コレ何言語だよ
0812デフォルトの名無しさん2006/03/13(月) 01:15:09
>>805
C言語なら
int array[] = {1,2};
func(&array); //これが値渡し。「参照の値渡し」的に言うなら「ポインタの値渡し」

C++には参照渡しあるけどね。
0813デフォルトの名無しさん2006/03/13(月) 01:15:12
完全なJavaコードじゃないと理解できないなら理解しなくていいよ。
0814デフォルトの名無しさん2006/03/13(月) 01:16:58
レベル低すぎて失笑
0815デフォルトの名無しさん2006/03/13(月) 01:17:11
>>807
たまに「ポインタを渡す=参照渡し」とかアホな事を書いてるC言語の入門本見て
参照渡しと値渡しの区別が付かなくなってる可哀そうな人が来るんですよ。
0816デフォルトの名無しさん2006/03/13(月) 01:18:05
Java厨と俺との違いは、
基礎を知らずにCommonsを語る奴とそうでない奴との違いだと分かった。
08178062006/03/13(月) 01:20:14
実行して…
ええと、hoge()でstrの指すものをnullにしている。このとき参照渡しならsもnullになるはず。でもならない。
つまり、内部でs=strとやってからhoge()が実行されるってこと。これが「参照の値渡し」。
0818デフォルトの名無しさん2006/03/13(月) 01:22:01
おっと、値渡し/参照渡しは代入じゃなくて引数の渡し方だっけか?

void func(hoge x);  → 値渡し
void func(hoge* x); → 値の参照渡し
void func(hoge& x); → 参照渡し

って言ってるの? だったら Java が値の参照渡しだってのは納得。
0819デフォルトの名無しさん2006/03/13(月) 01:22:03
>>814
俺の関わったソフトが世の中に流れてると思うと、マジで恐ろしい。
次の職に就けるわけでもないから、辞めるに辞められんしなぁ。
08208062006/03/13(月) 01:22:56
>>817は>>808ね。

ちなみに俺はVBA→HSP→Java。VBAにも参照渡しって指定できたような気がする。
Cなんてさっぱり。ポインタって参照のことでしょ?
0821デフォルトの名無しさん2006/03/13(月) 01:24:04
>>818
ちなみに中間のは値渡しだから。

一番下は単なる C++の参照渡し。
0822デフォルトの名無しさん2006/03/13(月) 01:24:12
>>815
http://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
>>817
じゃあ参照渡しって 「参照の参照渡し」 って呼んだほうが良いんじゃね?
ポインタのポインタでしょ。
0824デフォルトの名無しさん2006/03/13(月) 01:28:10
C言語では仕様上参照渡しが無いが
ポインタの値渡しで代用してるってことでしょ
0825デフォルトの名無しさん2006/03/13(月) 01:29:23
>>821
ごめん、真ん中の呼び方間違い。参照の値渡しって書くつもりだった。
真ん中のが参照の値渡しってことで良いわけね?
0826デフォルトの名無しさん2006/03/13(月) 01:29:49
そゆ事。で、馬鹿は「ポインタの値渡し」を「参照渡し」と呼ぶ。
0827デフォルトの名無しさん2006/03/13(月) 01:31:43
なんかすごく参考になった。
ここ見ててよかったよ。
参照の参照渡しか。
0828デフォルトの名無しさん2006/03/13(月) 01:32:42
参照の参照渡しなら受けては&になるだろ
0829デフォルトの名無しさん2006/03/13(月) 01:33:17
>>820
VBA は知らんが、VB は値渡しか参照渡しか指定できたはず。 ByVal とか ByRef とかで。
0830デフォルトの名無しさん2006/03/13(月) 01:34:33
参照の参照渡しってのは何か間違ってるような気もするが。
面倒だから放っておこう。
0831デフォルトの名無しさん2006/03/13(月) 01:34:58
>>826
OK、分かった。
でもポインタの値渡しと参照渡しを言葉上明確に区別する必要が出てきたのって
C++ で参照型 & が出てきてからでしょ。後から来たのに「実はこっちが本当の
参照型」ってことになったから、昔のままの認識で来てんじゃね?
0832デフォルトの名無しさん2006/03/13(月) 01:36:59
>>831
は?C時代から参照元を上書きできますが?
0833デフォルトの名無しさん2006/03/13(月) 01:37:20
public void hoge(Nanka n){
n = null;
}

Nanka n = new Nanka();
hoge(n);

このとき、
nへの参照がコピーされて、
渡されるってことか。
nそのものの参照が渡されるわけではなくて。
0834デフォルトの名無しさん2006/03/13(月) 01:39:05
>>831
昔から、例えば Fortran とか参照渡しする言語は普通にあったのよ。

C言語しか出来ない人には、C言語に参照渡しがなかったため、参照渡しを理解できなかった人も居た。
彼等の中の一部は「ポインタの値渡し」を「参照渡し」と呼んだ
0835デフォルトの名無しさん2006/03/13(月) 01:39:10
>>833
そう、Nankaはhogeなんかに束縛されないのだ
0836デフォルトの名無しさん2006/03/13(月) 01:39:15
こうして 「参照型」 は 「シミュレーション」 や 「名誉挽回」 のような、
正しく使わないと馬鹿に見られる試金石になったとさ。
0837デフォルトの名無しさん2006/03/13(月) 01:40:00
>>832
だれが上書きの話なんかしてんの?
0838デフォルトの名無しさん2006/03/13(月) 01:41:07
>>836
「参照型」と「参照渡し」は違うから。
0839デフォルトの名無しさん2006/03/13(月) 01:42:30
多種多様な馬鹿が入り乱れててワケワカメ
0840デフォルトの名無しさん2006/03/13(月) 01:44:08
Javaのオーバーヘッド対策の限界を知るには良かったんじゃないか?
若い諸君らは、Bufferを駆使してJavaの常識を一新してくれよ
08418062006/03/13(月) 01:49:27
>>823
ごめん、ポインタがわからん。でも参照の参照渡しじゃないと思う。値の参照渡しもあるから。
悪いけど、いきなり俺言語で説明する。
(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
>>834
ああ、C/C++/Java と来た今の俺がまさにそれだな。メモリブロックのコピーが渡る、
メモリブロックを指すポインタのコピーが渡る、メモリブロックそのものが渡る、って
のは理解できるんだが、「参照渡し」 から連想するものがちょっと混乱する。
0843デフォルトの名無しさん2006/03/13(月) 01:51:20
VB 上がりが C 上がりに唯一優越感持てるネタがあると聞いて飛んできました。
0844デフォルトの名無しさん2006/03/13(月) 01:54:48
参照渡しって呼び出し側の使ってるメモリ領域がそのまま呼び出し先に渡るイメージなんでしょ?
実体渡しとかいう名前に変えた方がよくない?
0845デフォルトの名無しさん2006/03/13(月) 01:58:39
>>844
やりたきゃ、どうぞご勝手に。
世間が従うとは限らんけどね。
08468332006/03/13(月) 01:59:46
たとえば
>>833の
Nanka に
public int value;
があるとして、

public void setValue(Nanka n){
n.value = 100;
}

としたときに、参照のコピーをいじったことにより
参照アドレスのデータが変わったから、
まるで参照渡しの様に見えたというわけですか。
0847デフォルトの名無しさん2006/03/13(月) 02:18:47
参照渡しと参照の値渡しって、厳密に言えばレベルのただの言葉遊びで、設計上の意味は同じじゃね?
0848デフォルトの名無しさん2006/03/13(月) 02:22:16
矢切の渡し
0849デフォルトの名無しさん2006/03/13(月) 02:25:04
参照渡しだったら呼びさされた方でその変数に
代入することで呼び出した方の値を変えられる。
参照の値渡しだったら変えられない。

本当の参照渡しを体験するためにFortranでもやってこい。
0850デフォルトの名無しさん2006/03/13(月) 02:26:17
今夜は Fortran 厨がうれしそうな夜ですね
0851デフォルトの名無しさん2006/03/13(月) 02:27:28
>>847
>>846のメソッド内で

n = xxx;

と参照を変えた場合に、
参照渡しだと思ってたら、
呼び出し元も変わると思っちゃうんじゃね?
0852デフォルトの名無しさん2006/03/13(月) 02:27:30
>>847
いや、全然違うだろ。
0853デフォルトの名無しさん2006/03/13(月) 02:28:13
真夜中の大論争。

そして明日はみんな遅刻。
0854デフォルトの名無しさん2006/03/13(月) 02:29:38
論争なんかないだろ。論争する点がないんだから。
単にわかってる人とわかってない人がいるだけ。
0855デフォルトの名無しさん2006/03/13(月) 02:31:01
>>853
うふ、明日はお休み。
0856デフォルトの名無しさん2006/03/13(月) 02:31:18
いやコードの上っ面でどう書けるかじゃなくて、もっと上位の設計上の話だって。
0857デフォルトの名無しさん2006/03/13(月) 02:35:54
おはようございます さくやは おたのしみでしたね
0858デフォルトの名無しさん2006/03/13(月) 02:36:07
>>856
0859デフォルトの名無しさん2006/03/13(月) 02:36:08
オブジェクトランドで語れよ、おまえら
0860デフォルトの名無しさん2006/03/13(月) 02:40:07
>>858
日本語でおk
0861デフォルトの名無しさん2006/03/13(月) 02:41:02
そんなことよりまんこの話をしようぜ
0862デフォルトの名無しさん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なんかでも普通に使ってるんだから、ちゃんと区別しないと今みたいに恥ずかしい目にあう
ってことだ。
08637562006/03/13(月) 02:42:46
今日も良く釣れたw
0864デフォルトの名無しさん2006/03/13(月) 02:52:39
もうとっくに終わってる話に「とっとと終わらせる」と言いつつ力説始める人は
周りに童思われるでしょうか。>>865 さん、お答えください。
0865デフォルトの名無しさん2006/03/13(月) 02:54:32
>>862>>432
>>863≠>>756
>>864>>432
08667562006/03/13(月) 02:54:36
>>862
変数hogeもしくはargを経由して操作できるオブジェクトは同じものだよ。

値渡しは、同値だが同一ではないオブジェクトを渡すことだ。

Javaでは実際には比較できないが、hoge==argかつhoge.equals(arg)かつarg.equals(hoge)を満たす。

あと、Stringではなく、Listなどのオブジェクトで考えてみな。

arg.clear()を行えば、hoge.isEmpty()だ。
>argはhogeとは別の変数だからarg="nullpo"とかやろうが、hogeには関係ない。
つまり、これは部分的に正しくない表現。
08677562006/03/13(月) 02:56:59
オブジェクト渡し

今日からそう呼ぼうぜ。

0868デフォルトの名無しさん2006/03/13(月) 02:57:54
おれ渡し、おまえ渡し、の方が良い
0869デフォルトの名無しさん2006/03/13(月) 02:58:28
矢切の渡し
0870デフォルトの名無しさん2006/03/13(月) 02:58:29
↓
0871デフォルトの名無しさん2006/03/13(月) 02:58:44
2秒遅かったか
0872デフォルトの名無しさん2006/03/13(月) 02:59:49
> 参照渡しが死滅した方式なら別に参照の値渡しを参照渡しと呼んだっていいが、未だに
> VBなんかでも普通に使ってるんだから、

あれ? Java や C のコンテキストで話す分には参照の値渡しを参照渡しと表現してもかまわない、
と読めるますなw
0873デフォルトの名無しさん2006/03/13(月) 03:02:17
実質、目的は変わんねぇから言葉遊びにしか見えないんだよ。
0874デフォルトの名無しさん2006/03/13(月) 03:02:24
参照渡しとか値渡し、矢切の渡しとかいってる人は
Adaでも学習した方がいいよ
0875デフォルトの名無しさん2006/03/13(月) 03:06:38
>>868
Call by 俺
Call by オマエ
0876デフォルトの名無しさん2006/03/13(月) 03:07:21
結着が付くまで寝るな。

と、蒲団の中からノートPCで書く俺。
0877デフォルトの名無しさん2006/03/13(月) 03:07:42
ぬるぽ渡し
0878デフォルトの名無しさん2006/03/13(月) 03:10:36
>>872
おいおい、なんで「参照渡しが死滅したら」がJavaやCのコンテキストだったらに
変換されるんだよw

JavaやCのコンテキストから出た途端にバカにされるやつが続出の予感。
0879デフォルトの名無しさん2006/03/13(月) 03:19:41
所詮呼び方知ってるかどうか程度の話じゃん。それでバカ認定とかってぜんぜん本質的じゃないな。
0880デフォルトの名無しさん2006/03/13(月) 03:36:11
>>879
カワイソス
0881デフォルトの名無しさん2006/03/13(月) 03:40:27
頭悪そうだなおまえ
0882デフォルトの名無しさん2006/03/13(月) 03:53:49
修飾子とかぜんぜん覚えらんねーorz
0883デフォルトの名無しさん2006/03/13(月) 03:56:39
private static final
protected
だけで80%はいける
0884デフォルトの名無しさん2006/03/13(月) 04:30:49
>>883
public は最重要
0885デフォルトの名無しさん2006/03/13(月) 04:53:11
参照の値渡しってえらい回りくどい言い回しだけどさ、これポインタのない言語使いが
ポインタ渡しの目的を理解できなくて付けた名前じゃね?
ポインタ渡しの目的を理解できてりゃ素直に参照渡しって呼んでると思うけど。
0886デフォルトの名無しさん2006/03/13(月) 05:02:48
>ポインタ渡しの目的を理解できてりゃ素直に参照渡しって呼んでると思うけど。

「本来の参照渡し」が実現できない言語がポインタ渡しで代用したものを
誤 っ て 「参照渡し」と呼んだのがおかしいんだよ。
「本来の参照渡し」も知らないでアホなこと言うのはやめてくれ。

というかお前、オブジェクト自体とオブジェクトへの参照との違いもわかってないだろ?
0887デフォルトの名無しさん2006/03/13(月) 05:06:31
>>886
プッ 苦しくなったらレッテル貼りw
おまえ、参照渡しをサポートしている言語が内部で暗黙的に参照の値渡しをやってると理解してないだろ?
0888デフォルトの名無しさん2006/03/13(月) 05:13:24
本来の参照渡しw つまり、おまえが心の拠り所にしてる「本来の参照渡し」なんてのは
単なる言語上の糖衣でしかないんだよ。プログラマがやりたいことも言語がやってることも
実質何も変わってない、だがなんとなくポインタには抵抗あるので差別化したい、が本音だろw
0889デフォルトの名無しさん2006/03/13(月) 07:06:34
>>847
違う。言語機能の違いを表してるから。

その主張は、例えば ++i; も i = i + 1; も結果は同じ。
結果が同じだから i = i + 1; を「前置インクリメント式」と呼んで何が悪い?
って言ってるのと同じ。

同じ動作をするからといって同じ呼び名がついてるとは限らん。
0890デフォルトの名無しさん2006/03/13(月) 07:09:00
>>847 のどこに「参照の値渡しを参照渡しと呼んで何が悪い?」なんて書いてるの?
0891デフォルトの名無しさん2006/03/13(月) 07:11:58
>>890
つ「ただの言葉遊びで、設計上の意味は同じじゃね?」
0892デフォルトの名無しさん2006/03/13(月) 07:12:41
>>889
0893デフォルトの名無しさん2006/03/13(月) 07:13:01
いまひどい曲解を見た
0894デフォルトの名無しさん2006/03/13(月) 07:13:08
「ただの言葉遊び」って事にしたい人もいるみたいだね。

自分が用語を間違ってたのは調べりゃわかったろうし。
0895デフォルトの名無しさん2006/03/13(月) 07:15:39
どうでも良い事に拘る人って居るよね
0896デフォルトの名無しさん2006/03/13(月) 07:16:38
そうそう、間違ってたんだから尻尾巻いて逃げりゃいいのに、粘着する阿呆とかね。
0897デフォルトの名無しさん2006/03/13(月) 07:18:04
粘着してるのはどっちだよwww
0898デフォルトの名無しさん2006/03/13(月) 07:19:01
俺が寝ておきても、まだ続けてるキミの事だよ。
0899デフォルトの名無しさん2006/03/13(月) 07:19:56
俺が起きてもw
0900デフォルトの名無しさん2006/03/13(月) 07:20:32
おやおや、勝手に曲解してたのが恥かしくなって今度は決め付けで煽りですか。
0901デフォルトの名無しさん2006/03/13(月) 07:21:12
春休みは学生がPG気取りで書き込むからな
0902デフォルトの名無しさん2006/03/13(月) 07:21:26
>>890 のレスの速さみても、粘着して無いって主張するのは無理だろ。
0903デフォルトの名無しさん2006/03/13(月) 07:22:55
この議論に参加してる人間全部粘着質だとしか思えない
0904デフォルトの名無しさん2006/03/13(月) 07:24:01
>>902 は専ブラも知らんのか…
0905デフォルトの名無しさん2006/03/13(月) 07:25:50
おはよう。また火つけちゃったバカがいるの?
0906デフォルトの名無しさん2006/03/13(月) 07:27:26
>>905
悪い。まさか相手が 未だに燃え上がるよーな粘着質だったとは知らなんだ。
0907デフォルトの名無しさん2006/03/13(月) 07:28:20
もう、「参照渡し」については決着ついてるしね。
0908デフォルトの名無しさん2006/03/13(月) 07:29:57
話題に乗り遅れてるのに後から高説垂れ始める馬鹿がいる限り
レス数が900を超えています。1000を超えると表示できなくなるよ。