在一个类中,如果一个声明为静态的属性或方法,将影响的是全局性的,就是说该属性或方法是对类而言的,而不是对对象而言,
对象是对类的实现,如果是对类而言,当类里面的东西改变,将影响所有的对象,(不管是该对象是在改类改变前生成的还是该类改变后生成,因为类里面静态的属性或方法的指针都指向同一块内存地址,如果上面的讲述理由还有困难,请看下面的代码)
PHP版:
代码
class a{
public static $c=5;
public function u(){
self::$c=6;
}
public function o(){
echo self::$c;
}
}
$a=new a();
echo $a->o();
$b=new a();
$b->u();
echo $b->o();
echo $a->o();
public static $c=5;
public function u(){
self::$c=6;
}
public function o(){
echo self::$c;
}
}
$a=new a();
echo $a->o();
$b=new a();
$b->u();
echo $b->o();
echo $a->o();
输出将是:566
AS3版代码:
代码
#Main.as
package
{
import flash.display.Sprite;
import flash.events.Event;
/**
* ...
* @author lonely
*/
public class Main extends Sprite
{
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
var a:Test = new Test();
a.o();
var b:Test = new Test();
b.u();
b.o();
a.o();
}
}
}
#Test.as
package
{
/**
* ...
* @author lonely
*/
public class Test
{
public static var a:int = 5;
public function Test()
{
}
public function u():void {
a = 7;
}
public function o():void {
trace (a);//AS3中的静态不能用this.a引用,非静态可以
}
}
}
package
{
import flash.display.Sprite;
import flash.events.Event;
/**
* ...
* @author lonely
*/
public class Main extends Sprite
{
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
var a:Test = new Test();
a.o();
var b:Test = new Test();
b.u();
b.o();
a.o();
}
}
}
#Test.as
package
{
/**
* ...
* @author lonely
*/
public class Test
{
public static var a:int = 5;
public function Test()
{
}
public function u():void {
a = 7;
}
public function o():void {
trace (a);//AS3中的静态不能用this.a引用,非静态可以
}
}
}
输出是577
总结:
静态方法是相对于类而言的,不是针对对象而言的,所以会有以上结果,因为整个程序中,类定义是只有一个的,
延伸:在JS中,因为没有类的定义,所以基本上也谈不上有什么静态的方法,但可以添加函数体的方法.
因为静态方法是针对类或函数体(JS)而言的,所以不存在继承感念(但PHP里竟然可以继承静态方法,有点奇怪...)
在AS中,父类的静态方法在子类是不可见的.
在PHP中,静态方法很普通方法基本没有很大的不同,就是多了个::访问,静态方法也可以继承(感觉有点怪怪的,虽然一直这样用..),对于PHP的类和其他语言的类,这点该是明显不同的.