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

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

ただいまの
回答率

87.37%

Stringクラスについて

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 357
退会済みユーザー

退会済みユーザー

javaで
String a="あいうえお";
System.out.println(a);

みたいに記述するとStringクラス型の変数aに格納されている参照値を読み込んで
参照番地のメモリ?から文字列を参照していると解釈しているのですが、
上のコードの'a'は参照型の変数ですよね?

BufferedReader br = new BufferedReader();

でいう所の'br'と区分的には同じだと思っているのですが、
なぜ、参照型の変数である'a'だけをSystem.out.printlnに入れるだけで
文字を出力できているのでしょうか。(メソッド名が必要ない?)
Stringクラスの中の何を呼び出しているのでしょうか?
BufferedReaderクラスでは同じようなことはできませんよね。

Stringクラスは、他のクラスとは根本的になにかが違うのでしょうか

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Zuishin

    2021/09/13 20:30

    6 から順に 100 になるまで 6 を足していけばいいでしょう。

    キャンセル

  • BeatStar

    2021/09/13 20:30

    まず、「なぜそのコードになっているか」を説明できますか?
    もしかしたら、考え方そのものが出来ていない可能性もありますし、
    単に引数とかの使い方とかが分かっていないだけかもしれません。

    それぞれ教え方とかが違うはずです。

    なので、とりあえず、「なぜそのロジックになっているのか」を本文に書いてください。
    修正できるので修正してください。

    キャンセル

  • kaina

    2021/09/13 20:39

    まだJavaを始めたばかりと思われますが、Eclipse等の統合開発環境かVS Code等のテキストエディタのいずれかを使用することをお勧めします。
    これらを使用することでデバッグというプログラミングを行う上で必須の作業を楽に行うことが出来ます。

    キャンセル

回答 2

checkベストアンサー

+1

何となく、「プログラミング全体像自体が理解できていない」と思うので、そこから説明します。

プログラミングは「こう書けばいい」ではありません。
プログラムは魔法でもなんでもなく、人間が現実世界でやっている手順を、逐一指示されながら処理利しているだけの代物である」です。

簡単に言えば『現実世界のシミュレーション』です。

とりま、プログラミングとかそういうのを置いといて、現実世界でならどうするか考えてみてください。

今回は、

[現実の課題]
1から100までの数字を一つ一つ見ていきながら、nの倍数をホワイトボードに書いていく。
ただし、nは変更できるようにしておく。(場合によっては n = 2, 場合によっては n = 6 となる)

という感じでしょうか。
これを算数かなんかの問題として出されたと考えてみてください。

私なら、

1. 数字を挙げていく( 1, 2, 3, ... 100 )
    1.1. 数字が nの倍数なら
        1.1.1. ホワイトボードに書く

的なロジックになりますね。

(1.1) はそのままだと計算できないので、言い換えてみましょう。

まず、n = 2 だとします。
では、2の倍数とそうでないものを列挙してください。

2の倍数 = { 2, 4, 6, 8, 10 ... }
それ以外 = { 3, 5, 7, 9, 11 ... }

(※ 1 は除外して考えています)

では、ここから規則性を見付けてみてください。

計算してみると 2の倍数の場合は「2で割り切れる」、それ以外は「2で割ると必ず余りが出てくる」ですね。

ということで、数字を n で割ったときの余りが0かどうかで判断できますね。

で、ここまではできているという前提で書きます。


次は『デバッグ方法』です。

デバッグ方法には何種類かありますが、まずは『コードを読む方法』を提示します。

コードを読むコツは、「一行レベルで、何をしているかを考えながら読む」です。
たとえばコメントにするとかです。

    // 引数n を受ける baisuメソッド
    public void baisu(int n){
     // 変数 iの初期値: 1, i が 100以下の間, ループしながらインクリメント
        for(int i = 1; i <= 100; i++) {
             // i が 6 で割り切れるなら
             if(i % 6 == 0){
                 // n を表示
                 System.out.println(n);
             }
        }
    }

ですね。

では、これを疑似コードとして抜き出してみましょう。

0. ( n は引数とする )
1. 変数 iの初期値: 1, i100以下の間, ループしながらインクリメント
     1.1. i6で割り切れるなら
         1.1.1. n を表示

この疑似コードをもとに、実際に手を動かしてやってみましょう。

引数として渡すのが 6 だとします。そのため、 n = 6 となりますね。

(1) によって、 i = 1 からスタート。

i = 1
n = 6

(1.1) で i % 6 == 0 を条件に見てみる。
i = 1 なので、1 % 6 == 0 ですね。満たしますか? 電卓で計算すると 0.16... と言う風に割り切れませんね。
なのでスルー。
(1)に戻って i++ により、 i + 1 = 1 + 1 = 2 よって、i = 2。

i = 2
n = 6

そして、(1.1) ですが、 2 % 6 == 0 は満たしますか? 割り切れませんね。
なのでスルー。

(1)に戻って i++ = i + 1 = 2 + 1 = 3。

... とやっていき、

i = 6 のときに (1.1) で 6 % 6 == 0 は満たすので、(1.1.1) に行く。

i = 6
n = 6

なので、 nである6をホワイトボードに書く。

... と、またi = 12 のときを見ます。

i = 12
n = 6

ですね。(1.1)で 12 % 6 == 0 は満たすので (1.1.1) に行く。

つまり、nの値を書く

n = 6 なので 6 と書く。

...と言う風になっています。

あれ????? なんで n の値を出力しているのでしょうか。普通、刻々と変換している i の値を出力するのでは?

私達は何をしようとしていましたっけ? 確か、「6の倍数の数字を書く」とかだったのでは?

そういう風にロジックを追っていくと、なぜ失敗したのかがわかりますよ。

デバッガを使う方法とかもありますが、これも発想自体は同じです。


[追記1]

ちなみに、これが「3の倍数」とかになったらどうなるでしょうか。
if( i % 6 == 0 ) の部分の条件式を書き直さないといけないはずです。

そこで、引数 n として与えられたものを使います。( n の意味が「個数」とか別のものだと話が変わってくるが、今回は「nの倍数」の意味で言っているので )

では、単純に計算してみてください。

2の倍数 => i % 2 == 0
3の倍数 => i % 3 == 0
4の倍数 => i % 4 == 0
...

なにかに気づきませんか?

そう、i % <N> == 0 となっていますね。(抽象度を上げると)

<N> は使える範囲で考えると 引数 n ですね。

後はわかりますね?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/09/13 21:22

    先ほどの通り丸投げにしてしまい申し訳ございません。最近始めたばかりで難しく理解力がなく大変申し訳ございません。それなのに1から教えてくださり本当にありがとうございます。
    はい、無事に解くことができました。
    本当にありがとうございます。

    キャンセル

  • 2021/09/13 22:22

    退会しなくてもいいのに…… (別に退会するなとは言わんが)

    キャンセル

-2

System.out.println(n);

なんでnを表示してるんでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/09/13 21:10

    そうですね。
    すみません、ありがとうございます。

    キャンセル

  • 2021/09/13 21:14

    どういう数字を出したいのか書いてみて、それを出すにはどうすればいいのか考えよう

    キャンセル

  • 2021/09/13 21:22

    はい、ありがとうございます。無事解決いたしました。

    キャンセル

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

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る