thisとsuperの使い方を初心者向けに解説【Java入門講座】4-3 thisとsuper
Vložit
- čas přidán 28. 06. 2024
- 【初心者向けJava入門講座】4-3 thisとsuper の授業動画です。
thisとsuperの書き分けや使いどころ、使うメリットを分かりやすく解説!
⭐無料&楽しく勉強できる場所を作りたい!そんな想いで授業動画を作ってます😁
→チャンネル登録/高評価/周りにオススメ で応援してもらえると嬉しいです✨✨
🌸チャンネル登録はこちら!
czcams.com/users/SekaChan?su...
📙授業ノートはこちら!
bit.ly/3G4Xy3E
📄プログラムはこちら!
bit.ly/3rxRFbm
👀関連動画はこちら!
▼前の動画
• オーバーライドのメリットと3つの条件【Jav...
▼次の動画
• finalの意味と使い分けをシンプルに解説【...
▼授業動画の一覧
• 独学でJavaプログラミングをマスター!初心...
💡チャプター
00:00 今回のテーマ
00:20 変数・メソッドの呼び出し
06:10 コンストラクタの呼び出し
09:52 サンプルプログラム
🙋♂️プロフィール
【せかチャン 菅原】
・東京工業大学大学院 情報理工学研究科 卒業
・大学生、大学院生のときに5年半塾講師
・IT研修講師として情報技術、プログラミングのセミナーを企画・実施
・Oracle社より「Instructor of the Year(満足度日本一)」「Java講師賞」を4年連続受賞
「分かった!」と言ってもらえる瞬間、勉強を楽しいと感じてもらえる瞬間が好きです。
フリーラーニング(無料で学べる場)を広げたいと思ってCZcamsをはじめました。
一緒に楽しく勉強&成長していきましょう!
📳Twitter
/ sekachanit
🎵音源提供
DOVA-SYNDROME
dova-s.jp/
※動画によっては使用していない場合があります
#Java #プログラミング #せかチャンのJava入門講座 #せかチャン
とても丁寧な説明で、superとthisが理解できました。ありがとうございます。
うらさん、コメントありがとうございました!
superとthisって最初はかなりややこしいですよね。
でもこの動画が理解に役立ったようで良かったです😄
すごく丁寧でもやもやしていたthisの疑問が解けていきました、ありがとうございます!😂
あすさん、コメントありがとうございました!
thisって最初は難しいですよね😄
この動画が理解に役立ったようで良かったです!
本当素晴らしくわかりやすい…✨
毎動画タメになっています🙇🏽♀️!!
ご質問なのですが、
もし親クラスのメソッドにsuper();を
記述するとアクセス先は[java.lang.Object]になる解釈で合っていますでしょうか?(親クラスなので特に明示する必要は無いかと思うのですが…気になりまして💦)
xanaさん、コメントありがとうございました。
僕の動画がタメになっているようで嬉しいです!
親クラスにsuper();を書いた場合は、さらにその親クラス(java.lang.Object)にアクセスする解釈で合ってますよ👍
4章が全体的に難しくて何回も見直しています、、、頑張ります!!
トキトキさん、コメントありがとうございました!
セミナーをやっているときも、4章は一番質問が集中しますね。
たしかに難しいところですが、ここを乗り越えれば入門講座のゴールが見えます。
無理せず自分のペースで頑張ってください!
使い方をなんとなく理解することになりましたが、実用するにはかなり難しい気がします。経験により、様々な応用方法があるでしょうね。
TERIGELET_ISQIN さん、コメントありがとうございました!
thisとsuperは大体同じような場面で使われることが多いですね。
このまま4章を進めていってもらえれば、使い方に慣れていけるかなと思います。
質問させていただきます!
13:23辺りで
Super(name);とサブクラスからスーパークラスを呼び出している箇所についてですが、
Super(name)(8行目)が指しているのは、スーパークラス内のコンストラクタ?であるPerson3(String name){}
を指しているのでしょうか?
その認識で正しいですよ👍
【super】のところがスーパークラス名【Person3】に置き換わるイメージです。
いつもありがとうございます。1点質問がございます。
サンプルプログラムで、this(name,999)と記載されていましたが、
これまではsetStuNoメソッドを用いて、呼び出しをされていたかと存じます。
今まで直接、設計図クラスに名前や数字の指定をすることがなかったので違和感がありましたが、
このようなことは一般的なのでしょうか。
そらおちゃんねるさん、コメントありがとうございました。
this(name, 999) のような書き方は、実際の開発現場でもよく使われますね。
詳しくは、3章のコンストラクタを復習してみてください。
いつもありがとうございます。
9:16あたりの、「this(~)、super(~)がコンストラクタ内になければ自動的にsuper();が挿入される」ことについてご質問です。
例えば、ホワイトボード右側4行目のsuper(name);が無かった場合、4行目にはsuper();が挿入されるという理解であっていますか?
この場合、StudentクラスのスーパークラスであるPersonクラスにはsuper();というコンストラクタが存在しないため、Studentクラスで何かしらの処理が発生することもない、ということでしょうか?
そうですね。4行目の super(name); がなかった場合は、super(); が自動的に挿入されます。
さらにプログラムを動かそうとするとどうなるか?については、どうなるかを予想して実際に試してみましょう!
自分でプログラムを書き変えて動かしてみる時間が、一番理解が深まるので😄
@@SekaChan ありがとうございます。自分でいろいろ試してみます!
質問があるんですが、
継承関係にある2つのクラスがあった時に継承先から継承元の変数にアクセスする際に使うのはthisで合ってますよね?
コンストラクタ、メソッドはsuper
はい、それで合ってますね😄
なるほど。
いつでも継承元クラスにアクセスする際にsuperを使う訳じゃないんですね。
継承元の変数にアクセスする時はsuperを使うと。
ありがとうございます。理解しました。
いつもありがとうございます。復習していていろいろ考えてしまうのですが、
コンストラクタを引数別にオーバーロードしていて、引数がない(足りない)インスタンスを生成したときに、引数が足りなくても初期値を設定するためにthisを用いて、どのような引数でインスタンスを生成しても最終的にすべてのメンバ変数を設定するコンストラクタにしているということでしょうか?
また実際の業務ではインスタンスを生成する場合にこの例のように、引数が異なるインスタンスを生成することやその場合にNULLや0を避けるために"未設定"などの初期値を設定することが多いのでしょうか?
理解しているつもりですが、言葉にすると難しく、わかりにくくてすいません。。。
ぺさん、コメントありがとうございました。
前半の質問は、たぶんthis(~)のことですよね。
コンストラクタを引数別にオーバーロードしているのは、最終的にメンバ変数に値を設定できるようにしておきたい意図もありますが、呼び出す側にとって利用しやすくする狙いもあります。
インスタンスを生成する時点で名前を設定したい場合はPerson(name)を呼び出して、名前が決まっていない場合はPerson()を呼び出すことができるので。
実際の業務で初期値をどうするかについては、プロジェクトによって違いますね。
デフォルト値を0やnullとしておくほうが自然なケースもあれば、「未設定」のような別の文字列を代入するケースもあります。
@@SekaChan いつも見させていただいて励みになっております。ご丁寧にありがとうございました😭
thisについてお聞きしたいのですが、this変数の中身はインスタンスのアドレス値が入っているのでしょうか?
コメントありがとうございました!
thisは変数ではないので、「何かの値が入る」ということはないですね。
thisはインスタンスやコンストラクタを利用するためのキーワードというイメージです。
@@SekaChan
ありがとうございます!
要するにthisとsuperはメソッドを呼び出すために使う認識で合ってますか?
メソッドだけではなく、メンバ変数にも使いますね😄
superで呼び出されるメソッド・メンバ変数は、スーパークラスの中だけかな?スーパークラスが別のスーパークラスで継承されてる場合、どうなるんだろ
やくまつさん、コメントありがとうございました。
スーパークラスがさらに上のスーパークラスから継承しているメソッドやメンバ変数も、(privateでなければ)呼び出すことができますよ。
@@SekaChan 返信ありがとうございます😊
では、superで呼び出されるメソッドがオーバーライドされていた場合、どちらが優先されるのでしょうか?オーバーライドされたメソッド?される前のメソッド?
@@user-jx4nb6zn7y さん、返信ありがとうございます。
オーバーライドされた後のメソッドですね。
そうやっていろいろと疑問を感じられる人はプログラミングの素質があると思います。
実際にプログラムを作って疑問を解決していければ一気にスキルアップできるので、ぜひいろいろと試してみてください👍
13:00 この場合、Person3.nameが菅原にならないのでしょうか?
13:14 は、Student3.stuNoが999にならないのでしょうか?
13:26 はstu.nameとstu.stuNoを表示しないのでしょうか?
n tさん、コメントありがとうございました。
そうですね。Person3.nameやStudent3.stuNoはそのようになりません。
また、今回のプログラムではstu.nameとstu.stuNoはdisplay()メソッドを通さないと出力することはできないです。
static変数やカプセル化について復習してもらうと、理解がより深まると思います😄
●3-7 static → czcams.com/video/P9CVQ6IuquM/video.html
●3-8 カプセル化 → czcams.com/video/AAHWf_yqEyY/video.html
ありがとうございます。
復習してみます。
お世話になっております。
例えば、コンストラクタが2つ以上同じクラス内にあり、引数の数も同じとき、
Student3 (int a , int b){}
Student3 (int c , int d){}
この場合、this(10,20)とすると、呼び出されのはどちらでしょう。また、その理由をお聞かせ願います。
よろしくお願い致します🤲
yamashitaさん、コメントありがとうございました。
この場合はStudent3クラスをコンパイルしたときにエラーになりますね。
実際に試してみるとエラーが出る箇所やメッセージも見られるので、より深い理解につながると思いますよ👍
Javaのメソッドは、メソッド名と引数で識別されるから、この2つが重複するとコンパイル通らないと思う。
難しいです…。理解できるまで繰り返し見るか駆け抜けるかで迷います
たしかに4章は難しいですよね…
プログラミングは自分で手を動かすときに一番理解が深まります。
次の演習問題まで駆け抜けてもらって、プログラムを作りながらいろいろ試してみてもらうのがオススメですね。
クラスが3つもあってティキタカみたいになってきた
ここ中々複雑ですね😂
あ さん、コメントありがとうございます!
たしかにここは複雑ですね💦
入門講座の中で4章が一番ややこしいので、ここを理解できれば一気に道が開けると思ってください!
このレベルの授業がタダなのはヤバすぎる。
いつか出世払いで授業料払います。
Javaはかなり実践的なレベルまで授業動画を作ってあります。
たくさんスキルアップして出世してください😁
神授業とはいえさすがに難しくなってきた
ああさん、コメントありがとうございました!
入門講座のなかで、この4章が一番難しいと思います。
ここを乗り越えればゴールは近いので、焦らずじっくりと進んでいってください😄
またまた質問で大変恐縮です。
いつものように動画内容を自分でいろいろと改造しているときにふと思ったことです。
質問の内容として、今回のPersonクラスとStudentクラスが継承関係になく(動画の主旨と違っていてすみません)
下記のようなクラスのメンバとして他のクラスを持っている場合、そのメンバとなるクラスのインスタンス生成は
どのような形式で行うのが適切なのでしょうか?
具体的には、Mainクラスのインスタンス生成パターン1とパターン2のどちらで行うのが一般的?なのでしょうか。
作り方は色々あり、よくわからなくなってしまいました。
質問の主旨がまとまってなくですみません。。。
【Personクラス】
package School;
import java.util.Objects;
import java.util.Arrays;
public class Person {
private String name;
public Person() { this("未設定"); }
public Person(String name) { this.name = name; }
public Person(Person p) { this(p.getName()); }
public String getName() { return this.name; }
public void display() {
System.out.println("名前 :" + this.name);
}
// 文字列表現
@Override
public String toString() {
// 本当はnameの文字数(半角・全角)を指定できるとよい(どうやってカウント?)
String fm1 = String.format("名前 :%-8s ", this.name).replace(" ", " "); // 全角桁数揃え
return fm1;
}
}
【Studentkクラス】
package School;
import School.Person;
public class Student {
private int stuNo;
private Person p;
public Student() {
this("未設定", 999);
}
public Student(String name) {
this(name, 999);
}
public Student(String name, int stuNo) {
this.p = new Person(name);
this.stuNo = stuNo;
}
public Student(Person p, int stuNo) {
this.p = new Person(p.getName());
this.stuNo = stuNo;
}
public int getStuNo() { return this.stuNo; }
public Person getPerson() { return new Person(p);}
public void display() {
System.out.println("名前 :" + p.getName());
System.out.println("学籍番号:" + this.stuNo);
}
// 文字列表現
@Override
public String toString() {
// 本当はnameの文字数(半角・全角)を指定できるとよい(どうやってカウント?)
String fm1 = String.format("名前 :%-8s ", p.getName()).replace(" ", " "); // 全角桁数揃え
String fm2 = String.format("学籍番号:%2d", this.stuNo);
return fm1 + fm2;
}
}
【Mainクラス】
import School.Person;
import School.Student;
public class Main {
public static void main(String[] args) {
/*
// インスタンス生成パターン1
Student stu = new Student("菅原", 1);
*/
// インスタンス生成パターン2
Student stu = new Student(new Person("菅原"), 1);
stu.display();
}
}
6600V HVさん、こんにちは。
載せてもらったプログラムの意図を正確に把握できているか分からない部分はありますが、一般的にはパターン1の方が自然な印象を受けましたね。
クラスとメンバ変数の関係を「has-a関係」ということがあって、
「Student has a stuNo」は自然でも
「Student has a Person」は不自然に感じるためです。
ただ、クラスの設計方法に正解はないのと、僕がプログラムの意図を把握できていない可能性があることから、1つの意見として受け取ってもらえたらと思います。
-----
コメント欄での質問回答は、動画を見てくれた人がより理解を深められるようにと願って実施しています。
なので、動画内容と離れた質問については回答しかねることもあります。
すみませんが、念のためご承知おきくださいね。
(質問を載せてもらうのも手間がかかることだと思うので💦)
has aの関係について回答いただきありがとうございます。講座の内容と直接関係のない質問で大変恐縮しています。以後気を付けます。