
As3中类变量的共享问题,请高手帮助!
我在学习Flashas3编程中遇到一个问题,就是变量数组在类内部各函数之间的共享问题,比例,我建一个flash文件,挂了一个叫做temp的类,内部结果如下:package...
我在学习Flash as3编程中遇到一个问题,就是变量数组在类内部各函数之间的共享问题,比例,我建一个flash文件,挂了一个叫做temp的类,内部结果如下:
package {
import flash.display.MovieClip;
public class temp extends MovieClip {
public var myArray:Array;//声明数组变量
public var myStr:String;//普通变量
public function temp() {
// constructor code
}
public function myFunc1():void{
var myArray=new Array;
var myStr="普通变量"
myArray=["aaaaa"];
myArray.push("bbbb");
trace("赋值处的myStr="+ myStr);
trace("赋值处的数组="+myArray[0] +myArray[1]);
myFunc2();
}
public function myFunc2():void {
trace("其他函数中的myStr="+myStr);
trace("其他函数中访问数组=" +myArray[0] +myArray[1]);
}
}
}
然后我在第一帧写入
myFunc1();
运行结果如下:
赋值处的数组=aaaaabbbb
其他函数中的myStr=null
TypeError: Error #1009: 无法访问空对象引用的属性或方法。
at temp/myFunc2()
at temp/myFunc1()
at temp/frame1()
也就是,在类内部,不同函数之间是不能共享变量和数组变量……我的问题是,如何解决这个问题?
也许有人马上会说,“把变量或数组直接通过函数传递过去不就好了吗?”当然,这样做是最合理的,但是,有时候,访问这个变量或数组的请求是别的函数发现的,所以,在别处直接访问数组变量的情况还是有用的。
我在类中分别用public,static等声明方法进行尝试,但都不成,as3没能_Global全局变量了……
后面的描述中有几个错误,如“发出”打成“发现”,“没有”打成“没能”……看懂就好,回答正确还要再追加“费力”和“容错”补偿分…… 展开
package {
import flash.display.MovieClip;
public class temp extends MovieClip {
public var myArray:Array;//声明数组变量
public var myStr:String;//普通变量
public function temp() {
// constructor code
}
public function myFunc1():void{
var myArray=new Array;
var myStr="普通变量"
myArray=["aaaaa"];
myArray.push("bbbb");
trace("赋值处的myStr="+ myStr);
trace("赋值处的数组="+myArray[0] +myArray[1]);
myFunc2();
}
public function myFunc2():void {
trace("其他函数中的myStr="+myStr);
trace("其他函数中访问数组=" +myArray[0] +myArray[1]);
}
}
}
然后我在第一帧写入
myFunc1();
运行结果如下:
赋值处的数组=aaaaabbbb
其他函数中的myStr=null
TypeError: Error #1009: 无法访问空对象引用的属性或方法。
at temp/myFunc2()
at temp/myFunc1()
at temp/frame1()
也就是,在类内部,不同函数之间是不能共享变量和数组变量……我的问题是,如何解决这个问题?
也许有人马上会说,“把变量或数组直接通过函数传递过去不就好了吗?”当然,这样做是最合理的,但是,有时候,访问这个变量或数组的请求是别的函数发现的,所以,在别处直接访问数组变量的情况还是有用的。
我在类中分别用public,static等声明方法进行尝试,但都不成,as3没能_Global全局变量了……
后面的描述中有几个错误,如“发出”打成“发现”,“没有”打成“没能”……看懂就好,回答正确还要再追加“费力”和“容错”补偿分…… 展开
4个回答
展开全部
理论上来说你的第四行第五行代码中,两个变量在整个类中都是存在的。但是你注意你的myFunc1()中写了,
var myArray=new Array;
var myStr="普通变量"
这里并不是引用两个public变量,而是重新创建了另外的局部变量。
在as中,局部变量变量是有生命周期的,只有在生命周期内在能使用这个变量。一般我们认为变量的生命周期就是第一次使用或者var开始,到遇到第一个独立的}结束。
比如:
...
{
...
{
.....
}
var a=10;//生命周期从这里开始
{
.......
{
...........
}
}
}//生命周期到这里结束
那么你的两个局部变量的作用周期只在myFunc1中生存,在myFunc2中肯定是拿不到的。
正确的写法是
package {
import flash.display.MovieClip;
public class temp extends MovieClip {
public var myArray:Array;//声明数组变量
public var myStr:String;//普通变量
public function temp() {
// constructor code
}
public function myFunc1():void{
myArray=new Array;
myStr="普通变量"
myArray=["aaaaa"];
myArray.push("bbbb");
trace("赋值处的myStr="+ myStr);
trace("赋值处的数组="+myArray[0] +myArray[1]);
myFunc2();
}
public function myFunc2():void {
trace("其他函数中的myStr="+myStr);
trace("其他函数中访问数组=" +myArray[0] +myArray[1]);
}
}
}
var myArray=new Array;
var myStr="普通变量"
这里并不是引用两个public变量,而是重新创建了另外的局部变量。
在as中,局部变量变量是有生命周期的,只有在生命周期内在能使用这个变量。一般我们认为变量的生命周期就是第一次使用或者var开始,到遇到第一个独立的}结束。
比如:
...
{
...
{
.....
}
var a=10;//生命周期从这里开始
{
.......
{
...........
}
}
}//生命周期到这里结束
那么你的两个局部变量的作用周期只在myFunc1中生存,在myFunc2中肯定是拿不到的。
正确的写法是
package {
import flash.display.MovieClip;
public class temp extends MovieClip {
public var myArray:Array;//声明数组变量
public var myStr:String;//普通变量
public function temp() {
// constructor code
}
public function myFunc1():void{
myArray=new Array;
myStr="普通变量"
myArray=["aaaaa"];
myArray.push("bbbb");
trace("赋值处的myStr="+ myStr);
trace("赋值处的数组="+myArray[0] +myArray[1]);
myFunc2();
}
public function myFunc2():void {
trace("其他函数中的myStr="+myStr);
trace("其他函数中访问数组=" +myArray[0] +myArray[1]);
}
}
}
展开全部
看了你写的类,我不说你有啥问题,但感觉你首先犯了一个比较低级的错误,你想想,对一个复杂数据类型,它是一个引用的关系,那么你这样public,结果是什么?就是一个混乱,所有引用这个对象的实例,都可以修改类的变量,这严重的破坏了类的封装性,也会产生严重的后果的,本身你就是想共享这个变量的数据,结果是没有共享成,反到是修改了所有的实例值。要想让类的外部接触到类内部的值,我们可以采取API的方法,就是set,get特别是数组一类的(特别是嵌套数组)最好是用副本去调用,这样才不会发生错乱现象。希望你认真的学好基础的东西,搞懂最基础的编程知识,然后想想自己的问题。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
...你在func1那里用了var ,那就以为着后面所跟的变量是该方法的内部变量了,已经不是该类的内部变量了,应该把var去掉....
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先,“共享”这个词就非常不专业,你应该是半路出家吧,没有恶意,不过建议你去看一些程序基础的东西
其次,我理解你“共享”的意思是希望在两个方法中都能调用变量,这个是符合语法的,所以不存在不能“共享”的说法
最后,之所以你的程序报错是因为,虽然你定义了成员变量“public var myArray:Array.”但是你在第一个方法:myFunc1():中又var了一次
var myArray=new Array;
var myStr="普通变量"myArray=["aaaaa"];然后赋值,这时,myArray是一个临时变量,它的生存周期就只有myFunc1,当离开这方法后,就被系统收回了(实际FLASH没那么快收回,但是确实是不能引用了)所以,当你在myFunc2里面调用myArray时,myArray只有前面的定义,没有实际的内容,没有分配地址,所以系统会告诉你,无法访问空对象引用的属性或方法。
其次,我理解你“共享”的意思是希望在两个方法中都能调用变量,这个是符合语法的,所以不存在不能“共享”的说法
最后,之所以你的程序报错是因为,虽然你定义了成员变量“public var myArray:Array.”但是你在第一个方法:myFunc1():中又var了一次
var myArray=new Array;
var myStr="普通变量"myArray=["aaaaa"];然后赋值,这时,myArray是一个临时变量,它的生存周期就只有myFunc1,当离开这方法后,就被系统收回了(实际FLASH没那么快收回,但是确实是不能引用了)所以,当你在myFunc2里面调用myArray时,myArray只有前面的定义,没有实际的内容,没有分配地址,所以系统会告诉你,无法访问空对象引用的属性或方法。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询