存储区域:
全局变量(全局静态变量)是放在方法区中。
成员变量如果没有实例化那么变量是放在栈中;实例化了对象放在堆中,栈中放的是指向堆中对象的引用地址。
局部变量放在栈中,new的对象放在堆中,8中基本数据类型变量放在栈中,变量所对应的值是放在栈帧中。
生命周期:
全局变量:当类加载的时候,就开始被创建,在类中只有一份; 会跟着类的消失而消失,生存时间叫长。
成员变量:在对象被创建时而存在,当对象被GC回收的同时,他也会消失,生存时间适中。
局部变量:当方法被调用时而存在,当方法调用结束而消失,生存时间短。
作用域:
全局变量:作用整个类中,直接被类调用。
成员变量:作用在整个类中(除静态方法不能使用,静态方法没有隐式的this),被对象调用。
局部变量:作用在一个局部区域,比如说在一个方法中,方法调用。
在开发中遇到的问题:
问题:比如说在一个类中定义一个成员变量,在这个类中添加一个for循环,给成员变量赋不同的值,再把值放在队列中。你会发现存在队列的值都是一样的。
解决:在for循环定义一个局部变量并实例化,在把值放进去,这样就会解决值都是一样的问题。
例子:
成员变量:
方法:
public void BfdAiEvent(Object sender, BfdAiEventArgs args){
/**
* 'sectionLengthPerChan * channelCount * sectionsCount' tell driver how many samples
* driver allocate memory for raw data.
*/
rawDataBufferLength = configure.sectionLength * configure.channelCount;
rawDataBufferLength = Math.min(rawDataBufferLength, args.Count);
if (dataScaled == null || dataScaled.length < rawDataBufferLength) {
dataScaled = new double[rawDataBufferLength];
}
ErrorCode errorCode = wfAiCtrl.GetData(rawDataBufferLength, dataScaled, 0, null, null, null, null);
if(Global.BioFaild(errorCode)){
ShowMessage("Sorry, there're some errors occred, ErrorCode: " + errorCode.toString());
return;
}
graph.Chart(dataScaled, configure.channelCount, rawDataBufferLength / configure.channelCount, xInc);
}
这个方法是研华采集卡动态生成数据的方法,就是一个线程一直再跑。
public void Chart(double[] data, int PlotCount, int DataCountPerPlot, double xIncBySec) {
System.out.println("=====threadName1===="+ Thread.currentThread().getName());
if(taskQue.putTask(data) > 5){
TaskExecute task = new TaskExecute(taskQue);
task.start();
}
Chart(data, PlotCount, DataCountPerPlot, xIncBySec, false);
}
public int putTask(double[] data) {
try {
double[] newData = Arrays.copyOf(data, data.length);
if (taskQueue.offer(newData)) {
System.out.println("插入任务单队列成功!");
for (double[] data1 : taskQueue ) {
System.out.println(Arrays.toString(data1));
}
}
} catch (Exception e) {
System.out.printf("任务列中插入任务数据异常,",e);
}
return taskQueue.size();
}
重要的一句代码:double[] newData = Arrays.copyOf(data, data.length);解决问题。