Java/JavaFX/クラスについて

Top > Java > JavaFX > クラスについて

クラスについて

クラスの定義

クラスの定義はclassを使用します。

	public class MyProfile {
             //変数定義
	     var name: String;
	    var height: String;
	    var age: String;
	    //関数定義
	    function fllProfile(): String {
	        return "{name} {height} {age}";
	    }
	}

{ }の中で変数と関数の定義を行います。
変数の定義はvarを使用します。
関数も{ }の中で定義します。

クラス使用

上で記述したMyProfile?クラスを使用してみます。
MyProfile?クラスはString型の変数を3つ持ち戻り値の型がStringのname関数を持つクラスです。

	//MyProfileインスタンス生成
	var pro = MyProfile{
	    //値を入れる
	    name : "daidouzi"
	    height : "167"
	    age: "28"
	}
	//出力
	println("MyProfile   --   {pro.fllProfile()}");
	実行結果
	MyProfile   --   daidouzi / 167 / 28

変数に初期値をもたせる場合はインスタンス生成時に変数に値を代入する。
変数はそれぞれデフォルト値を持っています。

変数のデフォルト値

デフォルト値
String"" (null)
Integer0
Number0.0
Duration0ms
Booleanfalse
オブジェクトnull
関数null
配列[ ](null)

空文字、要素のないシーケンスはnullと同等として扱われます。

	class Value {
	    //変数定義
	    var name: String;
	    var width: Integer;
	    var height: Integer;
	    var man: Boolean;
	    var text: Text;
	    // デフォルト値の代入
	    var country: String = "japan";
	}
	//インスタンス生成
	var value = Value {};
	//出力
	println("name: {value.name}");
	println("width: {value.width}");
	println("man: {value.man}");
	println("text: {value.text}");
	println("country: {value.country}");
	実行結果
	name: 
	Width: 0
	man: false
	Text: null
	country: japan

Text型のtextはnullと表示されます。

関数型の変数

関数型の変数を定義するには引き数と戻り値の型を宣言します。
定義した関数をコールするのは、普通の関数をコールする方法と同じです。

	class FunctionSample{
	    //関数宣言、引数,戻り値なし
	    var clear: function(): Void;
	    //関数宣言、引数,戻り値あり
	    var set: function(String): Boolean;
	    // こちらでも OK
	//  var print: function(:String): Boolean;
	}
	//インスタンス生成
	var sample = FunctionSample {
	    //関数定義
	    clear: function(): Void {
	        println("Clear");
	    }
	    //関数定義
	    set: function(text: String): Boolean {
	        println("Set: {text}");
	        return true;
	    }
	}
	//関数使用
	sample.clear();
	sample.set("Beautiful weather!");
	実行結果
	Clear
	Set: Beautiful weather!

clear変数は引数なし、戻り値はvoid型です。
set変数は引数String型、戻り値はBlooean型です。

def

defを使用することで定数を作成できます。defで定義すると一度しか代入できません。

	class DefTest {
	    def tesst: Number = 3.1415;
	}

継承

Javaと同じく継承するにはextendsを使用する。

	//親クラス
	class Car {
	    function car() : Void{
	        println("Car.car");
	    }
	}
	//サブクラス、Carを継承
	class Track extends Car {
	    function track() : Void{
	        println("Track.track");
	    }
	}
	//インスタンス生成
	var track = Track {}
	track.car();
	track.track();
	実行結果
	Car.car
	Track.track

TrackがCarのサブクラスになる。

オーバーライド

スーパークラスの関数をオーバーライドする場合、functionの前にoverrideと書きます。
省力することはできません。
サブクラスがスーパクラスの関数をコールするにはJavaと同じくsuperを使用します。

	class Car {
	    //変数定義
	    var str:String ="car";
	    //関数定義
	    function car() : Void{
	        println("Car.car");
	    }
	}
	//サブクラス、Carを継承
	class Track extends Car {
	    //変数strをオーバーライド
	    override var str = "track";
	    //car関数をオーバーライド
	    override function car() : Void{
	        super.car();
	        println("Track.car");
	    }
	}
	//インスタンス生成
	var track = Track {}
	track.car();
	println("track.str = {track.str}");
	実行結果
	Car.car
	Track.car
	track.str = track

TrackクラスがCarクラスのcar関数をオーバーライドし、関数の内部でCarクラスのcar関数をコールしています。
また、スーパークラスの変数の値を変えたいときも、overrideを使用する。

アブストラクト

JavaFXにはインターフェースはないがアブストラクトは作成できます。アブストラクトクラスはオブジェクトを生成することができないので、サブクラスを作成しオブジェクトを生成します。
アブストラクトクラスはクラスの定義の前と、関数の前にabstractを記述します。
サブクラスでスーパクラスのアブストラクトクラスを定義する場合も、overrideを記述します。
また、Javaとは異なりJavaFXは多重継承ができます。多重継承を行うときは、extendsの後ろにカンマ区切りで記述します。。

	//アブストラクトクラス
	abstract class Car {
	    abstract function car() : Void;      
	}
	//クラス定義
	class Motor{
	    function motor(): Void{
	        println("Motor.motor");
	    }
	}
	//サブクラス、CarとMotorを継承
	class Track extends Car , Motor{
	    override function car() : Void{
	        println("Track.track");
	    }
	}
	//インスタンス生成
	var track = Track {}
	track.car();
	track.motor();
	実行結果
	Track.track
	Motor.motor

JavaFXではJavaクラスのサブクラスを作成することがでる。
ただし、デフォルトコンストラクタ、引数なしのコンストラクタを持つクラス限られます。
java.io.FileReader?クラスはデフォルトコンストラクタがないのでサブクラスを作成するとエラーになる。

	import java.io.FileReader;
	class Sample extends FileReader{}

この場合は、コンパイルエラーになります。
またJavaインターフェースを継承することもできます。Javaインターフェースは通常のクラスとして扱われる。
Javaインターフェース作成

	//Javaインターファース定義
	public interface SampleInterface{
	    public void show(String str);
	}

JavaFXでインターフェースを継承

	//Javaインターフェースを継承
	class SampleIn extends SampleInterface{
	    //オーバーライド
	    override function show(str:String):Void{
	        println("Show = {str}");
	    } 
	 } 
	var smp = SampleIn{}
	smp.show("SampleIn");
	実行結果
	Show = SampleIn

インターフェースのメソッドをオーバーライドするときは、overrideを記述すること。

初期化ブロック

JavaFXにはコンストラクタがありません。インスタンス生成時に何かしらの処理を行う場合
・initブロック
・postinitブロック
を使用します。

initブロックはインスタンス生成の最終段階で処理されるブロックです。initブロックの処理後にインスタンス生成が完了します。。
postinitブロックはインスタンス生成が終了したときに処理されるブロックです。

	//スーパークラス
	class Car {
	    init{
	        println("Car.init");
	    }
	    postinit{
	        println("Car.postinit");
	    }
	}
	//サブクラス、Carを継承
	class Track extends Car {
	    init{
	        println("Track.init")
	    }
	    postinit{
	        println("Track.postinit")
	    }
	}
	//インスタンス生成
	var track = Track {}
	実行結果
	Car.init
	Track.init
	Car.postinit
	Track.postinit

スーパークラスのinitブロック処理
サブクラスのinitブロック処理
スーパークラスのpostinitブロック処理
サブクラスのpostinitブロック処理
の順番で処理されます。

アクセス修飾子

アクセス修飾子説明
デフォルトクラス/アトリビュート/変数を定義したスクリプト内部だけからアクセス可能
packageクラス/アトリビュート/変数を定義したパッケージ内からのみアクセス可能。
protectedクラス/アトリビュート/変数を定義したパッケージ内およびサブクラスからアクセス可能
publicどこからでもアクセス可能

Javaで言う、privateに相当するのがデフォルアクセス修飾子になります。
var,defはデフォルトのままだとそのスクリプトファイルの中のみでしか使えなくなるので注視が必要です。
JavaFXに導入されたpackageはJavaデフォルトアクセス修飾であるパッケージプライベート当たります。
protectedとpublicはJava同等の意味をもつます。
アクセス修飾子はクラス定義、変数定義に用いることができます。

変数にしか使用できないアクセス修飾子があります。

アクセス修飾子 説明
public-read読み込みはどこからでも行えるが,書き込みができるのは宣言したファイルのみとする場合。
public-init初期化だけ可能で,読み込みはどこからでも行うことが可能。初期化後に書き込みをすることはできない。書き込みができるのは宣言したファイルのみとする場合。

public-readはJavaでイメージするとゲッターメソッドにあたります。
public-initはインスタンス生成時に値を初期化することのできるアクセス修飾子です。
初期化後は値を変更できない。そしてdefは使用できません。

	class Car {
	    public var num: Integer;
	    //publis-read修飾子
	    public-read var numX = bind num * num;
	    //public-init修飾子
	    public-init var numZ;
	}
	//インスタンス生成
	var car = Car{
	    num: 10
	    //public-init修飾子、初期化
	    numZ: 20
	}
	println("Car.num {car.numX}");
	car.num = 50;
	println("Car.num {car.numX}");
	println("Car.numZ {car.numZ}");
	実行結果
	Car.num 100
	Car.num 2500
	Car.numZ 20

numXはnumにバインドしているため値を直接変更できません。
public-readにし、読み込みだけはできるようにしています。
public-initとpublic-readは他の修飾子と合わせて使用可能です。

	class Car {
		public var num:Integer;
		//パッケージ内のみ読み込み可能
		public-read package var numX = bind num * num;
	}

パッケージ内のみ読み込みができる。

JavaFXホームページ。
http://javafx.com/ja/


アクセス総数2772件

最終更新日: 2009-09-03 (木) 22:23:56 (2765d)

このページをブックマーク:

このページのURL(コピペして利用下さい):

TOP