インスタンス化の方法とメモリ内部の動きを解説!【Java入門講座】3-3 オブジェクトの使い方

Поділитися
Вставка
  • Опубліковано 14 жов 2024

КОМЕНТАРІ • 54

  • @fmak3959
    @fmak3959 2 роки тому +7

    もこもこの部分の説明がわかりやすかったです。インスタンス化では、変数の箱一つが用意されるわけではなく、クラス全体の箱が用意されるのですね。ここをを勘違いしてました。

    • @SekaChan
      @SekaChan  2 роки тому +2

      FM AKさん、コメントありがとうございました!
      そうですね。インスタンス化をするとオブジェクトのもこもこがボンとメモリ上にできるイメージです。
      ここが分かるとこの先の理解がさらに深まりますよ👍

  • @YY-oj4gu
    @YY-oj4gu 2 роки тому +11

    菅原先生のいいところ①字がキレイ

    • @SekaChan
      @SekaChan  2 роки тому +3

      吉田雄一さん、こんにちは😃
      嬉しいコメント、ありがとうございます!
      少しでも見やすい動画になればと思って、字は丁寧に書くように心掛けています。
      図もうまく使って、もっと分かりやすい板書を追求していきます🖊

  • @もも太郎-b8n
    @もも太郎-b8n 4 місяці тому +1

    研修でJavaの理解に苦しんで半べそかきながら見ていたのですが、菅原さんのおかげで少しわかってきた気がします。ありがとうございます😭

    • @SekaChan
      @SekaChan  4 місяці тому +1

      この動画にたどり着いたということは、何とかしなくちゃって思えている証拠です👍
      基本をしっかり理解できればこの先にもつながるので、無理せず自分のペースで頑張っていきましょう!

  • @たまくん-l7c
    @たまくん-l7c 2 роки тому +4

    引数、戻り値。の所はさすがオラクルマスターさんだと思いました。有り難う御座います。

    • @SekaChan
      @SekaChan  2 роки тому +1

      たまくんさん、コメントありがとうございました!
      そう感じてもらえて良かったです😄こちらこそ、動画を観てくれてありがとうございました!

  • @ミミ10歳
    @ミミ10歳 2 роки тому +4

    Java silverのインスタンスの問題で詰まったので見返します!
    良い動画をありがとうございます😊

    • @SekaChan
      @SekaChan  2 роки тому +1

      プログラミング勉強さん、コメントありがとうございます!
      Java silverや職業訓練での勉強、順調に進んでますか😄
      Java silverは結構細かい問題が出てくるので、自分がコンパイラになるくらいの意気込みで頑張ってください!!

  • @harumim4409
    @harumim4409 2 роки тому +3

    改めて菅原先生の動画を観ると、板書右側は(現場で使う)設計図の基本の「キ」=ベースがあることに気づきました。
    開発現場で分かりにくい説明をする人の説明よりも、こちらの動画の存在に早く気づいた人の方が成長と上達が早いと思います。

    • @SekaChan
      @SekaChan  2 роки тому +1

      Harumi Mさん、コメントありがとうございました!
      そうですね。右側に書いたクラス図とメモリ上のオブジェクトの関係は、オブジェクト指向のベースともいえる考え方かなと思います。
      「オブジェクト指向が苦手」って感じている人にこの動画が広まっていったら嬉しいですね😄

  • @みっとんファン
    @みっとんファン 2 роки тому +5

    インスタンス化の方法が分からなくて困っていた所この動画を見つけて何となくですが理解出来ました!演習問題もチャレンジしてみます!配列のインスタンス化もやってくださると嬉しいです!とっても参考になりました。ありがとうございます!

    • @SekaChan
      @SekaChan  2 роки тому +1

      みっとんファン!さん、コメントありがとうございました。
      インスタンス化って分かりにくいですよね💦
      この動画が理解に役立ったのなら嬉しいです。
      配列の生成(←Javaでは配列はオブジェクトではないため、インスタンス化というより生成ということの方が多いですね)については、こちらの動画が参考になると思います。
      →ua-cam.com/video/nSmO1s-dkxY/v-deo.html

    • @unko_buriburi5
      @unko_buriburi5 2 роки тому

  • @koumori7869
    @koumori7869 9 місяців тому +1

    フリーラーニング最高です。いつも本当に助かっております。
    質問ですが、本動画の実行用クラスの9行目のプリントラインにあるgetAvg()に「;」が付かないのは何故でしょうか?
    「;」を付けないと設計図クラスからメソッドを呼び出せないと思っていたので不思議です!
    また、今まで沢山出てきた「;」はどんな役割を担っているのでしょうか?
    既に本動画や別動画で解説済みでしたら申し訳ありません。以上2点をお手隙の際にご回答頂ければ幸いです。

  • @wakachama5547
    @wakachama5547 Рік тому +3

    菅原先生、こんにちは!
    私だけかもしれませんが、コンストラクタ周辺からこの構文の読み方がこんがらがってしまっていたので、念のため確認させてください。
    mainクラス上にある以下構文ですが、こういう読み方で合ってますでしょうか?
    ★例 15:16 の部分
    Student stu1 = new Student()
    【読み方の解釈】
    (左側)
    Studentクラスという設計図を元にしてつくったオブジェクトに、stu1という名前をつけるよ。
    (右側)
    Studentの設計図クラスで定義したものをnewして実際に作るよ。
    ⬇️
    【左と右側を合体させた解釈】
    Studentの設計図クラスを元に実際にオブジェクトを作ったから左側にイコールで代入して、stu1という名前をつけるよ。
    以上です。
    恐れ入りますが、ご確認いただけますと幸いです🙇‍♀️

    • @SekaChan
      @SekaChan  Рік тому +1

      まいまいさん、こんにちは!
      読み取り方はそのイメージで合ってますよ👍
      さらに、6:30 までに書いたメモリ内のイメージ図が頭の中に描けるようになれたらカンペキですね。

    • @wakachama5547
      @wakachama5547 Рік тому +1

      @@SekaChan
      いつも早いレスポンスありがとうございます!
      お陰様で、メモリ領域のイメージ図の理解もより明瞭になりました🙇‍♀️✨️

  • @ym-fc1lq
    @ym-fc1lq Рік тому +2

    いつも大変分かり易い動画をありがとうございます!
    一点ご質問なのですが、設計図側で以下の様なインスタンス化をしている例を見かけたのですが、これはどういった意味があるのでしょうか?
    インスタンス化はmain側でしか行わないと思っていました。
    private Test te = new Test();

    • @SekaChan
      @SekaChan  Рік тому +1

      いつも動画を見てくれてありがとうございます!
      インスタンス化はどのクラスでもできますね。この講座でも4章に入るとそういうプログラムが出てきます。
      「private」は 3-8 カプセル化( ua-cam.com/video/AAHWf_yqEyY/v-deo.html )の動画で解説してるので、もし興味があれば見てみてください。

  • @wakachama5547
    @wakachama5547 Рік тому +4

    菅原先生、いつもありがとうございます。
    連日ですみませんが、質問させてください。
    表示させるdisplay()とSystem.outの違いがイマイチ掴めておりません。
    実行用クラスでdisplay()とする際は設計図クラスに戻り値のない(void)を呼び出す時に、System.out.println()とする際は設計図クラスに戻り値がある(return文を書く)ときという認識で合っておりますでしょうか?
    お手数ですが、お手隙の際にご回答いただけますと幸いです。

    • @SekaChan
      @SekaChan  Рік тому +2

      まいまいさん、THANKSコメントありがとうございました!
      「連日で‥」ということで気遣ってくれたのかもしれませんが、見てくれる皆さんにとって役立ちそうな質問なら喜んでお答えするので、あまり気にしなくても大丈夫ですよ😄
      (逆に、他の方にとって参考にならなそうな個人的なケースの質問にはお答えしていません)
      ①display()メソッドと②System.out.println()メソッドは、まず自分で作ったメソッド(①)か元々提供されているメソッド(②)かという違いがありますね。
      どちらを呼び出すかは、(戻り値のありなしではなく)何を出力したいのかによって変わります。
      ②は引数として渡したデータをそのまま出力するだけなのに対して、①を呼び出すと(設計図クラスで定義した通りに)そのオブジェクトの名前や英語・数学の点数を出力することができますね。

    • @wakachama5547
      @wakachama5547 Рік тому +2

      こんにちは、ご回答ありがとうございました!
      少し引っかかっていた部分でしたが、理解致しました✨️
      また、暖かいお言葉ありがとうございます😢
      連日の上、質問ベタなのでご迷惑ではないか心配で恐縮しておりました。
      他の方の参考になるとより嬉しいので、コード表記や定義で疑問が湧きましたら質問させていただきます🙇‍♀️

  • @user-oh7ki9yz9q
    @user-oh7ki9yz9q 4 місяці тому +2

    12:40秒頃の設計図クラスなんですがvoid display、 void setScore、 double getAvg の、三つの処理の順番はどのように決まっているのでしょうか。void displayを処理の最後に持ってきたりしてはいけないのでしょうか。

    • @SekaChan
      @SekaChan  4 місяці тому +1

      メソッドの順番は決まってないですね。
      ためしに、display()メソッドを最後に移動してコンパイルしてみてください😄

  • @manabi6928
    @manabi6928 4 місяці тому +1

    字がきれいなのはよいね!
    setAvg(): double は なんでやねん!って感じだけどw こういう場合は getAvg(): double または calcAvg(): double がええなあ。
    頑張ってください!!

    • @SekaChan
      @SekaChan  4 місяці тому

      ありがとうございます!!
      板書の「setAvg(): double」は、たしかに「getAvg(): double」にするべきでした🙏

  • @ra-mf7ut
    @ra-mf7ut Рік тому +2

    菅原先生、いつも分かりやすい動画ありがとうございます。先生の動画が本当に一番分かりやすいです。
    1点質問があります。
    Aクラス、Bクラスがあり、BはAを継承しています。
    この時にメインクラスで
    A a = new B();
    というコードが記載されているのですが、このコードのイメージ像が掴めません。
    Student stu1 = new Student();の解説に使われているイメージ図(四角の中ともこもこの中)と同じようにA a = new B();を表現するとどのようになりますか?
    お忙しいところ恐縮ですが、ご教示いただけると幸いです。
    今後も先生の動画で勉強を続けていきます。

    • @SekaChan
      @SekaChan  Рік тому +1

      r aさん、コメントありがとうございました。
      一番分かりやすいって感じてもらえて良かったです!
      その質問は、(この動画ではなく)4章に関連深い内容ですね。
      まずはこちらの動画( ua-cam.com/video/yyPdrxOQWbs/v-deo.html )を見てもらって、それでも疑問が解決できなかったらリンク先のコメント欄で質問をしてもらえると嬉しいです😄

    • @ra-mf7ut
      @ra-mf7ut Рік тому +1

      @@SekaChan
      お忙しい中お返事ありがとうございます!
      先生の動画は一通り見たはずだったのですが、理解が足りていませんでした。お手数をおかけして申し訳ありません。
      ご紹介いただいた動画とその次のポリモーフィズムの動画でもう一度理解を深めてみます。その上でやっぱり理解が難しいようでしたら、そちらの動画の方で再度質問させていただければと思います。
      ありがとうございました。今後ともお世話になります。よろしくお願いいたします。

  • @agusamu1
    @agusamu1 Рік тому +3

    いつもわかりやすい動画をありがとうございます
    一つ質問なのですが、
    Student stu1 = new Student()
    の解釈がstu1の変数のメモリ参照値がメモリ上に展開されたstudentクラスの参照先が入るということですがstu1の型をstudent型で定義する意味とはなんでしょうか?メモリの参照値しか入らないものであれば型はなんでもいいように感じてしまいました。
    同じく配列の初期化も同様で
    int [] ary = new int[3]
    と定義してもaryには配列が確保されたメモリ参照値しかはいらないと思いますので変数の型を定義している意味がわかなくなってしまい、混乱しております

    • @SekaChan
      @SekaChan  Рік тому +2

      agusamu1さん、コメントありがとうございました。
      stu1をStudent型で定義する意味は、「stu1.~」で呼び出せる変数やメソッドをStudentクラスで定義されているものに限定することですね。
      もし間違えて「ary.getName();」という記述をしてしまった場合、コンパイラが変数aryと呼び出しているメソッドの整合性をチェックしてエラーを出してくれます。
      このように、データ型は変数は入れ物の形(メモリ上のサイズ)を決めるとともに、その変数から呼び出せる変数やメソッドを決めるイメージですね👍

    • @agusamu1
      @agusamu1 Рік тому +2

      @@SekaChan 丁寧に返信頂きありがとうございます!非常に意味がよく理解できました。メモリ参照の箱であると同時にそこから呼び出されるものがどのクラスの物かを特定するような意図があったんですね。

  • @yamashita8996
    @yamashita8996 Рік тому +2

    お世話になっております。
    1つ質問失礼します。
    Q:身も蓋もない疑問ですが、インスタンス化をする(もしくはしなければならない)理由とは何でしょうか。
    設計図クラス全体の複製をメモリ上に確保することで、そうしない場合と比べて様々なメリットがあるから?
    設計図クラスをインスタンス化しないとエラー(javaの仕様)になるから?
    お手数をおかけしますが、ご回答お待ちしております。

    • @SekaChan
      @SekaChan  Рік тому +2

      yamashitaさん、コメントありがとうございました。
      「身も蓋もない疑問」とありましたが、本質をついた良い質問だと思いますよ👍
      インスタンス化しなければならない理由は、特にありません。
      この動画で紹介した規模のプログラムであれば、main()メソッド内で変数を作れば同じ処理をできちゃいますからね。
      ただし、プログラムの規模が大きくなるとインスタンス化のメリットが出てきます。
      例えば、学校で扱う情報をすべてシステム化しようとなったとします。
      つまり、生徒の名前や所属するクラス・部活動・委員会の情報、さらにテストの得点もまとめて成績表を出力できるようにしたい。
      さらに先生の情報も入力できるようにして、業務内容や生徒への指導内容なんかもまとめられるようにする。
      このようにシステムで扱う情報と処理が多くなってくると、main()メソッドだけではプログラムがものすごーく長くなってバグが増えたり、メンテナンス(修正や機能追加)が難しくなったりするんですね。
      生徒関連の情報と処理をStudentクラスに、先生関連のものをTeacherクラスにまとめて、クラスを組み合わせていくことで大きなシステムが作れるようになったわけです。
      実際オブジェクト指向のプログラミングが広まったことにより、一つひとつのプログラムがより長く使われ続けるようになりました(再利用やメンテナンスがしやすくなったため)。

    • @yamashita8996
      @yamashita8996 Рік тому +2

      @@SekaChan
      ご返信ありがとうございます。
      やはり、記述方法が容易されているのはそれ相応の理由があるのですね。
      ただお手本通り覚えるのではなく、その意味を理解できるようにしたいと感じました。

  • @yykk9539
    @yykk9539 Рік тому +2

    初めてコメントさせていただきます。
    今月からJAVAについて独学で学びだして、オブジェクト指向について学んでいる最中で、参考書と菅原先生の二本柱で学習させていただいおります!(とても分かりやすく何度も見させていただいております。)
    その過程で疑問点がございましたのでご質問させていただきます。。。
    Student stu1 = new Student();
    ↑ Studentクラスの開始アドレスの参照先がStudent型の変数stu1に入っているという
    理屈はわかりました。
    ただ、参考書では、Studentクラス内の属性部分【メンバ変数?フィールド変数?】を使用する際、例えば (String name;) と宣言していたら、(this.name)と記述した方が良いと書いておりました。その理由としては、ローカル変数や引数に同じ(name等)の変数があると、本来参照したい方ではない変数をもってきてしまう可能性があるからと書いてありました。
    ---------------------------------------------------------------------------------------------------------------------------------------------
    ・自分が思った疑問
    学習していく中で、(1)インスタンス化したクラスに属性と操作を付与して、それを1つの部品として、(2)Mainクラスのmainメソッド内では、あたかも運動会のプログラムのように呼び起こしたい(1)を記述していくということが頭に入っているのですが...。
    1 (this.name)と書かなくても、Mainクラスのmainメソッド内で、stu1.nameと書けばそもそも独立性は保たれるので必要性が実感できない...。そうゆうものだから書いてるけどもやっとしています。
    2 ローカル変数とは、mainメソッド内の直下で宣言、もしくは初期化された変数のことを言うのでしょうか。
    3 また、メンバ変数、フィールド変数の意味は同じであり、インスタンスされたクラスの直下に定義される変数のことを言うという認識で間違いないのでしょうか。
    ---------------------------------------------------------------------------------------------------------------------------------------------
    また、自分は、今から1年後には絶対、
    (1). Javaシルバーを取る。
    (2). 基本情報技術者試験を取る。
    (3). サーブレット(まだ勉強できていないです)、JSP(まだ勉強できていないです)、SQL(MySQL)を使ってポートフォリオを作る!
    をかなえるため、毎日勉強必死にしているのですが、(1),(2)は死ぬほど努力するので、
    (3)は菅原様の動画と、後々買う参考書で作れるものなのでしょうか。
    また、不安になったら菅原様にお聞きしてもよろしいでしょうか。。。
    長文失礼しました。
    お手すきの際に、確認いただけましたら幸いでございます。
    以上よろしくお願いいたします。

    • @SekaChan
      @SekaChan  Рік тому +2

      yy kkさん、コメントありがとうございました。
      せかチャンの動画がJavaの勉強に役立っているようで良かったです😄
      参考書と動画の組み合わせはとても良い勉強方法だと思うので、ぜひその調子でJavaシルバーや基本情報の取得を目指して頑張ってください!
      > 1
      「this.~」はいつでも省略できるわけではなく、記述しないとプログラムが正しく動かないケースがあります。
      「this」はこの先の動画で改めて解説するので、そちらを参考にしてください。
      > 2
      ローカル変数は(mainメソッドに限らず)メソッド内で定義した変数のことを指しますね。
      > 3
      (Javaにおいては)その認識で間違いないです。

    • @yykk9539
      @yykk9539 Рік тому +1

      @@SekaChan お忙しい中、返信いただきありがとうございます❗️
      おそらくオブジェクト指向は習うより慣れるしかないと思っておりますので数をこなして自分で作って試していきたいと思います❗️

  • @ねこ-g8r
    @ねこ-g8r 5 місяців тому +2

    はじめまして。
    質問させていただきたいのですが、なぜ"菅原"という文字列は引数として渡さないのでしょうか。
    stu1.name("菅原")というように書いてはだめなのでしょうか、、?

    • @SekaChan
      @SekaChan  5 місяців тому +1

      今回のサンプルプログラムでは、【stu1.name("菅原")】と書いてはダメですね。
      なぜかというと、【オブジェクト名.~(引数)】という書き方ができるのは【~】がメソッドのときであって、今回のStudentクラスにnameメソッドは用意されていないためです。
      例えば名前を引数と受け取るためのsetName(~)メソッドを用意しておけば、【stu1.setName("菅原")】という書き方ができるようになります。

    • @ねこ-g8r
      @ねこ-g8r 5 місяців тому +1

      @@SekaChan なるほど!非常に丁寧に教えてくださりありがとうございます。このチャンネルを見ながら勉強頑張ります✨️

  • @goike1321
    @goike1321 2 роки тому +3

    return文の置き換わりがピンとこないので教えていただきたいです。
    ①setScore(90, 80);でメソッドに引数を渡してmathScoreとengScoreに値が代入される。
    ②display();で呼び出された画面表示処理は実行され実行用クラスは続く。
    までは理解できましたが、両方ともreturn文がなくても実行用クラスに戻ってきてプログラムは進んでいます。
    なぜgetAvg();はreturn文を記述しないと85.0のプログラムが実行されないのでしょうか?

    • @SekaChan
      @SekaChan  2 роки тому +4

      GO IKEさん、コメントありがとうございました。
      たしかに、ここ分かりにくいですよね。鋭い質問だなぁと感じました🍀
      回答を一言でいうと、
      【getAvg()メソッドは戻り値の型を「double」と指定しているため】
      です。
      (質問と回答がズレちゃってる可能性もあるので、以下詳しく説明します)
      すべてのメソッドは、{ }内の処理を終えたら呼び出し元に戻って続きの処理を実行します。
      つまり、getAvg()メソッドも(setScore(90,80)、display()と同じように){ }内の処理が終わったら、実行用クラスに戻って処理が進んでいきます。
      そして、メソッドは ①戻り値がない ものと ②戻り値がある ものを定義できます。
      メソッドを作るときに①or②を(②ならば戻り値のデータ型も)決めて、メソッド定義の1行目に ①void や ②戻り値のデータ型 を記述します。
      ①の場合は戻り値がないのでreturn文はなし、②の場合はreturn文を使って「呼び出し元に戻り値を返す」という処理が必要になります。
      (voidなのにreturn文を書いたり、戻り値のデータ型を指定してるのにreturn文がなかったりする場合、コンパイル時にエラーが発生します)

  • @yukkiecookie8124
    @yukkiecookie8124 28 днів тому +1

    初歩的な質問で本当にすみません。「System.out.println~」の記載ですが、実行用クラスで記載するか設計図用クラスで記載するか判断できません。どのように区別したらよいでしょうか?

    • @SekaChan
      @SekaChan  27 днів тому +1

      System.out.println()は、実行用クラスでも設計図クラスでも記述できますね。
      プログラムの中のどのタイミングで出力を行いたいかによって、記述する場所が変わるイメージです。

  • @ぬわん-o4e
    @ぬわん-o4e Рік тому +2

    素人質問ですが質問させてください。
    コンパイルする際に、動画では、実行用をコンパイルすることによって、設計図用も自動的にインスタント化(?)されましたが、自分でコンパイルすると、エラーが発生してしまいます。エラーの説明の部分には、実行用の中にある、オブジェクトの生成の文の中の、設計図のクラス名に^が当てられ、「シンボルを見つけられません」と書いてありました。その後、設計図用→実行用 と二度コンパイルすると、実行できるようになりました。なにか、記述方法を変えれば、一度で実行することはできるのでしょうか。それとも、そういった仕様なのでしょうか。
    最近、javaをはじめ、progateで学んでいたものの、サブスクライブしなければ後半が学習できないという壁にあたり、菅原先生の動画を拝見させてもらい、有難く勉強しているところです。先生の都合のつくタイミングで大丈夫なので、返答していただけると幸いです。

    • @SekaChan
      @SekaChan  Рік тому +1

      ぬわんさん、コメントありがとうございました。
      複数のjavaファイルを一度にコンパイルする方法は、こちらの動画で解説しています。
      ua-cam.com/video/GiicGJ9EfP4/v-deo.html
      あくまでも「呼び出されるクラスから先にコンパイルする」という原則を理解したうえで使ってもらうと、より応用が利きやすくなるかなと思います。

    • @ぬわん-o4e
      @ぬわん-o4e Рік тому +1

      ありがとうございます!!@@SekaChan

  • @シェルティス-r5h
    @シェルティス-r5h 7 місяців тому

    質問です
    メソッドの方のvoid display,でSystem.out.printlnで名前と各種点数を出るような処理を行っているのに、mainメソッドの方で平均点を出す処理としてSystem.out.printlnを使っているところが理解できません
    どっちか片方にSystem.out.printlnが偏っているなら理解できますが、両方にcmdの画面で文章を出す処理があることがわからないのです
    説明をお願いします

  • @tt6121
    @tt6121 2 роки тому +4

    質問です。
    メンバ変数とメソッドの引数を別の名前にしなければ成立しない理由を教えていただきたいです。
    void setScore(int engScore, int mathScore){
    engScore = engScore;
    mathScore = mathScore;
    }
    としてみたところ、すべての変数で0が代入されていました。
    実行クラスから引数を受け取り、それが設計図クラスのsetScoreメソッドへと代入され格納されるなら上記でもよいと思った次第です。

    • @SekaChan
      @SekaChan  2 роки тому +2

      T Tさん、コメントありがとうございます。
      そのプログラムでメンバ変数に代入できないのは、変数参照時は【一番内側のブロックで宣言した変数を参照する】ためです。
      つまり、下の2,3行目のengScoreとmathScoreは、すべて1行目の引数であるengScoreとmathScoreを参照しています。
      もし4行目で System.out.println(engScore); をしたら、代入した値が表示されます。
      1: void setScore(int engScore, int mathScore){
      2: engScore = engScore;
      3: mathScore = mathScore;
      4:
      5: }
      ただ、メンバ変数とメソッドの引数が同名であるほうがプログラムは読みやすくなりますよね。
      こちらで説明している「this」キーワードを使うと、上の2行目で(引数ではなく)メンバ変数のengScoreに代入することができますよ👍
      ua-cam.com/video/_K3icVzjz-s/v-deo.html

    • @tt6121
      @tt6121 2 роки тому +2

      @@SekaChan
      ありがとうございます。代入と参照は動きが異なるということですね。
      上のプログラムで成功したら「this」キーワードを使う意味は何だろう、成功しなければ原因は何だろうと考えていました。