Comparing the syntax of Java 5 and ActionScript 3

Grey Line
Below is a short comparison table of major elements/concepts of these two languages for a quick reference.
You can read this table either left-to-right or right-to-left, depending on what’s your primary programming language is today.
This list is not complete, and your input is appreciated.
Concept/Language Construct
Java 5.0
ActionScript 3.0
Class library packaging
.jar
.swc
Inheritance
class Employee extends Person{…}
class Employee extends Person{…}
Variable declaration and initialization
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;
Undeclared variables
n/a
It’s an equivalent to the wild card type notation *. If you declare a variable but do not specify its type, the * type will apply.
A default value: undefined
var myVar:*;
Variable scopes
block: declared within curly braces,
local: declared within a method or a block

 

member: declared on the class level

 

no global variables
No block scope: the minimal scope is a function

 

local: declared within a function

 

member: declared on the class level

 

If a variable is declared outside of any function or class definition, it has global scope.
Strings
Immutable, store sequences of two-byte Unicode characters
Immutable, store sequences of two-byte Unicode characters
Terminating statements with semicolons
A must
If you write one statement per line you can omit it.
Strict equality operator
n/a
===
for strict non-equality use
!==
Constant qualifier
The keyword final

 

final int STATE=”NY”;
The keyword const

 

const STATE:int =”NY”;
Type checking
Static (checked at compile time)
Dynamic (checked at run-time) and static (it’s so called ‘strict mode’, which is default in Flex Builder)
Type check operator
instanceof
is – checks data type, i.e. if (myVar is String){…}
The is operator is a replacement of older instanceof
The as operator
n/a
Similar to is operator, but returns not Boolean, but the result of expression:
var orderId:String=”123”;
var orderIdN:Number=orderId as Number;
trace(orderIdN);//prints 123
Primitives
byte, int, long, float, double,short, boolean, char
all primitives in ActionScript are objects.
Boolean, int, uint, Number, String
The following lines are equivalent;
var age:int = 25;
var age:int = new int(25);
Complex types
n/a
Array, Date, Error, Function, RegExp, XML, and XMLList
Array declaration and instantiation
int quarterResults[];
quarterResults =
new int[4];

 

 

int quarterResults[]={25,33,56,84};
var quarterResults:Array
=new Array();
or
var quarterResults:Array=[];

 

var quarterResults:Array=
[25, 33, 56, 84];
AS3 also has associative arrays that uses named elements instead of numeric indexes (similar to Hashtable).
The top class in the inheritance tree
Object
Object
Casting syntax: cast the class Object to Person:
Person p=(Person) myObject;
var p:Person= Person(myObject);
or
var p:Person= myObject as Person;
upcasting
class Xyz extends Abc{}
Abc myObj = new Xyz();
class Xyz extends Abc{}
var myObj:Abc=new Xyz();
Un-typed variable
n/a
var myObject:*
var myObject:
packages
package com.xyz;
class myClass {…}
package com.xyz{
class myClass{…}
}
ActionScript packages can include not only classes, but separate functions as well
Class access levels
public, private, protected
if none is specified, classes have package access level
public, private, protected
if none is specified, classes have internal access level (similar to package access level in Java)
Custom access levels: namespaces
n/a
Similar to XML namespaces.
namespace abc;
abc function myCalc(){}
or
abc::myCalc(){}
use namespace abc ;
Console output
System.out.println();
// in debug mode only
trace();
imports
import com.abc.*;
import com.abc.MyClass;
import com.abc.*;
import com.abc.MyClass;
packages must be imported even if the class names are fully qualified in the code.
Unordered key-value pairs
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
Associative Arrays

 

Allows referencing its elements by names instead of indexes.
var friends:Array=new Array();
friends[”good”]=”Mary”;
friends[”best”]=”Bill”;
friends[”bad”]=”Masha”;

 

var bestFriend:String= friends[“best”]

 

friends.best=”Alex”;

 

Another syntax:
var car:Object = {make:”Toyota”, model:”Camry”};
trace (car[”make”], car.model);
// Output: Toyota Camry
Hoisting
n/a
Compiler moves all variable declarations to the top of the function, so you can use a variable name even before it’s been explicitly declared in the code.
Instantiation objects from classes
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 classes
private class myClass{…}
There is no private classes in AS3.
Private constructors
Supported. Typical use: singleton classes.
Not available. Implementation of private constructors is postponed as they are not the part of the ECMAScript standard yet.
To create a Singleton, use public static getInstance(), which sets a private flag instanceExists after the first instantiation. Check this flag in the public constructor, and if instanceExists==true, throw an error.
Class and file names
A file can have multiple class declarations, but only one of them can be public, and the file must have the same name as this class.
A file can have multiple class declarations, but only one of them can be placed inside the package declaration, and the file must have the same name as this class.
What can be placed in a package
Classes and interfaces
Classes, interfaces, variables, functions, namespaces, and executable statements.
Dynamic classes (define an object that can be altered at runtime by adding or changing properties and methods).
n/a
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
function closures
n/a. Closure is a proposed addition to Java 7.
myButton.addEventListener(“click”, myMethod);
A closure is an object that represents a snapshot of a function with its lexical context (variable’s values, objects in the scope). A function closure can be passed as an argument and executed without being a part of any object
Abstract classes
supported
n/a
Function overriding
supported
Supported. You must use the override qualifier
Function overloading
supported
Not supported.
Interfaces
class A implements B{…}
interfaces can contain method declarations and final variables.
class A implements B{…}
interfaces can contain only function declarations.
Exception handling
Keywords: try, catch, throw, finally, throws

 

Uncaught exceptions are propagated to the calling method.
Keywords: try, catch, throw, finally

 

A method does not have to declare exceptions.
Can throw not only Error objects, but also numbers:

 

throw 25.3;

 

Flash Player terminates the script in case of uncaught exception.
Regular expressions
Supported
Supported
Thanks,
Yakov Fain
19 Comments
  1. November 12, 2006 @ 2:40 pm
    Yakov,
    Thanks for this nice comparison. I monitor russian Flex community wiki at flexwiki.novemberain.com. May I use this table there?
    Thanks!
  2. Yakov said,
    November 12, 2006 @ 2:52 pm
    Michael,
    Sure, you can use it. Just put a reference to this blog there.
    All the best,
    Yakov
  3. November 12, 2006 @ 2:59 pm
    Isn’t there method overloading in Java?
    That’s one of the great missing in as for me…
  4. November 12, 2006 @ 3:27 pm
    Very nice. A couple of weeks ago I thought of doing something similar to help aid me in my study of Java.
    In regards to Arrays in AS3, I believe you can declare a reference to an array but you are not restricted to
    a) defining the size of the array and
    b) specifying the exclusive data type it must store
    before you can start using the object. The array will automatically resize when adding and removing elements. If anything, AS3’s arrays behave more like J2SE5’s ArrayList.
    I don’t know if this is worth mentioning but Arrays in AS3 can also be typed if desired (i.e. pseudo-Generics).
    http://www.dannypatterson.com/Resources/Blog/EntryDetail.cfm?id=98
  5. Yakov said,
    November 12, 2006 @ 4:15 pm
    Alessandro,
    There is no method overloading in AS3. There’s a workaround described over here.
  6. Paulius said,
    November 12, 2006 @ 6:40 pm
    There are block variables in AS3 - for (var x in y) { x is a variable visible only in this block of code }
  7. Yakov said,
    November 12, 2006 @ 7:28 pm
    Paulius,
    You are mistaken. Try this code:
    for (var i:int=0;i<10;i++){
    trace(”i=”+i);
    }
    trace (”i====”+i);
    It prints i====10
  8. November 13, 2006 @ 1:35 am
    Is this upcasting for AS3 correct?
    Abc myObj = new Xyz();
    It looks like a copy of the java.
  9. Yakov said,
    November 13, 2006 @ 6:16 am
    Thanks, Phil.
    This was an extra line (copy/paste error) in the AS3 column. Fixed
  10. J said,
    November 13, 2006 @ 6:26 am
    Thanks, Yakov. Very useful article for beginner
  11. November 13, 2006 @ 7:14 am
    There’s a mistake for actionscript’s strict equality. It has to be ‘===’ rather than ‘==’.
    Cheers, Thomas.
  12. Noel said,
    November 13, 2006 @ 12:06 pm
    Thanks, this is a great comparison.
    You might also consider adding the AS3 “Dictionary” class to the row labeled: “Unordered key-value pairs”
  13. November 13, 2006 @ 9:40 pm
    Typo in “Unordered key-value pairs” — In the AS3 column, it says this friends[good]=”Mary” and so on, but I think what you intended was friends[”good”]=”Mary”.
  14. Yakov Fain said,
    November 13, 2006 @ 11:25 pm
    Thanks, Mike - the quotes were missing.
  15. judah said,
    November 17, 2006 @ 3:26 am
    Thank you for this excellent resource. Now I can start flame wars with my Java friends. JK
    I understood all comparisons but I would love a little more clarity on namespace feature in AS3. Would this mean you can include a namespace (what is this?) and then use only the function you need in the build operation (thus saving space in the swf)?
    use namespace abc ;
    abc::myCalc(){}
  16. Kevin said,
    November 20, 2006 @ 9:22 pm
    [quote]Paulius,
    You are mistaken. Try this code:
    for (var i:int=0;i
  17. EECOLOR said,
    November 30, 2006 @ 2:41 pm
    “Unordered key-value pairs” You compare them with Array’s in Actionscript, i would however recommend you compare them with Objects. If you use Array’s as key-value holders, you can not use any of the Array’s functions and thus have bagage that is unneeded.
    You write: var car:Object = {make:”Toyota”, model:”Camry”}; as an alternative syntax, this is however the ’shortcut’ for Object as [] is for Array’s, / / for regexps etc.
    Very nice article though :) Thnx for making it :)
    Greetz Erik
  18. Igor Grapp said,
    December 4, 2006 @ 2:20 pm
    I would also add another item to the lis - AS3 has ability to use String objects as a “case” labels in switch statment.
    For example:
    var selector:String = “ALPHA”;
    switch ( selector ) {
    case “ALPHA”:
    trace(”alpha”);break;
    case “BETA”:
    trace(”beta”);break;
    }
    Java code could look like this:
    enum CASES { ALPHA, BETA }
    public class Test {
    public static void main(String args[]) {
    CASES selector = CASES.ALPHA;
    switch ( selector ) {
    case ALPHA: System.out.println(”alpha”); break;
    case BETA: System.out.println(”beta”); break;
    }
    }
    }
  19. EECOLOR said,
    December 20, 2006 @ 4:17 pm
    The switch statements in AS3 can handle every type of comparisson. You can even put instances of objects as cases.
    Greetz Erik
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章