Java之成員變數、全域性變數、區域性變數的區別
阿新 • • 發佈:2019-01-26
儲存區域:
全域性變數(全域性靜態變數)是放在方法區中。
成員變數如果沒有例項化那麼變數是放在棧中;例項化了物件放在堆中,棧中放的是指向堆中物件的引用地址。
區域性變數放在棧中,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);解決問題。