<授業の進め方について> ・半年後にまとめて読むのはつらいから空き時間などにちまちま読んでいきたい気持ちがあるが, そういった自習のために扱わない章を予告していただけると幸いである. ↓ 今回の講義では,第7,9,16章はスキップしながら,なるべく前に進むことを考えているが, もしも時間をかけてゆっくり進むことを希望するのであれば,そのような方向も考えてみる. <DotLinesについて> ・DotLinesの直線の描画に際して d*x の整数部分をとる 必要性はやはりよくわからなかった。 ↓ 整数座標系を用いているからなのだが,理解できないでしょうか? <描画に関して> ・Java の DrawLine の処理は基本的には DotLines の処理と同じなのだろうか。 ↓ CanvasのdrawLineメソッドの内容は,DotLinesとほぼ同じものと考えて良いでしょう. ・CircleのプログラムでcenterYの値がcenterXと異なっている理由が分からなかった。 ↓ centerX と centerY が異なるのは,円の中心を原点と考えた際の第1象限を対象な形にするため, 特に必然性があるわけではありません. <Circleの頂点数について> ・正n角形を円に近似することで円を描画しているので, キャンバスのピクセル数600x600に対しnの値を極端に大きくすると(一部省略)円の上部が尖って見えたり, 円周の大きさが均一でなくなったりしてしまう. ↓ 整数座標系の問題をよく捕まえていますね. <Epicycloid について(一部Javaプログラミング)> ・エピサイクロイド・ハイポサイクロイドに関する本が見つからず, 仕方なくWikipediaや個人サイトを引用したりオリジナルな考 察を加えたりした. ↓ Epicycloid は置いておいて「包絡線」で検索すると,かなり多くの情報は手に入ると思う. 基本的には,解析学/微分積分学で扱われている. 1年生のときの解析の教科書に載っていなかっただろうか? <Circleのコンストラクタについて> ・Circleクラスの9行目の Integer.parseInt(args[0]) はCircleクラスの情報か? ↓ 授業で説明したように Circle は実際には正多角形であり,その頂点数を int型で与えています. <paintメソッドについて> ・paint メソッドはmainメソッドに呼び出されていないのにも関わらず、どうして動いてくれるの かよくわからなかった。 ・Canvasクラスを継承したクラスの paintメソッドはどこから呼ばれるのでしょうか? ↓ 授業で説明したように,描画すべきタイミングでJavaの仮想マシンがpaintメソッドを呼び出します. mainを呼び出しているのもJavaの仮想マシンです. <オブジェクト指向について> ・「オブジェクト」「インスタンス」「クラス」という言葉の意味がよくわからない. ↓ 「オブジェクト」の訳語は「もの」になるが,単にデータと呼ばないのは, 個別データ(フィールド)の集まりというだけでなく,メソッドという性質も持っているためである. 個々の「オブジェクト」のことを「インスタンス」と呼び, 「オブジェクト」の種類を「クラス」と呼んでいる. ただし「オブジェクト」は狭義に「インスタンス」の意味で用いられることもある. Personクラスのインスタンスとして,suzukiやsatoを作ることを考えると, Person suzuki = new Person(); Person sato = new Person(); という具合になる. <継承について> ・classの継承にチャレンジしてみましたがうまくいきませんでした。継承について もっとよくしりたいです。 ・継承に関する説明(superで何を持ってくる必要があるのや、 何を書き換える必要があるのかなど)があるとよいと思います。 ・コンストラクタとsuper()の意味がわかりません。 ↓ そもそも,すべてのプログラムは Canvas クラスから継承したプログラムであるし, 第1章の CrossLines.java と第2章の DotLines.java などは継承したクラスをさらに継承している. ポイントは,以下のとおりです. ○ 新しいクラスのコンストラクタ(クラスと同じ名前のメソッド)は必須. ○ 新しいコンストラクタでは,継承元クラスのコンストラクタを起動する必要があり,それは super() で呼び出せる. コンストラクタもメソッドの一種なので,必要な引数を与えなくてはいけない. ○ プログラムを実行させるための main メソッドも必要. ○ プログラムの振舞を変化させるために,paintメソッドなどを再定義(オーバライド)する. ・継承される部分,継承されない部分(途中省略)解説していただけるとありがたいです. ・継承は今後の課題として学んでいきたい。 ・継承についてもっと詳しく知りたいと思いました。 ↓ paintメソッドを override すると上書きしてしまうので,上位クラスのメソッドは呼び出されなくなります. たとえば,DotLinesでpaintメソッドを書くと,Linesのpaintメソッドは呼ばれなくなります. コンストラクタも同様のことが生じるので,super(name) などの呼出しをしています. ・protected Lines(String name) { は Linesのコンストラクタを作っていると思うのですが, String name の部分の役割がわかりませんでした. ↓ コンストラクタはメソッドの一種であり,メソッドを定義しています. メソッド定義の最初にはメソッド名と仮引数(メソッドを値を受け取るための変数)が出てくるが, Java (C や C++ なども)のような強い型付の言語では仮引数や変数宣言の際に型を指定します. ここでは,name という仮引数(変数)が String 型であることを意味しています. つまり new Lines(…) とコンストラクタを呼び出す場合に … の部分には文字列が入らなくては いけないことになります. ・super() の ()に中身がないのは,なぜかよくわからなかった. ↓ この上位のコンストラクタは引数をとらないためである. Linesのコンストラクタの引数は1個,Circleのコンストラクタの引数は2個であり, 引数の個数には特に制限はない.つまり,引数のないコンストラクタ(メソッド)もある. <パッケージ> ・「継承の方 (DotLinesなど)でimportしているのがjava.awt.*だけで、java.awt.event.*はいらないのか?」 ということが少し引っかかっており、「むしろjava.awt.event.*はjava.awt.*に 含まれているのではないか」 といったことも思うので、その辺りも解説していただ きたいです。 ↓ パッケージのimportは,当該のクラス定義の中で,実際に明示的に利用されるクラスのパッケージだけでよい. DotLinesでは Graphics を使っているので,awt パッケージが必要だが, その他のプログラムのようにWindowEventなどは使っていないので,awt.eventパッケージは不要です. <thisについて> ・感想ではなくプログラムに関する質問なのですが, f.add(this) の this というのは このクラスをさしているのかこのクラスのインスタンスをさしているのか メソッドを指しているのか何なのでしょうか. ↓ thisはインスタンスを指している.授業のプログラムでは,ほぼコンストラクタ内で出てくるが 新しく作られているインスタンス自体を表しています. <変数名の有効範囲(スコープ)について> ・(Circle.javaにおいて)protected int[][] points の時に protected int[numberOfPoints][] points としない理由がわからなかったです。 numberOfPoints は protected Circle{}内でのみ有効ということでしょうか? ↓ numberOfPointsのスコープ(有効範囲)はコンストラクタ内に限られています. また,Javaでは型名と実際のメモリ確保とを分けて書く方が自然.int[][]は型を表しており, newしたところでメモリ上の領域が確保されます. <無名クラスについて> ・DiamondPatternとDotLinesには 〜$1.classファイルが作成されなかったのはなぜですか? ↓ 第4章で出てくる無名クラスがに対応している(第4章を勉強してから考えよう).