浅谈类的静态

在一个类中,如果一个声明为静态的属性或方法,将影响的是全局性的,就是说该属性或方法是对类而言的,而不是对对象而言,

对象是对类的实现,如果是对类而言,当类里面的东西改变,将影响所有的对象,(不管是该对象是在改类改变前生成的还是该类改变后生成,因为类里面静态的属性或方法的指针都指向同一块内存地址,如果上面的讲述理由还有困难,请看下面的代码)

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();

 

 

输出将是: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引用,非静态可以
        }
        
    }

}

 

 

输出是577

 

 

总结:

静态方法是相对于类而言的,不是针对对象而言的,所以会有以上结果,因为整个程序中,类定义是只有一个的,

延伸:在JS中,因为没有类的定义,所以基本上也谈不上有什么静态的方法,但可以添加函数体的方法.

因为静态方法是针对类或函数体(JS)而言的,所以不存在继承感念(但PHP里竟然可以继承静态方法,有点奇怪...)

在AS中,父类的静态方法在子类是不可见的. 

 

在PHP中,静态方法很普通方法基本没有很大的不同,就是多了个::访问,静态方法也可以继承(感觉有点怪怪的,虽然一直这样用..),对于PHP的类和其他语言的类,这点该是明显不同的.

 

 

posted @ 2010-11-22 10:04  liushan  阅读(323)  评论(0编辑  收藏  举报