Eclipseに触れる(2/3)
そろそろjavaッぽくなってきた。以下、参考サイト。
第7回 Javaのクラスとインスタンスを理解する
第8回 Javaのメソッドを理解する
第9回 Javaの参照型変数を理解する
第10回 Javaのインターフェイスを理解する
第11回 Javaのパッケージを理解する
・パースペクティブ:画面モードみたいなものようだ。理解。
[ウィンドウ]-「パースペクティブを開く」-[Java]
・クラスとフィールド名は、C+のクラスとメンバ変数と理解。
・クラスを作成:プロジェクト名右クリック-[新規]-[クラス]
[どのメソッド・スタブを作成しますか?]で[public static void main(String[] args)]のチェックをオフ
・変数名.フィールド名 = 値;
・インスタンスの変数名はポインタ。理解
public class Point {
int x;
int y;
}
public class Line {
Point p1;
Point p2;
}
public class Circle {
Point p1;
int r;
}
public class Array {
public static void main(String[] args) {
Point point = new Point(); //点pointオブジェクト
Line line = new Line(); //線lineオブジェクト
Circle circle = new Circle(); //円circleオブジェクト
point.x=1; //インスタンス内のフィールドに代入
point.y=2; //変数名.フィールド名 = 値;
line.p1= point; //インスタンス内のフィールドにインスタンスを代入
line.p2= new Point(); //インスタンス内のフィールドに直接インスタンス作成
line.p2.x=5; //インスタンスの変数名はポインタ
line.p2.y=6;
circle.p1=new Point();;
circle.p1.x=7;
circle.p1.y=8;
circle.r=9;
System.out.println(line.p1.x);
System.out.println(line.p2.x);
System.out.println(circle.p1.x);
}
}
・メソッド宣言。C+のメンバ関数と理解。
戻り型 メソッド名(仮パラメータ型 仮パラメータ名, 仮パラメータ型 仮パラメータ名) {
処理
}
・戻り値なしならば「void」型
・”変数名”.”メソッド名”でメソッドを呼び出す。
先ほどのlineクラスに長さを返すメソッドを追加。
public class Line {
Point p1;
Point p2;double Length() {
return (Math.sqrt( (p1.x – p2.x)*(p1.x – p2.x) + (p1.y – p2.y)*(p1.y – p2.y)) );
}
}
public class Array {
public static void main(String[] args) {
Point point = new Point();
Line line = new Line();
point.x=1;
point.y=2;
line.p1= point;
line.p2= new Point();
line.p2.x=5;
line.p2.y=6;
System.out.println(“平方根=” + line.Length()); }
}
・概念、使い方、理解。
・Mathクラス、特に宣言なしで使用可能。驚いた。
・System.out.printlnもメソッド
Systemクラス
[java.io.PrintStream型]のoutフィールド
java.io.PrintStreamクラスはprintlnメソッドを持つ
・public static void main(String[] args) { 処理 }もメソッド
Stringの配列をパラメータとして持つ
戻り値がない
・ポインタの話。理解。
・同じ参照値かを判定したいときは等価演算子(==)
・同じ値の文字列かを判定したい場合はequalsメソッドを使う
・valueOfはString型のメソッドで、char型配列をString値にする
・toCharArrayはString型のメソッドで、String値をchar型配列にする
・「System.out.println();」は「System.out.print();+改行」
メソッドへ渡ってきたパラメータの型が参照型か基本型かによって、どんな違いがあるかを確認するために、文字列を編集したいのですが、実は一度作成したString型の文字列データは編集ができません。この文字列データを編集するために、JavaではStringBufferクラスが用意されています。
・javaでは、いわゆる「Cライクな型をポインタとして宣言」することはない。
・String型は基本型、StringBuffer型は参照型。perlよりも自由度は低い。理解
java:
String s=”0123″;
StringBuffer sb=new StringBuffer(s);
//として、sbをメソッドに渡せば”0123″を参照型渡し。
//ただし、sの実値は変わらない。
//メソッドで処理したsbをsに代入のこと
perl:
$s=”01234″;
&kansu(\$s);
sub kansu{
$rs=shift(); #コレは参照型
}
・あるメソッドをコールする時、インスタンスのクラスによって実行内容を変えるのに便利。100面体と6面体のインスタンスがあり、サイコロを振るメソッドがある場合、どっちのインスタンスでサイコロを振るメソッドを実行したかによって、結果が変わる。理解。
以下、使い方。
・プロジェクトで右クリック-[新規]-[インターフェイス]
汎用ダイス・インターフェイス:
public interface DiceIF {
public int roll();
}
・プロジェクトで右クリック-[新規]-[クラス]
表示される[インプリメントされたインターフェイスの選択]
ダイアログで[インターフェイスを選択してください]の欄に
DiceIFと入力
public class Dice6 implements DiceIF {
java.util.Random r=new java.util.Random();
public int roll() {
return r.nextInt(6)+1;
}
}
public class Dice100 implements DiceIF {
java.util.Random r=new java.util.Random();
public int roll() {
return r.nextInt(100)+1;
}
}
public class Roll {
public static void main(String[] args) {
Roll roll = new Roll ();
roll.rolls(new Dice6());
roll.rolls(new Dice100());
}
public void rolls(DiceIF dice){
for(int cnt=0;cnt<6;cnt++){
System.out.println(dice.roll());
}
}
}
例えば、独自に作成するアプリケーションにおいてシステムを表すクラスに「System」という名前を付けたいとします。しかし、JavaではすでにSystemクラスが用意されているので、このSystemという名前をそのまま使うことはできません。こんなときは独自のパッケージappを用意して、システムを表すクラスSystemをパッケージappへ含めるようにします。こうするとシステムを表すクラス名はapp.Systemとなります。この結果、自分で作成したapp.SystemとJavaで用意されているSystemとは明確に区別することができます。
・パッケージは名前空間のようなもの。
階層構造を持たず、クラス名の衝突を避けるために存在。理解。
以下、使い方。
・プロジェクトで右クリック-[新規]-[パッケージ]例えば「Dice」
・パッケージ「Dice」-[新規]-[クラス]を指定し、
表示される[新規Javaクラス]ダイアログで、
[パッケージ]が「Dice」になっていることを確認
package dice;
//常に1を返すいかさまダイス
public class Dice100 {
public int roll() {
return 1;
}
}
package dice;
public class Dice6 implements DiceIF {
public int roll() {
return 1;
}
}
package dice;
public interface DiceIF {
public int roll();
}
import dice.Dice100;
import dice.Dice6;
import dice.DiceIF;
public class Roll {
public static void main(String[] args) {
Roll roll = new Roll ();
roll.rolls(new Dice6());
roll.rolls(new Dice100());
}
public void rolls(DiceIF dice){
for(int cnt=0;cnt<3;cnt++){
System.out.println(dice.roll());
}
}
}
基本的な使い方は分かった。様な気がする。