2006-12-12 Java 5 と ActionScript 3 の構文比較
■Java 5 と ActionScript 3 の構文比較

Farata Systems » Comparing the syntax of Java 5 and ActionScript 3
を訳してみた。AS3に入門するJavaプログラマには役に立つかもしれない。怪しいところは原文や言語仕様に当たってください。
| 概念/言語構造 | Java 5.0 | ActionScript 3.0 |
| クラスライブラリのパッケージ化 | .jar | .swc |
| 継承 |
class Employee extends Person{…}
|
class Employee extends Person{…}
|
| 変数の宣言と初期化 |
String firstName="John"; Date shipDate=new Date(); int i; int a, b=10; double salary;
|
var firstName:String="John"; var shipDate:Date=new Date(); var i:int; var a:int, b:int=10; var salary:Number;
|
| 宣言されてない変数 | なし | ワイルドカード型表記 *と等価。
型を指定せずに変数を宣言したときは、 初期値は
var myVar:*;
|
| 変数のスコープ | ブロック: カーリーブラケットの内側で宣言されたもの ローカル: メソッドやブロックの内側で宣言されたもの メンバー: クラスのレベルで宣言されたもの グローバル変数は無い。 |
ブロックスコープは無い: 最小のスコープは関数。 ローカル: 関数の内側で宣言されたもの メンバー: クラスのレベルで宣言されたもの |
| 文字列 | 不変、2バイトユニコード文字の列を格納する | 不変、2バイトユニコード文字の列を格納する |
| セミコロンによるステートメントの終端 | 必須 | 1行に1ステートメントで書くなら、セミコロンを省略できる |
| 厳密な(strict)等価比較演算子 | なし | ===厳密に等しくない比較には
を使う。 |
| 定数修飾子 | finalキーワード
final int STATE="NY";
|
constキーワード
const STATE:int ="NY";
|
| 型検査 | 静的(コンパイル時検査) | 動的(実行時検査)と静的(‘strict モード’と呼ばれる。Flex Builderではデフォルト) |
| 型検査演算子 | instanceof |
isがデータ型を検査する。例 if (myVar is String){…}
|
as 演算子 |
なし | is演算子と似てるけど、論理値を戻さないで、式の結果を戻す。
var orderId:String="123"; var orderIdN:Number=orderId as Number; trace(orderIdN); // 123を印字
|
| プリミティブデータ型 | byte, int, long, float,
|
ActionScriptの全てのプリミティブデータ型はオブジェクト。
次の2行は等価 var age:int = 25; var age:int = new int(25);
|
| 複合データ型 | なし | Array, Date, Error, Function,
|
| 配列の宣言とインスタンス化 |
int quarterResults[]; quarterResults = new int[4]; int quarterResults[]={25,33,56,84};
|
var quarterResults:Array=new Array(); または var quarterResults:Array=[]; var quarterResults:Array=[25, 33, 56, 84]; |
| 継承ツリーのトップクラス | Object | Object |
| キャスト構文: ObjectクラスをPersonにキャストする |
Person p=(Person) myObject;
|
var p:Person= Person(myObject);
または
var p:Person= myObject as Person;
|
| アップキャスト |
class Xyz extends Abc{} Abc myObj = new Xyz();
|
class Xyz extends Abc{} var myObj:Abc=new Xyz();
|
| 型なし変数 | なし |
var myObject:* var myObject:
|
| パッケージ |
package com.xyz; class myClass {…}
|
package com.xyz{ class myClass{…} } ActionScriptのパッケージはクラスだけじゃなくて分離した関数も含めることができる。 |
| クラスのアクセスレベル | public, private, protected
何も指定しない場合、クラスはパッケージアクセスレベルになる。 |
public, private, protected
|
| カスタムアクセスレベル: 名前空間 | なし | XML名前空間と似ている。
namespace abc; abc function myCalc(){} または
abc::myCalc(){}
use namespace abc ;
|
| コンソール出力 |
System.out.println(); |
// デバッグモードのみ
trace();
|
| インポート |
import com.abc.*; import com.abc.MyClass;
|
import com.abc.*; import com.abc.MyClass; コード中でクラス名が完全修飾名であったとしても、パッケージのインポートは必要。
|
| キー-値の順序無しペア | Hashtable, Map
Hashtable friends = new Hashtable(); friends.put("good","Mary"); friends.put("best","Bill"); friends.put("bad","Masha"); String bestFriend= friends.get("best"); // bestFriend is Bill
|
連想配列 インデックスの代わりに名前で要素を参照することができる。 var friends:Array=new Array();<br> friends["good"]="Mary"; friends["best"]="Bill"; friends["bad"]="Masha"; var bestFriend:String= friends["best"] friends.best="Alex"; 他の構文 var car:Object = {make:"Toyota", model:"Camry"}; trace (car["make"], car.model); // Output: Toyota Camry
|
| ホイスティング | なし | コンパイラは全ての変数宣言を関数の先頭へ移動する。
よって変数名はコード中でそれが明示的に宣言される前でもつかうことができる。
|
| クラスからオブジェクトをインスタンス化する |
Customer cmr = new Customer(); Class cls = Class.forName("Customer"); Object myObj= cls.newInstance();
|
var cmr:Customer = new Customer(); var cls:Class = flash.util.getClassByName("Customer"); var myObj:Object = new cls();
|
| プライベートクラス |
private class myClass{…}
|
プライベートクラスはAS3には無い。 |
| プライベートコンストラクタ | サポートされてる。典型的な使い方はシングルトンクラス。 | 利用できない。
プライベートコンストラクタの実装は、まだ ECMAScript 標準でないとのことで先送りされた。 シングルトンを作成するには、public static getInstance() を使って、 最初のインスタンス化のあとで privateな もし
|
| クラスとファイル名 | 一つのファイルに複数のクラスの宣言を持つことができるが、
そのうち public になれるのは一つだけで、 ファイル名はこのクラスと同じ名前でなければならない。
|
ひとつのファイルに複数のクラスの宣言を持つことができるが、
パッケージ宣言の内側に置けるのは一つだけで ファイル名はこのクラスと同じ名前でなければならない。
|
| パッケージに何が置けるか | クラスとインターフェース | クラス、インターフェース、変数、関数、名前空間、実行可能なステートメント。 |
| 動的なクラス(実行時にプロパティとメソッドを加えるか変えることによってオブジェクトの定義を変更することができる)
|
なし |
dynamic class Person { var name:String; } //Dynamically add a variable // and a function Person p= new Person(); p.name="Joe"; p.age=25; p.printMe = function () { trace (p.name, p.age); } p.printMe(); // Joe 25
|
| 関数クロージャ | なし。クロージャは Java 7 での追加が提案されている。 |
myButton.addEventListener("click", myMethod);
クロージャはいわゆる一つのオブジェクトである。それは語彙文脈(スコープにある変数の値、オブジェクト)で関数スナップショットを表すものである。 関数クロージャは 引数として通用でき、いかなるオブジェクトの一部となることなしに実行されることができる。
|
| 抽象クラス | サポートされている | なし |
| 関数オーバーライド | サポートされている。 | サポートされている。override修飾子を使わなければならない。 |
| 関数オーバーロード | サポートされている | サポートされてない |
| インターフェース |
class A implements B{…} |
class A implements B{…} |
| 例外ハンドリング |
キーワード: キャッチされない例外は、呼び出しているメソッドに伝播される。 |
キーワード: メソッドは例外を宣言する必要はない。
throw 25.3;
|
| 正規表現 | サポートされている | サポートされている |
追記
訂正
- 「オーバーラード」→「オーバーライド」
- 「プリミティブ」→「プリミティブデータ型」
- 「複雑な型」→「複合データ型」






定数の例は確かにおかしいですけど原文ママなので、こういうのは残すべきか直すべきか、悩む。