Java之成員變量、全局變量、局部變量的區別

存儲區域:

全局變量(全局靜態變量)是放在方法區中。

成員變量如果沒有實例化那麼變量是放在棧中;實例化了對象放在堆中,棧中放的是指向堆中對象的引用地址。

局部變量放在棧中,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);解決問題。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章