【先着1,000名様!】1,000円分をプレゼント!

javaでintやStringって参照渡しって可能なのでしょうか?
プリミティブタイプ以外は参照渡しとあるサイトに書いてあったのですが
Stringは何故、値渡しなのでしょうか。
宜しくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (7件)

> あと補足なんですがインスタンスが確保されているものに


> a = null;とかするのは問題あるでしょうか?
> なんとなくメモリリークが起きる気がするのですが、、

問題ありません。メモリリークも起きません。
確かに、文字列を連結したりするたびに新しい文字列のインスタンスが生成されていきますが、Javaでは、不要になったインスタンスのメモリは、自動的に「ガーベジコレクタ」によって開放されます。
つまり、不要なインスタンスを破棄・処分するためのコードをいちいちプログラマが書く必要は無いのです。

ある変数に代入されているインスタンスが不要になったら、その変数にnullを代入しておくだけで、あとは適当なタイミングにガーベジコレクタがメモリを開放してくれます。(メモリの開放はnull代入の直後とは限りません)
    • good
    • 0
この回答へのお礼

再度にわたるご回答、感謝しております。

お礼日時:2003/11/19 21:23

(1)


String a;
a = "aaa";

(2)
String a = new String();
a = "aaa";

 (1)と(2)の動作の違いについて。

(1)
 String型の参照を格納する変数aを宣言。(つまりStringオブジェクトはまだ生成されていない。)
 aに"aaa"というStringオブジェクトの参照を代入する。
 メモリでいうならば「参照用のa」「"aaa"という内容のStringオブジェクト」の分だけ確保されます。

(2)
 String型の参照を格納する変数aを宣言し、そのaに新しく生成(new)したStringオブジェクトの参照を代入する。
 aに"aaa"というStringオブジェクトの参照を代入する。(これはaの参照先を"aaa"に書き換えただけで、上でnewしたStringオブジェクトに文字列"aaa"を代入したわけではありません。)
 メモリでいうならば「参照用のa」「newしたStringオブジェクト」「"aaa"という内容のStringオブジェクト」の分だけ確保されます。


 Stringであろうとオブジェクトは全て例外なく参照渡しです。Javaでは配列はオブジェクトなので配列も参照渡しです。このことを利用したのが#1さんの
>ちょっとずるいですが、
>要素数1の配列にすればできます。
です。


>Stringというのは特別なクラスなのでしょうか?
 Java内部の仕様に組み込まれた特別なクラスですが、プログラマはいちいちそのことを意識しなくてもいいと思います。
 意識しなければならないのは、String同士を連結して代入する際、新しいオブジェクトが生成されるという点です。(#4参照)
 このことを知らないと今回のteststrのように文字列の「内容」を別のメソッドで書き換えたつもりが、実は書き換わっていない、というバグに繋がる可能性があります。
 「頻繁に内容が変更される文字列」を扱うのでしたらStringBufferを使用することをお勧めします。=や+での操作はできなくなりますが、メモリやパフォーマンスの面でStringBufferの方が上回ります。Stringは「固定長の文字列」を扱うのに便利なクラスであると心得てください。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
大変勉強になりました。

お礼日時:2003/11/19 21:22

プリミティブ型でもオブジェクト型でも、変数を宣言しただけでは、まだ実体は存在しないことに注意してください。


変数の中に実体が存在するのは、代入を行ってからです。(ただし、オブジェクト型変数にnullを代入した場合は、実体は実質的に存在しないことになりますが)

> Cのポインタ渡しとは違うのでしょうか

「参照渡し」は、「ポインタ渡し」と同じことです。ただ、Javaではポインタとは言わずに参照という言葉を使うのです。

> String a = new String();とString a;
> ではメモリ管理が変わるのでしょうか

メモリ管理が異なるというより、処理の内容全体が異なります。

String a;
というのは、変数を宣言しただけです。
まだ代入していないので、変数の中身を取り出すことはできません。(この点C言語とは若干異なります)

String a = new String();
では、大きく分けて三つの処理が行われます。
一つ目は、上と同じく、変数領域の確保です。
二つ目は、新しいStringのインスタンス(実体)の生成です。
三つ目は、生成した文字列インスタンスを代入することです。(厳密には、代入されるのはインスタンスそのものではなくてインスタンスへの参照です)
上と異なる点は、代入《までも》行われる点です。つまり、このあと変数の中身を取り出すことができます。

最後に、
a = a + "bbb";
についてですが、これは、
「二つの文字列をつなげて、新しい文字列インスタンスを作り、それを代入する」
ということが行われます。
(厳密な処理内容は、4番目の回答でSephyさんがおっしゃっている通りですが)
注意する点は、もともと変数aに入っていた文字列インスタンスの中身が書き換えられるのではなく、まったく新しい文字列インスタンスが生成してそれが代入されるという点です。

> 関数teststrのString aの実体はコピーが渡されるているのでしょうか

(Stringはオブジェクト型なので)渡されるのはあくまでも参照です。そして、変数の中身も参照です。
ただし、teststrメソッドの中で、
a = a + "bbb";
としても、これはteststrメソッドの中で使われている変数aに文字列を代入し直しただけです。
つまり、teststrメソッドの変数aの中身は、"aaa"への参照から"aaabbb"への参照に代わりますが(もちろんこの二つの文字列は別なインスタンスです)、mainメソッドの変数aの中身は、aaa"への参照が代入されたままだということです。
    • good
    • 0
この回答へのお礼

>String a; というのは、変数を宣言しただけです。
>まだ代入していないので、変数の中身を取り出すことはできません。(この点C言語とは若干異なります)

確かにString aの時点ではnull状態ですね。
a = "aaa";をはじめて実行したときにインスタンスが確保されるということですね?
あと補足なんですがインスタンスが確保されているものに
a = null;とかするのは問題あるでしょうか?
なんとなくメモリリークが起きる気がするのですが、、

お礼日時:2003/11/19 10:40

teststrメソッド内の


a = a + "bbb";
のところで混乱しているのだと思います。

Stringの代入

a = a + "bbb";

は、コンパイラによって

a = new StringBuffer().append(a).append("bbb").toString();

のように書き換えられます。ここで新しくStringBufferがnewされていることに注目してください。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。大変参考になりました。
コンパイラが値渡しであるかのように見せかけているのですね?
Stringというのは特別なクラスなのでしょうか?
或いは他にも、StringとStringBufferの関係のクラスってあるのでしょうか?

お礼日時:2003/11/18 21:49

intやfloatなどはプリミティブタイプですのでその値が直接格納されます。


引数渡しにおいては値のコピーが渡されることになります。

そして、Stringはクラスですので引数渡しは参照渡しになります。
しかしStringはデータを変更できません。
String str="Hello";
str+=" world";
とした場合には、まず最初に「Hello」というデータもつStringオブジェクトを
strが参照することになります。
しかし、その後「world」という文字列を追加しようとしても、もとのオブジェクトとは別の
「Hello world」というデータをもつオブジェクトを参照することになります。
よって「一応」参照渡しとなっていますが呼び出し元のオブジェクトを書き換えることが出来ません。
(値を見ることは出来ますが)

文字データを参照で扱う場合にはStringBufferクラスを使います。

プリミティブタイプを参照で扱うためにはIntegerクラスやDoubleクラスなどがあります。

この回答への補足

import java.util.Vector;
class test{
 public static void main(String[] args) throws NumberFormatException,IOException{
  String a;
  a = "aaa";
  System.out.println(a);
  teststr(a);
  System.out.println(a);
  return;
 }
 
 public static void teststr(String a){
  a = a + "bbb";
  System.out.println(a);
 }
}

ちょっと混乱してきました。
これは参照渡しですよね?
先ほどのプログラムを
String a = new String();
に書き換えると、最後のaaaが表示されなくなりました。
ただのString a;でも実体はありますよね?
String a = new String();とString a;
ではメモリ管理が変わるのでしょうか?

補足日時:2003/11/18 17:24
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
例えば下記この場合
関数teststrのString aの実体はコピーが渡されるているのでしょうか?


class test{
 public static void main(String[] args) throws NumberFormatException,IOException{
  String a;
  a = "aaa";
  System.out.println(a);
  teststr(a);
  System.out.println(a);
  return;
 }
 
 public static void teststr(String a){
  a = a + "bbb";
  System.out.println(a);
 }
}

お礼日時:2003/11/18 17:07

intやdoubleなどの値型は必ず値渡しです。


Stringや配列などのオブジェクト型は必ず参照渡しです。

> 関数にStringを渡したとき内部的に自分のコピーを作っているということなのでしょうか

そのようなことはありません。メソッド(Javaでは関数とは呼びません)に文字列を渡しても、インスタンスが勝手にコピーされるということはありません。なぜなら、参照渡しだからです。

見た目が値渡しであるかのように見えるのは、文字列のインスタンスの内容を書き換えられないからです。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。ひょっとすると私が「参照渡し」という言葉の定義を勘違いしているのかもしれません。
Cのポインタ渡しとは違うのでしょうか?

お礼日時:2003/11/18 17:09

Stringも一応参照渡しだったと思います。


ただ、値を書き換えられないだけです。
値を書き換えたければ、ちょっとずるいですが、
要素数1の配列にすればできます。
    • good
    • 0
この回答へのお礼

早速のご回答有難うございます。
ところで「一応参照渡し」というとどういうことでしょう?
関数にStringを渡したとき内部的に自分のコピーを作っている
ということなのでしょうか?

お礼日時:2003/11/18 13:44

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qjavaでは基本型の参照渡しは無理ですか?

先日のjavaの授業で値渡しと参照渡しについて学びました。
授業では

オブジェクトは参照渡しになり
基本型は値渡しにされる(参照渡しは不可能)

と教えられました。

オブジェクトを値渡しにできないのはなんとなく納得できたのですが
基本型を参照渡しにできないのが納得できません。

そこで
1.基本型を参照渡しにすることはできないのか?

2.基本型を参照渡しすることができないのはなぜか?

3.オブジェクトを値渡しすることができないのはなぜか?

の3点を教えて頂きたいです。
よろしくお願いします。

Aベストアンサー

No1の方がおっしゃる通り、Javaでは全て値渡しです。
オブジェクトは参照データ型といわれる型になります。
参照渡し、と思っているのは【参照を示す場所を値渡ししている】になります。
わかりやすく説明されているサイトをご紹介します。

という前提で疑問に私なりの回答をしてみます。

1.基本型を参照渡しにすることはできないのか?
  基本型を参照データ型にラップし、オブジェクトとして扱うことはできます。例をあげるとbooleanではBooleanオブジェクトに該当します。
  
2.基本型を参照渡しすることができないのはなぜか?
  1.のような方法で【Natsu0611さんが思われているような参照渡し】は可能ではないでしょうか。

3.オブジェクトを値渡しすることができないのはなぜか?
  おそらくではありますが、メモリ管理の問題ではないでしょうか。

回答が合っているかどうかはちょっと自信は無いですが・・・。

参考URL:http://java.269ch.jp/archives/2005/07/post_6.html

No1の方がおっしゃる通り、Javaでは全て値渡しです。
オブジェクトは参照データ型といわれる型になります。
参照渡し、と思っているのは【参照を示す場所を値渡ししている】になります。
わかりやすく説明されているサイトをご紹介します。

という前提で疑問に私なりの回答をしてみます。

1.基本型を参照渡しにすることはできないのか?
  基本型を参照データ型にラップし、オブジェクトとして扱うことはできます。例をあげるとbooleanではBooleanオブジェクトに該当します。
  
2.基本型を参...続きを読む

QJavaで文字列をゼロ埋め(ゼロパディング)

Javaで文字列を前ゼロで埋め(ゼロパディング)たいのですが、
exceptionが発生してうまくいきません。
だれかお助け頂けたら助かります。

(例)123の前に0を5つ結合したい場合、

String str2="123";
String str = String.format("%08s",str2);

で問題無いと思ったのですが、
exceptionが発生してしまいます。

回答お待ちしております。

Aベストアンサー

そのExceptionはどういったExceptionなのか把握されてますか?
何が悪いのかの理由もそのExceptionからわかると思いますが。

http://docs.oracle.com/javase/jp/6/api/java/util/Formatter.html#syntax
をよく読んで"%08s"という指定ができるのかどうか確認しましょう。

やられたいことは"123"の先頭に"00000000"をつけて後ろから8文字取り出せばできると思いますが。

Q3つの表の外部結合

表A、B、Cの3つがあり、Aのすべての行を出力したいと考えています。
外部結合を用いるのだとは思うのですが、3つの表に対して行う場合の
書き方がわからず困っています。
ご教授いただけないでしょうか?
select * from a,b,c
where a.商品ID =b.商品ID (+) and b.商品ID (+) =c.商品ID (+)
としてみましたが、うまくいきませんでした。

Aベストアンサー

ansi構文の趣旨からいえば、結合条件と絞り込み条件は分けて書くので・・

select *
from a
left join b on (a.商品ID =b.商品ID)
left join c on (b.商品ID =c.商品ID)
where a.年月 = 任意の値

と書くのが一般的でしょうね。

QJavaには、構造体はないんですか?

 C言語の構造体みたいなのはないんですか?

野球のデータを扱っているのですが、構造体がないのでできません。

打率の順位をソートしたいのですが、Cでは構造体でソートすれば選手名まで全部ソートできたのですが。。。

Javaでは、いちいち選手名、打率などの配列を作っているのですが、打率をソートしてから選手名と一緒に表示しようとしても打率の配列だけ、ソートしてあり選手名の配列と打率の配列があいません。

要するに、打率の配列はソートし、選手の配列はデータを入力したときのままなので、順番が違っているのです。

うまい方法を教えてください。初歩的な質問でごめんなさい。

Aベストアンサー

メンバーが public なクラスが構造体と(ほぼ)同じです。

大体こんな感じ。

// sort Object using Arrays.sort()

import java.util.Arrays;

class Batter implements Comparable {
 public double rate;
 public String name;
 Batter(double r, String n) {
  rate = r;
  name = n;
 }
 public int compareTo(Object o) {
  return (int)((rate - ((Batter)o).rate)*1000.);
 }
}

class w03 {
 public static void main(String[] args) {
  Object[] batter = {
   new Batter(0.3, "ichiro"),
   new Batter(0.1, "shinjo"),
   new Batter(0.0, "irabu")
  };

  // sort
  Arrays.sort(batter);

  // print-out to console
  for (int i=0; i < batter.length; i++) {
   Batter b = (Batter)batter[i];
   System.out.println(b.name + " " + Double.toString(b.rate));
  }
 }
}

このように java.util.Arrays の sort() メソッドを使うと、C でやってた
イメージに近くなります。

C の qsort() と違って、どんなデータでもソートできるわけではなく、対象と
なるクラスは Comparable インターフェースを実装しなくてはいけません。

メンバーが public なクラスが構造体と(ほぼ)同じです。

大体こんな感じ。

// sort Object using Arrays.sort()

import java.util.Arrays;

class Batter implements Comparable {
 public double rate;
 public String name;
 Batter(double r, String n) {
  rate = r;
  name = n;
 }
 public int compareTo(Object o) {
  return (int)((rate - ((Batter)o).rate)*1000.);
 }
}

class w03 {
 public static void main(String[] args) {
  Object[] batter = {
...続きを読む

Q動的配列確保

JAVA初心者です。
VBでのRedim Preserve、CのreallocみたいなものはJAVAには無いのでしょうか?
要はあらかじめ配列数がわかっていない時に動的配列確保を行いたいのです。
Objectではなく、基本クラスのint、byte等の配列に使いたいと思っております。
ArrayListが近い事が出来そうだったのですが、Objectにしか使用出来ないので、
断念しました。教えてください。

Aベストアンサー

ラップするというのは、こんな感じです。

byte value = 1;
ArrayList list = new ArrayList();
list.add(new Byte(value));

byte や int に対応する、java.lang.Byte や java.lang.Integer などのクラスを使います。例えば new Byte(3) とやると、3 の byte 値を持つ Byte クラスのオブジェクトができます。あくまでもオブジェクトですので、そのままでは足し算や掛け算はできませんが、ArrayList にオブジェクトとして追加できるようになります。

オブジェクトから元の数値に戻すには、byteValue() や intValue() などのメソッドが各クラスに用意されているのでそれを使います。

もちろん、質問者さんが補足に書いたように、文字列に変換して ArrayList にいれる方法でもかまいません。ただし、Byte や Integer クラスのオブジェクトを使うと、
○「文字列⇔数値」の相互変換の必要が無いので、(一応)速い。
○元の数値が byte だったのか、int だったのか、short だったのか、…… が判別できる。
などの利点があります。

ラップするというのは、こんな感じです。

byte value = 1;
ArrayList list = new ArrayList();
list.add(new Byte(value));

byte や int に対応する、java.lang.Byte や java.lang.Integer などのクラスを使います。例えば new Byte(3) とやると、3 の byte 値を持つ Byte クラスのオブジェクトができます。あくまでもオブジェクトですので、そのままでは足し算や掛け算はできませんが、ArrayList にオブジェクトとして追加できるようになります。

オブジェクトから元の数値に戻すには、byteValue() や...続きを読む

QIOException ってどういうときに起こるのでしょうか?

IOException ってどういうときに起こるのでしょうか?

http://www.atmarkit.co.jp/fjava/rensai2/javaent12/javaent12.html
を見て勉強しています。

  catch ( IOException e) {
    System.out.println( "キーボードが故障しているのかもしれません" );
  }

と書いてあります。
ハード(キーボード)が故障しているのを Java のプログラムのレベル(ソフトウェア)で感知できるというのがよくわかりません。「

NumberFormatException の方はわかるのですが・・・

Aベストアンサー

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接続だったりするわけですけど、
InputStreamは、その入力元の情報を持っていないので、
データを読み取る際は常に
IOExceptionをキャッチするコードを書かなくてはいけません。
たとえ、絶対にIOエラーが発生しないストリームだとしても。

さらに付け加えるなら、
そもそも「標準入力=キーボード」であるとは限りません。
(一般的にはキーボードであることが多いですが。)
Javaでは、
System.setIn(InputStream)
を呼び出して、標準入力を変えてしまうことができますし、
標準入力を指定してプログラムを実行することができるOSもあります。

追伸1:
例外をキャッチしたときは、
スタックトレースをプリントすることをおすすめします。
catch (IOException e) {
e.printStackTrace();
}

追伸2:
そのプログラムでIOExceptionを発生させる最も簡単な方法は、
readLine()を呼び出す前に
標準入力(System.in)を閉じてしまうことです。
System.in.close();

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接...続きを読む

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分

QStringBufferからStringへキャストする

StringBufferからStringへキャストする方法としてどちらを用いるのが一般的なのでしょうか
StringBuffer sb
として
public String ***(***)メソッドの最後に

1. return sb.toString()とする
2. return new String(sb)とする

私は1を使っていたのですが、
Javaの規約だか処理能力が良い方法だかに
厳しい人が2を使っていたので少し戸惑う程度ですが…
回答よろしくお願いします。

Aベストアンサー

toString()メソッドは全てのClassのスーパクラスであるObjectクラスのメソッドです。
その他のクラスのtoString()メソッドは、これをオーバライドしたに過ぎません。
toString()メソッドの用途はそのオブジェクトを視覚的にあらわすときに利用します。オブジェクトのダンプイメージです。
今回はStringBufferクラスのtoString()メソッドのためダンプイメージがStringそのもののため問題ありませんが、
「Stringにキャストする」と明示的に処理するには2を使用するのが正解と思います。
格クラスのtoString()メソッドはDEBUGで画面やファイルに出力するときに使用すると考えたほうが賢明と思います。

Qinterface,extend,implementのちがい

お世話になります、

Javaを勉強しているのですが、
interface,extend,implementの使い分けがわかりません。

私の解釈としては、
(1)interfaceは、グローバル変数の定義、グローバルメソッドの定義(実装はしない)。

(2)extendは、extendクラスを親クラスとして親クラスの機能を使用できる。

(3)implementは…,implementもextendと同じような意味だと解釈しているんですが、違う点は、implementで定義してあるメソッドは、使用しなくても、実装しなければならないという点でしょうか?

とにかくこの3つのを使い分けるコツとかあれば教えてください。
よろしくお願いします。

Aベストアンサー

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば、getStringLength()メソッドなどが
あったほうが良いでしょうか。
このgetStringLength()メソッドは、2バイト文字も1バイト文字も「1文字」
と数えてくれると言う点で、まさに、日本語クラス用のメソッドだと言えるでしょう。

例えば、Java的に記述すると、、、
class Japanese {
public int getStringLength() {
  ・・・
return strlength;
 }
 ・・・
}

class TextField {
・・・
}

class JTextField extends TextField, extends Japanese {
・・・・
}

C++ではそのように実装するでしょう。
しかし、Javaにはこのような高度な機能はありません。

そこで、生まれた苦肉の策が、「interfaceとimplements」です。

interface Japanese {
public int getStringLength(); // interfaceは実装を含まない!
                 // すなわち「実装の継承」ができるわけではない。
}

class TextField {
・・・
}

class JTextField extends TextField implements Japanese {
・・・・
public int getStringLength() {
  ・・・
return strlength; //implementsの実装を「各クラスで」実装してやる必要がある。
 }
}


結局のところ、Javaでは、複数のクラスを親クラスには持ち得ないため、継承できなかったクラスは「各クラスで実装してやる必要性」があるのです。


ではどのように使うのが効果的か?

なまえのままです。「代表的なインターフェイス」にたいしてinterfaceを使うのが良いと思います。

例えば、プレイヤー系であれば、ビデオ・コンポ・ウォークマン・などにかかわらず、
interface controlpanel {
public play();
public stop();
public next();
public back();
}
というような基本的インターフェイスを「持っているべき」です。

こうすることで、それぞれのクラス宣言の際に、これらの「インターフェイスを持っているべきであり、実装されるべきである」ということを「強く暗示」することができます。
class videoplayer extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

こうすることで、同様のクラスを作成するユーザーは、
「プレイヤー系は、4つ操作が出来るコントロールパネルをインターフェイスとして持つべきなのだな!?」という暗示を受け取り、自分のクラスでもそれを模倣するでしょう。

class mp3player extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

また、これらのクラスを使用するユーザーも、「implements controlpanel」という
表記を見て、「4つの基本操作は押さえられているのだな!」という基本中の基本動作を抑えることが出来ます。

まとめると、クラスに「こういう特徴もたしてください!」「こういう特徴持ってますよ!」という一種の暗示的警告や方向性を与えることができるわけですね。

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば...続きを読む

QJavaでポインタ的なことはできるか?

JavaでC言語のようにポインタを使おうとしたらJavaには
ポインタが表面上はサポートされていないことを知りました。

関数を呼び出した際に、呼び出し元の変数に影響を与えるようなプログラムは
Javaで作れるのでしょうか?
例えば、以下のプログラムはCで関数を呼び出した際に呼び出し元の
変数の中身を関数内で書き換えてしまうプログラムです。
こういうことをJavaでするにはどう書けばよいのでしょうか?
もしこういうことができないのであれば、Javaにはポインタに代わるやりかたがあるのでしょうか?

実行結果:
1 10

#include <stdio.h>

void func( int *n ){
  *n = 10;
}

int main(){
  int n = 1;
  printf("%d ", n );
  func( &n );
  printf("%d ", n );
}

Aベストアンサー

質問のコードを書き直すと
private void func(Integer n){
  n = 10;
}

public static void main(String[] args){
  Integer n = 1;
  System.out.printf("%d ", n );
  func( n );
  System.out.printf("%d ", n );
}

Javaのプリミティブ型にはそれぞれをラップした型があります。
int Integer
long Long
short Short
double Double
float Float
byte Byte
char Character
boolean Boolean


人気Q&Aランキング