ラベル Java の投稿を表示しています。 すべての投稿を表示
ラベル Java の投稿を表示しています。 すべての投稿を表示

2009年8月9日日曜日

【JT】4 クラスとオブジェクト (その4)


** 入れ子のクラス
- 入れ子クラス:Javaでは、クラスの中で別のクラスを
定義できる。これはCLOSではできないような。
- 入れ子クラスは二種類ある。
- static
- 非static (内部クラスとも呼ばれる)
*** なぜ入れ子のクラスを使うのか
- 入れ子クラスを使う3つの理由
- クラスのグループ化
- あるクラスが、別のあるクラスにとってのみ意
味をもつときにグループ化として使える。
- カプセル化
- まあ、そうなんですが。。。
- メンテナンスの容易性
- クラス定義とその利用箇所が近くなるので。
- うーん。いまいち、入れ子クラスの有用性がわから
ない。。。
*** staticな入れ子のクラス
- 特になし。
*** 内部クラス
- 特になし。
*** 内部クラスの例
- お、例を書いてみると有用性が見えてきた。自分な
りのまとめを。
- まず、クラスが概念的に大きなものであるとき、
メソッドをフラットに並べるのではなく、分類し
たいという内部概念が発生することがあるのだろ
う。そのときそれを入れ子クラスで表現する。
- 付随的な効果として、名前空間の整理があるだろう。
前項のような概念構造とのときにクラス内フラット
に、もしくはトップレベルにその名前が存在する
のはよろしくない。
- また、同じことの違う側面だが、Javaではデータ構
造をクラスで表現するので、ある処理の内部で、そ
して内部のみで必要なようなデータ構造がでてくる
こともある。するとクラスをニーズがあるまさに
その局所で定義できた方がよい。
- 内部クラスには、他のメンバと同じように修飾子を
つけることができ、意味も同じ。
- ローカル内部クラスと匿名内部クラス
- ローカル内部クラス
- メソッドの中でクラスを定義。
- 匿名内部クラス
- ローカル内部クラスで名前が無いもの。
*** 入れ子クラスのまとめ
- スコープという言葉がでてくるが、ここでいうスコー
プがなんなのかの定義がないので正直理解できない。
- チュートリアルとしては、入れ子クラスは簡単な紹
介のみというスタンスのようなので、先に進む。
*** 設問と演習:入れ子のクラス
**** 設問
- 1.
- 学習素材がWebに置かれることもあるんだな。
- http://java.sun.com/docs/books/tutorial/java/javaOO/QandE/Problem.java
- あ、そうか。この本もともとオンライン版がある
んだ。
- さて、答は、staticな入れ子クラスからインスタ
ンス変数を参照するにはオブジェクト参照を介さ
ねばいけない。
- 2.
- a.
Box.Filter
- b.
Box.AccessibleBox
- c.
java.awt.Container.AccessibleAWTContainer
- d.
Box.Filter
- e.
new javax.swing.Box.Filter(min,pref,max);
// min pref max はDimensionクラスのインスタンス。
**** 演習
- こうなった。
InnerClass2 $ java Class1
InnerClass1: getString invoked.
InnerClass1: getAnotherString invoked.
InnerClass2 $
- う、何を言いたいのが掴めない。
** 列挙型
- 列挙型(enum type)は型である。
- 列挙型は定数を複数含んでいる。定数の集合のよう
なもの。
- 定義の例は次のとおり。

public enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
}

- 列挙型は自動的にクラスでもある。(暗黙のうちに
java.lang.Enumを継承している。)よって、public な
上記Dayは、Day.javaにて定義しなければいけない。
- 列挙はこのままで配列なわけではない。staticメソッ
ドvaluesによってそれが得られる。
- うぉ。こういう風にデータ記述とfinalとコンストラ
クが連携するのか。。。
public enum Planet {
MERCURY (3.303e+21, 2.4397e6),
VENUS (4.869e+24, 6.0518e6),
EARTH (5.976e+24, 6.37814e6),
MARS (6.421e+23, 3.3972e6);

private final double mass;
private final double radius;
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
}
...
}
- listとsymbolがあればいいじゃん、とも思ってしま
う。
*** 設問と演習:列挙型
**** 演習
- 1. こんな感じ?
Rank.java
---
public enum Rank {
ACE (1),
TWO (2),
THREE (3),
FOUR (4),
FIVE (5),
SIX (6),
SEVEN (7),
EIGHT (8),
NINE (9),
TEN (10),
JACK (11),
QUEEN (12),
KING (13);
private final int number;
Rank(int number) {
this.number = number;
}
public int getNumber() {
return number;
}
}
---

Suit.java
---
public enum Suit {
DIAMOND, SPADE, HEART, CLUB
}
---

Card.java
---
public class Card {
private Rank rank;
private Suit suit;

Card(Rank rank, Suit suit) {
this.rank = rank;
this.suit = suit;
}
Card() {
this(Rank.ACE, Suit.DIAMOND);
}

public Rank getRank() {
return rank;
}
public Suit getSuit() {
return suit;
}
}
---
- 2. こんな感じ?
Deck.java
---
public class Deck {
private Card[] cards = new Card[52];
Deck() {
int i = 0; // index of cards
for (Suit s : Suit.values()) { // iterate for suits
for(Rank r : Rank.values()){ // iterate for ranks
cards[i] = new Card(r, s);
i++;
}
}
}

public void showCards() {
for(Card card : cards) {
System.out.println("suit:" + card.getSuit() + ", " +
"rank:" + card.getRank() + ", " +
"rank in number:" + card.getRank().getNumber());
}
}
}
---

PlayingCardsDemo.java // これは無変更
---
class PlayingCardsDemo {
public static void main(String[] args) {
Deck myDeck = new Deck();
myDeck.showCards();
}
}
---
** 注釈
- 注釈(annotation)はプログラムのメタデータである。
- コードの動作に直接は影響を及ぼさない。
- 注釈を利用するもの
- コンパイラ
エラー検出、警告抑止。
- 配備ツール
配備時のコード生成
- 実行時のインタラクション
注釈は実行時にも参照可能。
- 注釈は、各種宣言に付与できる。
- 例をいくつか。

@Author(
name = "Hoge Piyo",
date = "2009/8/9"
)
class MyClass() {}

@SuppressWarnings(value = "unchecked")
void myMethod() {}
*** ドキュメンテーション
- 注釈は型を持つ。
- 注釈の型は、Javaであらかじめ定義されているもの
と、ユーザが定義するものがある。
- ここでは、ユーザ定義の方法を示す。
- 例えばクラスのドキュメンテーションを注釈で実施
する。
- クラス前文型を定義する

@interface ClassPreamble {
String author();
String date();
int currentRevision() default 1;
}

- 使う。

@ClassPreamble {
author = "Hoge Piyo",
date = "2009/8/9",
currentRevision = 3
}
public class Puyo {
// Class codes
}

- Javadocで生成されたドキュメントにこの情報を入れ
るには、@ClassPreambleの定義を次のようにする。

import java.lang.annotation.*;

@Documented
@interface ClassPreamble {
String author();
String date();
int currentRevision() default 1;
}

- うーん。Javaってこういう風にどんどん構文や意味
が増えていくのかなぁ。。。
*** コンパイラが使用する注釈
- 言語仕様にて定義済みの注釈型。いずれもコンパイ
ラが使う。
- @Deprecated
これがついているものを使うとコンパイル時に警
告がでる。
- @Override
スーパークラスのメソッドをオーバーライドする
ことを明示する。これがなくてもオーバーライド
するが、オーバーライドする対象がスーパークラ
スに無いとコンパイルエラーになるので、エラー
の予防にはなる。
- @SuppressWarnings
警告表示を抑制する。警告には、"deprecated"と
"unchecked"の2つのカテゴリがあり、これを指定
できる。
- 例
@SuppressWarnings("deprecation")

@SuppressWarnings({"deprecation",
"unchecked"})
*** 注釈の処理
- 注釈プロセッサは、注釈に基づくアクションを実行す
る。位置的には、Cのマクロプロセッサみたいなもん
かなぁ。
- JDK6.0では、注釈プロセッサ(名前はapt)がJavaコン
パイラに組み込まれている。
- 注釈情報を実行時に利用するためには注釈型の定義
時に指定が必要。
- 例
import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@interface SomeAnnotationForRuntime {
// ...
}
*** 設問と演習:注釈
**** 設問
- 1. うーん。わからない。javadocを書いていないこ
と?
- 2. コンパイルしたけど、何もおこらない。

AnnotationProblems $ javac Closable.java
AnnotationProblems $

- 3. なるほど。これを抑制するには、インターフェイ
スの@Deprecatedを外すしかない。
@SuppressWarningsはメソッドの定義時に対しては効
かないようだ。


この程度ちょこっと進むのにも、4時間くらいかかる。。。
なんとかならんかなぁ。

こつこつ。

2009年8月8日土曜日

【JT】4 クラスとオブジェクト (その3)


** クラス詳説
*** メソッドから値を返す
- 呼び出し元に制御を返す場合分け
- メソッド内にて実行する文が無くなった。
- return文の実行として。
- メソッド内で例外がスローされた。
- 呼び出し元に値を返す。
- 呼び出し元に返す値の型は、メソッド宣言にて指
定する。
- 呼び出し元への値の返却は、return文で実施する。
- return文に付与する式や値の型と、戻り値型は一
致しなければならない。
- ただし、戻り型がクラスの場合、returnするものの
型はそのサブクラスでもよい。これはメソッドの値
返却の話題ではなく、クラスシステムの話題じゃな
いかなぁ。
- この技法を共変戻り型(covariant return typeと
いう。
- また、戻り型がvoidのときは、return文を省略して
もよい。return文を入れるときは、式を記述しない
return;とする。
*** キーワードthisを使う
- キーワード this はカレントオブジェクトを表す。
- 使用例:シャドウイングの回避

public class Point {
public int x = 0;
public int y = 0;

public Point(int x, int y) {
this.x = x;
this.y = y;
}
}

- おもしろい。thisは現在の文脈におけるグローバル
環境を指す、みたいなもんだな。
- 使用例:同一クラス内の別コンストラクタを指す

public class Rectangle {
private int x, y;
private int width, height;

public Rectangle() {
this(0,0,0,0);
}

public Rectangle(int width, int height) {
this(0,0,width,height);
}

public Rectangle(int x, int y, int width, int height) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
}
}
*** クラスのメンバーへのアクセスを制御する
- この本、用語の運用がいまいちなところがある。{修
飾子,アクセス修飾子}について、その関係をちゃんと
説明せずに、同じキーワードについて入り乱れて使っ
ている。
- アクセス制御:アクセス修飾子などを用いてアクセ
スを制御する機構をアクセス制御と呼ぶ。
- アクセス制御による制御は、対象を2階層に分類して
いる。
- トップレベル :クラス等
- メンバーレベル:クラスのメンバー等
- トップレベルにおけるアクセスレベル

| アクセス修飾子 | パッケージ | 全世界 |
|----------------+------------+--------|
| public | Y | Y |
| 修飾子なし | Y | N |


- メンバーレベルにおけるアクセスレベル

| アクセス修飾子 | クラス | パッケージ | サブクラス | 全世界 |
|----------------+--------+------------+------------+--------|
| public | Y | Y | Y | Y |
| protected | Y | Y | Y | N |
| 修飾子なし | Y | Y | N | N |
| private | Y | N | N | N |

- クラスは、そのメンバーが属するクラス。
- パッケージは、そのメンバーが属するクラスが属
するパッケージ。
- サブクラスは、そのメンバーが属するクラスのサ
ブクラス。
- このアクセス制御というのはどういう風に位置付け
たらいいか。
- まず、Javaでは、Common Lispと異なり、名前空間
はクラス毎である。(Common Lispはパッケージ毎)
- そこで名前の可視性の定義はクラス毎(及びそれ以
上)となる。
- そのような違いがあるだけで、アクセス制御が名
前の可視性の指定であるという点は、Javaと
Common Lispに違いはない。
*** インスタンスメンバーとクラスメンバー
- キーワード static を紹介する。
- クラス変数
- フィールドの宣言にあたり、修飾子 static をつ
けるとクラス変数になる。(つけなければインスタ
ンス変数)
- クラス変数を宣言するとメモリが確保される。その
メモリが、クラス変数の名前が指す場所であり、値
が格納されている。その固定的な束縛は、そのクラ
スの任意のインスタンスに含まれている。
- クラス変数はインスタンスがひとつも存在しなく
ても利用可能。
- 例

public class Bicycle {
private int cadence;
private int gear;
private int speed;
private int id;
private static int numberOfBicycles = 0;

public Bicycle(int startCadence,
int startSpeed,
int startGear) {
gear = startGear;
cadence = startCadence;
speed = startSpeed;
id = ++ numberOfBicycles;
}
public int getID() {
return id;
}
}

- クラス変数に、当該クラス外からアクセスすると
きなどは、

クラス名.単純名

という構文が使える。インスタンスがあるときは、
インスタンスの参照経由でもアクセスできる。
- クラスメソッド
- メソッドの宣言において、修飾子staticをつける
とクラスメソッドになる。
- クラスメソッドは、そのクラスのインスタンスが
一つも存在しなくとも利用できる。
- 変数とメソッドの参照ルール
- IM : インスタンスメソッド
- IV : インスタンス変数
- CM : クラスメソッド
- CV : クラス変数
- 縦軸は文脈。(参照する側)
- 横軸は参照されるもの。

| | IM | IV | CM | CV |
|----+----------------------+----------------------+--------+--------|
| IM | 単純名 | 単純名 | 単純名 | 単純名 |
| CM | オブジェクト参照経由 | オブジェクト参照経由 | 単純名 | 単純名 |

- 本では文章で書いてあるから複雑かな、と思って
しまうが、表にすると至ってシンプル。
- 定数
- 修飾子 static と修飾子 final を両方同時に宣言
することによって、定数を表現することがある。
- 修飾子 final はその変数が変更不可能であること
を指示し、変更処理の対象になっていると、コン
パイラがエラーとなる。
*** フィールドを初期化する
- この項、次のものがでてくる。
- static初期化ブロック
- 初期化ブロック
- finalメソッド
- 正直、ここの説明で理解することは難しそうなので割
愛。
*** クラスとオブジェクトのまとめ
*** 設問と演習:クラス
**** 設問
- 1.
- a. x
- b. y
- c.
a.y = 5
b.y = 6
a.x = 2
b.x = 2
**** 演習
- 1. こんな感じ?

Card.java
---
public class Card {
private int rank; // [1,13]
private String suit; // "Diamond", "Spade", "Heart", "Club"

Card(int rank, String suit) {
this.rank = rank;
this.suit = suit;
}
Card() {
this(1,"Diamond");
}

public int getRank() {
return rank;
}
public String getSuit() {
return suit;
}
}
---

Deck.java
---
public class Deck {
private Card[] cards = new Card[52];
Deck() {
String[] suits = {"Diamond", "Spade", "Heart", "Club"};

for(int i=0;i<4;i++) { // index of suits
for(int j=0;j<13;j++){ // index of rank
cards[j + i * 13] = new Card(j + 1, suits[i]);
}
}
}

public void showCards() {
for(Card card : cards) {
System.out.println("suit:" + card.getSuit() + ", " +
"rank:" + card.getRank());
}
}
}
---

PlayingCardsDemo.java
---
class PlayingCardsDemo {
public static void main(String[] args) {
Deck myDeck = new Deck();
myDeck.showCards();
}
}
---

*** 設問と演習:オブジェクト
**** 設問
- 1. Rectangleオブジェクトを生成していない。
- 2. Pointオブジェクト : 1, Rectangleオブジェクト : 1
- 3. 参照を0にする。
**** 演習
- 1. こんな感じ?
public class SomethingIsWrong {
public static void main(String[] args) {
Rectangle myRect = new Rectangle();
myRect.width = 40;
myRect.height = 50;
System.out.println("myRect's area is " + myRect.area());
}

}
- 2. こんな感じ?
public class NumberHolderDemo {
public static void main(String[] args) {
NumberHolder myNum = new NumberHolder();
myNum.anInt = 10;
myNum.aFloat = 1.03F;
System.out.println("#<Class myNum: anInt=" + myNum.anInt +
", aFloat=" + myNum.aFloat + ">");
}
}


この章、長い!
こつこつ。

2009年8月7日金曜日

【JT】4 クラスとオブジェクト (その2)


** オブジェクト
- Javaでは、オブジェクトを数多く生成する。オブジェ
クトは、メソッドを使って相互に作用する。
- これってどういう風に解釈したらいいかな。
- データがたくさんある、ということは他の言語で
も往々にしてあることだ。
- オブジェクトは単なるデータではなくて、メソッ
ドをもっているから、その中には環境やスコー
プが存在する。
- やっぱりクロージャがたくさんあります、とい
うのとほぼ同じかな。
- オブジェクトの生成から消滅までをオブジェクトラ
イフサイクルと呼ぶ。
*** オブジェクトを生成する。
- クラスを青写真にしてオブジェクト生成する。
- 流れ
- オブジェクトを参照する変数を宣言する
- 変数のためのメモリが確保され、
- 変数が生成される。
- オブジェクトを生成する (= クラスをインスタンス
化する)
- new演算子を使う。
- メモリが確保される。
- コンストラクタが初期化する。
- そのメモリ領域への参照を返す。
- オブジェクトへの参照を変数に格納する。
- ふむ。Javaのオブジェクトというのは、どこかプロ
グラム内蔵方式に似ているな。それをプロセッサアー
キテクチャの上ではなく言語の中に実装している、
という。
*** オブジェクトを使う。
- フィールド
- 単純名
- オブジェクトの内部では、フィールド定義の際
につけた名前だけで参照できる。この名前を単
純名と呼ぶ。
- オブジェクト参照を利用して
- オブジェクトの外部からフィールドにアクセス
するには、

オブジェクト参照.単純名

という構文となる。オブジェクト参照の位置に
は、オブジェクトの参照を返す式ならなんでも
入ることができる。
- メソッド
- オブジェクト参照を利用して
- 次の形式となる。

オブジェクト参照.単純名(引数リスト)

- メソッドを呼び出すということは、オブジェクト
にメッセージを送っているとも考えられる。
- ガベージコレクタ
- オブジェクトは、それに対する参照が存在しなく
なった時点で、ガベージコレクションの対象とな
る。


こつこつ。

2009年8月6日木曜日

【JT】4 クラスとオブジェクト


* 4 クラスとオブジェクト
- 特になし。
** クラス
- BicycleとMountainBikeの例を再掲。
*** クラスを宣言する
- クラス宣言には次のものが含まれる。
- 修飾子
- (クラスの)名前
- 親クラスの名前
- インターフェイスの名前
- クラス本体 (波括弧で括る)
- クラス本体には次のものが含まれる。
- フィールドの宣言
- コンストラクタの宣言
- メソッドの宣言
*** メンバー変数を宣言する
- メンバー変数(aka フィールド)の宣言には次のものが
含まれる。
- アクセス修飾子
- 型
- 名前 (変数名)
- アクセス修飾子
- フィールド宣言にはアクセス修飾子がある。(ローカ
ル変数およびパラメータには無い)
- アクセス修飾子を一部紹介
- public : すべてのクラスからアクセス可能。
- private : 当のクラスからのみアクセス可能。
*** メソッドを定義する
- メソッドの宣言には次のものが含まれる。
- 修飾子
- 戻り型
- (メソッドの)名前
- パラメータリスト (丸括弧で括る)
- 例外リスト
- メソッド本体 (波括弧で括る)
- シグネチャ
- メソッドの名前とパラメータの型を合わせてシグ
ネチャと呼ぶ。
- 例
calculateAnswer(double, int, double)
- メソッドオーバーロード
- Javaでは、シグネチャでメソッドを判別する。す
なわち、名前が同じでパラメータリストが異なる
ものが存在でき、それらは別のメソッドであると
認識される。
- ちょっとCLOSのgeneric functionsのdispatchに似
ているような。
*** クラスのコンストラクタを作る
- コンストラクタの宣言には次のものが含まれる。
- 修飾子
- (コンストラクタの)名前 (ただしクラス名と同一
であることが必須)
- パラメータリスト (丸括弧で括る)
- 例外リスト?
- メソッド本体 (波括弧で括る)
- コンストラクタもオーバーロードする。
- コンストラクタのシグネチャの話はこの本には出て
きていない。あるのか?
- デフォルトコンストラクタ
- コンストラクタ宣言が無い場合、自動的に作成さ
れる。
- 具体的には、スーパークラスの引数なしコンスト
ラクタである。
*** メソッドやコンストラクタに情報を渡す
- varargs(aka 可変引数,可変長引数)もある
- 例
public PrintStream printf(String format, Object... args)
- argsはObjectの配列になる。
- パラメータの名前とシャドウイング
- パラメータの名前は、メソッド本体やコンストラ
クタ本体においてユニークでなければいけない。
- フィールドと名前がかぶった場合はそれをシャド
ウイングする。
- 基本データ型は値渡し
- オブジェクトは参照渡し
- 配列はどうなんだろう? newするから参照渡しかなぁ。


こつこつ。

2009年8月5日水曜日

【JT】3 Javaプログラミング言語の基礎 (その4)


** フロー制御文
- ソースファイル内の文は出現順に に(上から下の順)
に実行される。これは意味論に関することだな。
- この流れを変更するのがフロー制御文
*** if文とif-else文
- if文
- 構文
if (ブール型の値を返す式) 文
- 実行パス:1 (増えない)
- if-else文
if (ブール型の値を返す式) 文 else 文
- 実行パス:2
*** switch文
- switch文
- 構文
switch (整数型の値を返す式) switchブロック

switchブロックはBNFで書くとしてもかなり複雑な
文法なので割愛。
- 実行パス:無制限?
*** while文とdo-while文
- while文
- 構文
while (ブール型の値を返す式) 文
- do-while文
do ブロック while (ブール型の値を返す式)
*** for文
- for文
- 構文
for (初期化式; 継続条件式; インクリメント式) 文
- 実行パス:1
- 拡張for文
- 構文
for (型名 変数名 : 配列またはコレクション) 文
*** 分岐文
- break文
- 構文
break;
break ラベル;
- 意味
break単体は、最も内側のループのブロックから脱
出する。ラベル付きbreakは、そのラベル以降に出
現する最初のループのブロックから脱出する。
- continue文
- 構文
continue;
- 意味
ループ内において、continue以降の処理をスキッ
プする。
- return文
- 構文
return;
return 式;
- 意味
メソッドの呼び出し元に戻る。式が与えられてい
れば、その値を呼び出し元への返却値とする。
*** フロー制御文のまとめ
- 特になし。

*** 設問と演習:フロー制御文
**** 設問
- 1. if
- 2. switch
- 3. do-while 末尾
- 4. for (;;)
- 5. while (true)
**** 演習
- 1.
- a. second string
- b. second string\nthird string
- c. こんな感じ?
class IfDemo {
public static void main (String[] args) {
int aNumber = 3;
if (aNumber >= 0)
if (aNumber == 0) System.out.println("first string");
else System.out.println("second string");

System.out.println("third string");
}
}
- d. こんな感じ?
class IfDemo {
public static void main (String[] args) {
int aNumber = 3;
if (aNumber >= 0) {
if (aNumber == 0) {
System.out.println("first string");
} else {
System.out.println("second string");
}
}
System.out.println("third string");
}
}


こつこつ。

2009年8月4日火曜日

【JT】3 Javaプログラミング言語の基礎 (その3)


** 式、文、ブロック
*** 式
- 演算子は式の中で(のみ)使える。
- 式は文の主たる構成要素である。
- 式は値を返す。値には型がある。
- 式の例
1 + 2
1 * 2 * 3
(x + y) / 2
result = 1 + 2
value1 == value2
"Value :" + someVar
*** 文
- 文は完結した実行単位である。
- 式をセミコロンで終端すると文になるものがある。
これを式文と呼ぶ。式文になりえるのは次のもので
ある。
- 代入式
- ++や--を使った式
- メソッド呼び出し
- オブジェクト生成式
- 式文以外の文は二種類ある。
- 宣言文
double aValue = 3.14;
- フロー制御文
後述。
*** ブロック
- 0個以上の文を波括弧で囲んだもの。
- 文が許される場所にはどこでも使える。
- 例
if (condition) {
var1 = 1;
var2 = 2;
}
else {
var1 = 0;
var2 = 3;
}
*** 設問と演習:式、文、ブロック
**** 設問
- 1. 式
- 2. 文
- 3. ブロック
- 4. 複合
- 5. ;
- 6. 波括弧
**** 演習
- 1. 代入式
- 2. ++や--。
- 3. メソッド呼び出し
- 4. オブジェクト生成


こつこつ。

2009年8月3日月曜日

【JT】3 Javaプログラミング言語の基礎 (その2)


** 演算子
- 演算子は、アリティが1,2,3のいずれかであり、オペ
ランドに対して特定の操作を遂行して結果を返す記
号である。
- 演算子は優先順位をもっている。(優先順位表が示さ
れているが、割愛)

*** 代入、算術、単項
- 代入演算子
- 特になし。
- 算術演算子
- 特になし。
- 単項演算子
- 特になし。
*** 等値、関係、条件
- 等値演算子と関係演算子
- 等値演算子"=="等がどのような型に対して有効な
のかの記述が無いな。。。数だけかな? そういえ
ば、数どうしの関係についての説明も無いな。ま
あ、チュートリアルだから。
- 条件演算子
- 特になし。
- 型比較演算子instanceof
- 特になし。
*** ビット操作演算子とシフト演算子
- 整数型をオペラントとする。
** 演算子のまとめ
- 特になし。
** 設問と演習:演算子
*** 設問
- 1. 条件演算子 >, 算術演算子 +.
- 2.
- a. iは11、nは0。
- b. iは11、nは1。
- 3. !.
- 4. ==.
- 5. someConditionが真ならば、resultにvalue1を代
入し、偽ならばresultにvalue2を代入する。
*** 演習
- 1.
---
class ArithmeticDemo {
public static void main (String[] args) {
int result = 1 + 2;
System.out.println(result);

result -= 1;
System.out.println(result);

result *= 2;
System.out.println(result);

result /= 2;
System.out.println(result);

result += 8;
result %= 7;
System.out.println(result);
}
}
---

- 2. i++ は、インクリメント前の値がprintlnに渡さ
れるから。


体調が悪いので刻む。
こつこつ。

2009年8月2日日曜日

【JT】3 Javaプログラミング言語の基礎


* 3 Javaプログラミング言語の基礎
** 変数
- Javaの変数
- インスタンス変数 (非staticフィールド)
- 同名でも各インスタンスで別のもの。
- オブジェクトの状態という概念はインスタンス
変数にて実現することが多い。
- クラス変数 (staticフィールド)
- そのクラスのオブジェクト達で共有される。
- すなわち同名なら同じもの。
- finalキーワードを付加すると不変扱いになる。
- ローカル変数
- メソッドの中で、メソッド処理時に利用する一
時的な変数。
- パラメータ
- メソッド定義のときに定義され、メソッド呼び
出しのときに利用される。
- 変数とフィールド
- フィールドである変数は、インスタンス変数とク
ラス変数だけである。その他の変数はフィールド
では無い。
- メンバー
- ある型について、フィールド、メソッド、入れ子に
なっている型をまとめてメンバーと呼ぶ。
- スコープやエクステントはどうなっているのかなぁ。
** 命名
- 名前についての規則いろいろ。割愛。
** 基本データ型 (primitive data type)
- 強い型付け
- 変数は、それを使用する前に宣言が必要。
- すなわち、変数が型をもっているということかな。
- Javaには8つの基本データ型がある。
- byte
- 8bit 符号付き 2の補数。
- [-128,127]
- デフォルト:0
- short
- 16bit 符号付き 2の補数。
- [-32768,32767]
- デフォルト:0
- int
- 32bit 符号付き 2の補数。
- [-2147483648,2146483647]
- デフォルト:0
- long
- 64bit 符号付き 2の補数。
- [-9223372036854775808,9223372036854775807]
- デフォルト:0L
- float
- 32bit 単精度IEEE754浮動小数点
- デフォルト:0.0f
- double
- 64bit 倍精度IEEE754浮動小数点
- デフォルト:0.0d
- boolean
- サイズは定義されていない。
- {true,false}
- デフォルト:false
- char
- 16bit Unicode文字
- [0,65535] ≡[\u0000,\uffff]
- デフォルト:\u0000
- 文字列
- 文字列は基本データ型では無い。
- java.lang.Stringによってサポートされている。
- デフォルトはnull。

- デフォルト値
- フィールドにはデフォルト値が適用される。
- ローカル変数にはデフォルト値は適用されない。
存在しない。常に明示的に設定すべき。
- リテラル
- 基本データ型はリテラルをもつ。
- リテラルは固定値のソースコード上の表現。
- 各基本データ型のリテラルの紹介
- 割愛。
** 配列
- 配列とは
- コンテナオブジェクトである。
- 単一の型の値を一定の数だけ保持する。
- 生成後は長さは不変。
- 配列に含まれる各値を要素と呼ぶ。
- 要素には[0,長さ)の数字が割り当てられており、
これをインデックスと呼ぶ。
- 配列の要素の指定にインデックスを使う。
- コード例をひとつ。(割愛)
- 配列変数の宣言
- 構文
type[] name;
type name[]; //非推奨
- 多次元配列
- 構文
type[][] name;
type name[][]; //非推奨
// 次元数だけ[]を並べる
- Cの多次元配列とは異なり、単に配列を要素とする
配列。
** 変数のまとめ
- 特になし。
** 設問と演習:変数
*** 設問
- 1. 非staticフィールド
- 2. staticフィールド
- 3. メソッド
- 4. パラメータ
- 5. byte,short,int,long,float,double,boolean,char
- 6. String
- 7. 配列
*** 演習
- 1. こんな感じ?
---
class WrongFieldDemo {
public static void main(String[] args) {
}

int hoge-piyo = 0;
}
---

-*- mode: compilation; default-directory: "~/scratch/java/the-java-tutorial/WrongFieldDemo/" -*-
Compilation started at Sun Aug 2 20:57:53

javac WrongFieldDemo.java
----------
1. ERROR in WrongFieldDemo.java (at line 5)
int hoge-piyo = 0;
^
Syntax error on token "-", , expected
----------
1 problem (1 error)
Compilation exited abnormally with code 255 at Sun Aug 2 20:57:55

- 2. こんな感じ?
---
class WrongFieldDemo {
int hoge;

public static void main(String[] args) {
int hoge;
System.out.print(hoge);
}
}
---

-*- mode: compilation; default-directory: "~/scratch/java/the-java-tutorial/WrongFieldDemo/" -*-
Compilation started at Sun Aug 2 21:00:04

javac WrongFieldDemo.java
----------
1. ERROR in WrongFieldDemo.java (at line 6)
System.out.print(hoge);
^^^^
The local variable hoge may not have been initialized
----------
1 problem (1 error)
Compilation exited abnormally with code 255 at Sun Aug 2 21:00:06


さっそく刻んでいく。
こつこつ。

2009年7月31日金曜日

【JT】2 オブジェクト指向プログラミングの概念


* 2 オブジェクト指向プログラミングの概念
** オブジェクトとは
- 現実世界のオブジェクトのすべてに状態と振る舞いが
あるでしょ、ソフトウエアのオブジェクト指向はそれ
と同じだよ、という導入はいただけない。自然をそう
見たときそれはすでにオブジェクト指向の結果なんだ
から、結果をもって原因と言われても。。。
** クラスとは
- クラスのインスタンス = オブジェクト.
- うーん。ここの説明でクラスを理解するのは無理だ
ろう。私はCLOSをかじっているので大丈夫だが。
** 継承とは
- Javaでは、クラスの継承にて、親は常にひとつ。多
重継承は無いようだ。
- インターフェイスはクラスと外部世界との契約であ
る。この契約はビルド時にコンパイラによって強制
される。
** パッケージとは
- クラスとインターフェイスを整理するための名前空
間。
- クラスライブラリは、パッケージの集合。
- クラスライブラリはAPIとも呼ぶ。
** 設問と演習
*** 設問
- 1. 状態 振舞
- 2. フィールド
- 3. メソッド
- 4. カプセル化
- 5. クラス
- 6. スーパークラス extends サブクラス
- 7. インターフェイス
- 8. パッケージ
- 9. Application programming interface
*** 演習
- 1. こんな感じ?
---

class Radio {
int power = 0; // 0: off 1: on
int stationId = 0;
int volume = 0; // [0,10]
int volumeUnit = 1;

void togglePower() {
if (power == 0) {
power = 1;
} else {
power = 0;
}
}

void changeStationId(int newValue) {
stationId = newValue;
}

void volumeUp() {
if (volume < 11) {
volume += volumeUnit;
}
}
void voludeDown() {
if (volume > 0) {
volume -= volumeUnit;
}
}

void printStates() {
System.out.println("power:" + power +
" station id:" + stationId +
" volume:" + volume);
}
}

---

- 2. あり? エラーが出る。なんでだろ。

---
interface AVEquipment {
void volumeUp();
void volumeDown();
}

---
___

class Radio implements AVEquipment {
int power = 0; // 0: off 1: on
int stationId = 0;
int volume = 0; // [0,10]
int volumeUnit = 1;

void togglePower() {
if (power == 0) {
power = 1;
} else {
power = 0;
}
}

void changeStationId(int newValue) {
stationId = newValue;
}

void volumeUp() {
if (volume < 11) {
volume += volumeUnit;
}
}
void volumeDown() {
if (volume > 0) {
volume -= volumeUnit;
}
}

void printStates() {
System.out.println("power:" + power +
" station id:" + stationId +
" volume:" + volume);
}
}

___

こんなエラーが出る。

---

-*- mode: compilation; default-directory: "~/scratch/java/the-java-tutorial/ClassIntroduction/" -*-
Compilation started at Fri Jul 31 20:45:18

javac Radio.java
----------
1. ERROR in Radio.java (at line 19)
void volumeUp() {
^^^^^^^^^^
Cannot reduce the visibility of the inherited method from AVEquipment
----------
2. ERROR in Radio.java (at line 24)
void volumeDown() {
^^^^^^^^^^^^
Cannot reduce the visibility of the inherited method from AVEquipment
----------
2 problems (2 errors)
Compilation exited abnormally with code 255 at Fri Jul 31 20:45:20

---


こつこつ。

【JT】1 はじめてのJava


* 1 はじめてのJava
** Javaテクノロジ現象
- Javaはテクノロジであるとともにプラットフォーム
である。
** はじめてのJavaプログラミング
- NetBeans IDEの紹介。NetBeans IDEは使わないので
スキップ。
** はじめの一歩 (Microsoft Windows)
- スキップ。
** はじめの一歩 (Solaris OS, Linux)
- バージョンチェック。問題なさげ。
the-java-tutorial $ java -version
java version "1.6.0_10"
Java(TM) SE Runtime Environment (build 1.6.0_10-b33)
Java HotSpot(TM) 64-Bit Server VM (build 11.0-b15, mixed mode)
the-java-tutorial $
- HelloWorldApp、問題なし。

** Hello Worldプログラムを解剖する
- 特になし。

** エラーの説明
- 特になし。

** 設問と演習
*** 設問
- 1. バイトコード.
- 2. c.
- 3. HelloWorldApp.classが存在するかどうか。
*** 演習
- 1.
---

class HolaMundoApp {
public static void main(String[] args) {
System.out.println("Hola Mundo!");
}
}

---

- 2. "が漏れている。


既視感が激しいと思ったらProcessingがJavaだった。この前やったばかり。
こつこつ。

Javaを学ぶ

意図あって、Javaをちょこっと学んでみようと思う。

本は、

Javaチュートリアル

にする。この本がものすごいよさそう、というわけではないのだが(悪そうというわけでもない)、公式チュートリアルがあるなら、まあそれをやるべし、という選定。

あまり根を詰めずにゆるくやりたい。