Java程序员的ActionScript3学习笔记(一)

最近开始从事web game方面的开发,前端采用的是Flash,原先对Flash方面的东西一窍不通,现在因为工作的原因,需要与前端沟通,感觉还是了解一下这方面的东西比较好,另外本人也很喜欢玩游戏,尤其是RPG类型,也喜欢画画,感觉业余时间自己想个剧情,设计个角色,自己编程实现是一件相当有意思的事情。(好吧,不只是游戏,自己想出来的需求,自己写代码实现都是有意思的,代码质量也会高的多,而别人提出来的需求并且要求你在___天内完成的总是别扭,不是吗?哈哈)

决定先从ActionScript开始入门,ActionScript的入门书籍比起C\C++\Java之类的要少的多,也没有像《The C Programing Language》以及《Thinking in Java》这种大名鼎鼎的著作。在别人的推荐下去书店买了这本:http://book.douban.com/subject/2249511/ 《ActionScript3殿堂之路》。读过几章之后感觉相当不错,涵盖了ActionScript3的语法细节,并且道出了ActionScript3面向对象设计的精髓,更可贵的是,既适合初学者又适合有其它面向对象语言经验的开发者,还在书中将ActionScript3与Java和C#等语言的差异之处进行了比较。总之读起来感觉很舒服。

因为自己已经有了较长时间的C和Java方面的开发经验,这篇笔记主要是记录一些ActionScript语言比较独特的地方,供自己加深记忆和备忘,另外在写的过程中可以让自己同原先学习过的语言进行比较,更深的去思考一些编程语言设计方面的问题。

ActionScript3开发用的IDE主要是Flash Builder和Flash CS,不过我觉着Java程序员最好还是用个Eclipse插件,我用的是FDT,这样开发的时候只需要开一个IDE,要换不同语言的开发环境时,更换一下Eclipse视图就可以了。

ActionScript3的编译流程

as3的编译流程同java十分的类似,也是源文件编译成字节码,as的字节码文件被称为abc文件(actionscript byte code),但是同Java不一样的地方在于,abc文件是不能单独执行的,需要放入到swf文件当中才能被flash player执行。

swf是flash文件格式,其中包含有可以被flash player包含的标签,媒体资源(图片\音频),以及ABC字节码等等。

ActionScript3的数据类型

我们都知道,Java的数据类型分为两种,基本数据类型(boolean byte char short int long float double)和对象类型(Object),基本数据类型不是对象,在需要对象类型的环境中,基本类型需要借助包装器来将自己包装成为对象类型。Java这样做尽管可以提高代码执行效率,Effective Java在一开始就教导我们能用基本类型的地方就不要用包装类型,并且通过对比来描述了两者之间效率的差异。但是这在面向对象设计上却不是一个好的做法。Java之后的很多语言像是JavaScript、Ruby都抛弃了这种做法,不区分基本类型和对象类型,一切都是对象,这种改变,在开发体验上带来了极大的改善。

As3中也是一切都是对象,并且同Java一样,所有的类都是派生自顶层的Object类。不过虽然都是对象,但As3的类型也是分为两种:基本类型和复杂数据类型。这两种类型虽然都是对象,但是在很多地方却是有着很大的差别,例如所有的基本类型都是不可变的,而复杂类型就不一定,另外两者的引用方式以及传参的方式也是有着很大区别的。

基本类型

ActionScript3对基本类型的种类做了简化,只有5种:Boolean int Number String uint

可以看到对数字的处理方式比较奇特,分为int\Number\uint,在原先As2中,表示数字的类型只有一种,就是Number,无论整形还是浮点型都是用它来表示,可以理解为将所有数字类型的变量弱类型化,这样可能看上去方便一些,但是我们知道整形和浮点型的硬件运算处理方式是完全不同的,另外占用存储空间大小也不同(在as3中,int占4字节,Number占8字节),统一化为一个类型Number就会对执行效率产生影响,虽然现在As3中Number类型还是能够同时表示整形和浮点型,但已经不提倡这么去做了,整形就应该用int和uint,浮点型就应该用Number。另外整形与浮点型在运算时有很多的差异之处,不加分辨会增加出错的几率。

package com.powerflasher.SampleApp {
	import flash.display.Sprite;

	public class FDTTest extends Sprite {
		public function FDTTest() {
			var intVal:int = 1;
			var boolVal:Boolean = false;
			var stringVal:String = "Sam";
			
			trace(intVal is Object);
			trace(boolVal is Object);
			trace(stringVal is Object);
		}
	}
}

As3中的is跟Java中的instanceof运算符类似,注意,它是运算符,而不是函数,能够判断一个变量是不是属于某种类型,上面的结果全都是输出true。

另外相关的运算符还有typeof、as,typeof的作用是获取某个变量类型的字符串描述,as与is类似,但是它不是返回Boolean值,而是当一个变量属于某个类型的时候返回这个变量的值,如果不是则返回null。

package com.powerflasher.SampleApp {
	import flash.display.Sprite;

	public class FDTTest extends Sprite {
		public function FDTTest() {
			var intVal:int = 1;
			var boolVal:Boolean = false;
			var stringVal:String = "Sam";
			
			trace(intVal as int);
			trace(boolVal as int);
			trace(typeof stringVal);
		}
	}
}

结果依此输出1\null\String

null和undefined

上文中提到了null。

Java中表示空的关键字只有一个null,我们碰到的异常也大概就属NullPointerException最多了,因此经常在使用对象之前去if判断一下对象是不是null,这种做法造成代码很丑陋,充斥着大量的if,代码读起来也不自然,因此有人提倡使用NullObject模式(比如Collections.emptyList())以及断言工具(AssertUtil.notNull(Object obj))等等来避免大量的if判断。

在学习JavaScript的时候,除了null又多出了一个undefined,经常造成null和undefined“傻傻分不清楚”,网上也有很多文章讲述它们之间的区别。As3同js一样,也是有null跟undefined两种。

null和undefined,从字面意义上来看,一个表示空,数据是空的;一个表示没有定义。就像我们拨打一个电话号码,打通了没人接,这个叫做null;提示号码不存在,这个属于undefined。

在as3当中两者的差异集中体现在变量初始化的时候:

package com.powerflasher.SampleApp {
	import flash.display.Sprite;

	public class FDTTest extends Sprite {
		public function FDTTest() {
			var intVal:int, uintVal:uint, boolVal:Boolean, numVal:Number, strVal:String;
			var array:Array;
			var obj:Object;
			var val;
			var untypeVal:*;
			
			trace("intVal:" + intVal);
			trace("uintVal:" + uintVal);
			trace("boolVal:" + boolVal);
			trace("numVal:" + numVal);
			trace("strVal:" + strVal);
			trace("array:" + array);
			trace("obj:" + obj);
			trace("val:" + val);
			trace("untypeVal:" + untypeVal);
			
			obj = new Object();
			trace("obj.test:" + obj["test"]);
		}
	}
}

以上代码声明的变量都有个特色,就是没有赋初始值。执行后发现int\uint\Boolean\Number\String\Array\Object都会被as3自动赋值,比如0、NaN和null。undefined只有未定义的情况才会出现,一种是使用未定义类型的变量,一种是使用未定义的属性。

声明常量

As3支持常量类型,常量类型是通过const来定义的,比如:const foo:int = 10;


你可能感兴趣的:(actionscript3)