質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

5回答

8212閲覧

戻り値がクラス名になっている場合の読み方

wassan_nikoniko

総合スコア9

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2021/06/10 10:40

前提・実現したいこと

戻り値がクラス名になっている場合の読み方・理解の仕方
今回でいうと
public Goo useGoo(Goo g){}の部分に当たるところになります。
一般的な戻り値Stringやintなどはそのデータ型で返すんだなとわかるのですが、Gooなどといったクラスで返すというのはどういう考え方になるのかが理解できていないため、ご教授いただければ幸いです。
引数のところ(Goo g)というのもわかっていないので、申し訳ないのですが、お力添えいただければ幸いです。

該当のソースコード

java

1 2//class1 3class Boo{ 4 private String msg; 5 6 public Boo(String m){//コンストラクタかな。 7 msg=m; 8 } 9 10 public void setMsg(String m){ 11 msg=m; 12 } 13 14 public String getMsg(){ 15 return msg; 16 } 17 18 public Goo useGoo(Goo g){ 19 setMsg(g.getMsg()); 20 return g; 21 } 22 23} 24 25//class2 26class Goo{ 27 private String msg; 28 public Goo(String m){//コンストラクタかな。 29 msg=m; 30 } 31 32 public void setMsg(String m){ 33 msg=m; 34 } 35 public String getMsg(){ 36 return msg; 37 } 38 39} 40 41//class3 42public class test3 { 43 44 public static void main(String[] args) { 45 Boo b=new Boo("Boo"); 46 Goo g=new Goo("Goo"); 47 b.useGoo(g); 48 System.out.println(b.getMsg()+":"+g.getMsg()); 49 } 50 51} 52

試したこと

java silverの紫本にて出題されている問題なので、チャプターを確認しながら復習していたのですが特にここに関する記述がありませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2021/06/10 11:42

> 一般的な戻り値Stringやintなどはそのデータ型で返すんだなとわかる Stringもれっきとしたクラスです。
momon-ga

2021/06/10 11:46

public String hoge(String s){ return s; } は、わかるけど、 public Goo hoge(Goo g){ return g; } だと、わからないってことですか?
wassan_nikoniko

2021/06/11 03:33

public String hoge(String s){ return s; } は、わかるけど、 public Goo hoge(Goo g){ return g; } だと、わからないってことですか? >ご返答いただきありがとうございます! そうです!その通りです!上のコードだとStringの型として文字を返すというのはわかるのですが、 下のhogeだとGoo型を指定しているというのはわかるのですが、そもそもの話、Goo型(クラス)とは 何を返すのかというところがわからないです。。。
guest

回答5

0

public String hoge(String s){

return s;
}
は、わかるけど、
public Goo hoge(Goo g){
return g;
}
だと、わからないってことですか?

ご返答いただきありがとうございます!

そうです!その通りです!上のコードだとStringの型として文字を返すというのはわかるのですが、
下のhogeだとGoo型を指定しているというのはわかるのですが、そもそもの話、Goo型(クラス)とは
何を返すのかというところがわからないです。。。

たぶん、

Stringの型として文字を返す

の部分を見た感じ、いろいろ理解が足りていないと思います。

いわゆる文字列”あいうえお”は、Stringクラスのインスタンスですが、

実際のソースは、ご提示のGooクラスより複雑です。
Stringクラスのソース

つまり、ただの文字列でなく、変数とメソッドをもった塊です。
Gooクラスも、Stringクラスと同様に、変数(msg)とメソッド(setMsg、getMsg)をもった塊です//
なので、たとえば

Stringなら、”あいうえお”みたいな単純なものでなく、
実際には、以下のようなイメージです。

String { private final char value[] = {'あ','い','う', 'え', 'お'}; // あとは省略 }

これと同様に、Gooのイメージも

Goo { private String msg; }

というだけなのですが・・・

すごく回り道しましたが、
StringもGooもクラス定義通りの変数とメソッドを持った型というだけです。

一般的な戻り値Stringやintなどはそのデータ型で返すんだなとわかるのですが、Gooなどといったクラスで返すというのはどういう考え方になるのかが理解できていない

java

1//Stringを返す場合 2String s = new String("Goo"); // 一般的に、このような書き方は実際やらない 3return s; 4 5// Gooを返す場合 6Goo s = new Goo("Goo"); 7return s;

上記の通り、ほぼ同じ見た目になります。
Stringの場合、内部のvalue配列に引数が格納されますし、
Gooの場合、内部のmsgに文字列が格納されます。

投稿2021/06/11 07:07

momon-ga

総合スコア4826

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

「一般的な戻り値Stringやintなどはそのデータ型で返すんだなとわかる」ということなら、 その「Stringjもクラスであることから理解できるのではないでしょうか。

Javaの変数にはintなどのプリミティブ型のデータを持つものと、参照型というクラス型や配列型を持つものがあります。
クラス型の変数は、その型のクラスのインスタンスを参照する変数です。

投稿2021/06/10 12:15

TakaiY

総合スコア13790

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

まず、オブジェクト指向が何たるかを先に理解した方がよさそうです。

そうしないと理解しづらいかも。

えーっと、まず、オブジェクト指向(以降 OOP) は、

データ(= フィールド) と処理(= メソッド) をひとまとめにしたオブジェクト』なるものを中心に見る発想法です。

C言語とかのような非OOP言語では、データと処理、つまりデータと関数は別物でした。

でも、これをひとまとめにすることで、『オブジェクトだけが対象データとその処理方法を知っている』ので、

オブジェクトに対象データの処理と管理を任せる』のです。

で、クラスはこのオブジェクトのデータ構造(どういうデータを持っていて、どういう処理をするのかとかの構造) をコンパイラやインタプリタ(言語によって言い方とかが違うが)に教えてあげるためのものです。

『あっ、コンパイラ君、こういうデータ構造のやつがあるんでよろぴく~♪』と教えてあげるためのものです。

そのため、クラスを定義しただけでは使えません。

よってクラスからオブジェクトを生成します。これを『インスタンス化』とも言います。

Java

1Goo goo = new Goo("Goo!");

と書いたなら、

Gooというクラスで生成して、Gooというクラス(データ構造)として保持しています。

そうすると、呼び出し側(mainメソッド等)からは Gooのオブジェクトとして認識できるのです。

ちなみに、継承や実装は『拡張するため』ではなく、『親と同一に見せる為』です。

たとえば、Javaでの

Java

1List<int> nums = new ArrayList<int>();

とかですね。

Listインターフェースを実装しているのは、ArrayList ( 内部では動的配列っぽい ) と LinkedList ( 内部ではリスト構造っぽい ) らしいです。

で、オブジェクトを運用する側( mainメソッドとか ) からは、『データの保持』とかが必要で、どういう
内部構造なのか意識しなくても使えるように、List<T> でやっているのです。

インターフェースを実装すると、実装先、つまり実装クラスではインターフェースにあるメソッドを実装しないといけません。
言い換えると、『インターフェースにあるメソッドは必ず持っている』と考えることが出来ます。

通常クラスを継承したりする場合も、実装は迫られないですが、『必ず持っている』ので、
オブジェクトだけが知っている状態です。

これを実現するためのものです。

public void method1( Goo goo ){ // 何かしらの処理 }

とかなら、単純に引数として Gooを引き受けているだけです。

public Goo method2( String name ){ // 何かしらの処理 return new Goo( name ); }

とかなら、単純に戻り値として、Gooのオブジェクトを返しているだけです。

質問にある

public Goo useGoo(Goo g){ setMsg(g.getMsg()); return g; }

は何がしたいのかよくわかりませんが。( そもそも設計が曖昧すぎるので )

投稿2021/06/10 11:29

編集2021/06/10 11:34
BeatStar

総合スコア4962

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

私も学習中の身なので一言一句正確な内容という保証はないのですが、ひとまず理解するための説明をします。

Java

1Goo g=new Goo("Goo");

右辺は Gooクラスをインスタンス化しているのはわかると思います。メモリ上にインスタンス化されたオブジェクトが作成されます。

左辺のGoo g というのは Gooクラスの型で gという変数を生成しています。
intなどのプリミティブ型変数は値そのものが入っていますが、クラス型の変数gは オブジェクトそのものではなく オブジェクトを示しているだけです。実際にはメモリ上のオブジェクトのアドレスを示しています。
(ここの説明が正しい表現か不明ですが、今はそういう理解でいいかと思います)

クラスⅡ - Java入門 - IT専科
このリンクの一番下にある 「ガベージコレクションの対象となるオブジェクトの図」がイメージしやすいと思います(本文を読むと混乱するかもしれません、今は図だけ見てください)。

上記を踏まえた上で、以下test3クラスに手を加えています。

Java

1//class3 2public class test3 { 3 4 public static void main(String[] args) { 5 Boo b=new Boo("Boo"); 6 Goo g=new Goo("Goo"); 7 Goo f ; 8 f= b.useGoo(g); 9 System.out.println("b :" + b); 10 System.out.println("g :" + g); 11 System.out.println("f :" + f); 12 System.out.println("b.useGoo(g):" + b.useGoo(g) + "\n"); 13 14 System.out.println(b.getMsg()+":"+g.getMsg() + ":" + f.getMsg()); 15 16 f.setMsg("Change"); 17 System.out.println(b.getMsg()+":"+g.getMsg() + ":" + f.getMsg()); 18 } 19 20} 21

上記実行すると下記のような結果が出力されます

b :Boo@2a139a55
g :Goo@15db9742
f :Goo@15db9742
b.useGoo(g):Goo@15db9742

Goo:Goo:Goo
Goo:Change:Change

Goo型の変数fを宣言して f に b.useGoo(g) の実行結果(戻り値)を入れています。
変数g ,f そして b.useGoo(g) そのものを出力することで、
そのオブジェクトのクラス名と@の後ろにハッシュコードが出力されます。

ハッシュコードはオブジェクト(インスタンス生成)毎に異なるものですが、ここでは同じ値になっています。

Java

1Goo g=new Goo("Goo");

つまりこの実行結果は、gもfも b.useGoo(g) 戻り値も、上記でnewされた同じオブジェクト(Gooクラスのインスタンス)ということを示しています。

useGoo()メソッドは引数で指定されたオブジェクトの参照先情報をそのままreturnしているので、変数gとb.useGoo(g)はこのように同じ結果なります。
また戻り値はGoo型のオブジェクト(の参照先情報)なので、Goo型の変数fに入れることもできます。

ちょっと余談ですが

Java

1 f.setMsg("Change");

を実行すればf と gは同じオブジェクトを参照しているので、fからでもオブジェクトの変数msgを変更できます。
勿論 g.getMsg() と f.getMsg()は同じ結果になります。

またuseGoo()メソッドは引数のGoo型オブジェクトをそのままreturnする仕様ですが、(意味はないですが)下記のように戻り値の型がGooと指定していれば、引数で指定したオブジェクトとは異なる別のGoo型オブジェクトを返すこともできます。

Booクラスに以下を追加

Java

1 public static Goo makeGoo(Goo g){ 2 Goo goo = new Goo("makeGoo"); 3 return goo; 4 } 5 public static Goo makeGoo2(Goo g){ 6 return new Goo("makeGoo2"); 7 }

test3クラスに以下を追加

Java

1 System.out.println("makeGoo :" + Boo.makeGoo(g)); 2 System.out.println("makeGoo2 :" + Boo.makeGoo2(g));

結果はこのようになります

g :Goo@15db9742
makeGoo :Goo@6d06d69c
makeGoo2 :Goo@7852e922

引き数について
メソッド内でオブジェクトを使いたいので引き数で指定している、ということは理解されているかと思います。

以下useGooメソッドを変更しました

public Goo useGoo(Goo a){ System.out.println("a :" + a); setMsg(a.getMsg()); return a; }

結果

g :Goo@15db9742
a :Goo@15db9742

これを実行するとtest5クラス内の g と メソッド内の a変数は同じオブジェクト示していることがわかります。
問題の定義ではuseGoo(Goo g) となっていて test5クラス内の変数gと同じでわかりにくいかもしれません。
引き数で与えられたオブジェクトを メソッド内で別の変数からアクセスしているだけで、扱っているオブジェクトは同じものということです。

つまるところ一連の処理は、生成されたオブジェクトを 参照先情報を入れたGoo型の変数を通してやりとりしている と考えていいと思います。
useGooメソッドは 変数gを介して参照先情報を知ることができ、その参照先のオブジェクトに操作をしてまた同じ参照先情報を返しているという処理です。

紫本私も読みましたが、あれだけでインスタス化と クラス型について完全に理解するのは難しいかと思います。
特に今後スーパークラスの型にサブクラスをインスタンス化して入れる という話がでてくると、上記説明だけでは不十分なのですが、この辺りの理解はとても大事です。
紫本だけでなくネットや他の書籍と合わせて、学習されることをお奨めします。

投稿2021/06/11 07:44

編集2021/06/11 10:45
Crimson_Tide

総合スコア509

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

public Goo useGoo(Goo g){}の部分に当たるところになります。

その中身を見てると、g を返してるだけです。
Goo型の変数を返してます

投稿2021/06/10 10:54

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問