java中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.channelC
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());
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);
int putTask(double[] data) {
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);解决问题。
没有更多推荐了,定义:在方法内定义的变量称为“局部变量”或“临时变量”,方法结束后局部变量占用的内存将被释放。
定义:全局变量,又称“外部变量”,它不是属于哪个方法,作用域从定义的地址开始到源文件结束。
注意事项:
当局部变量与全局变量重名时,起作用的是局部变量。
定义:在类体的变量部分中定义的变量,也称为字段。
java中没有全局变量的定义,这是C中的例:class Demo{// 非静态成员变量,又称为属性,对该类不同的对象来说,属性是不同的// 静态成员变量,一个类中只有一个该变量,该类不同的对象共享同一个静态成员变量
public static void main(String[] args){
int m = 0;// 局部变量,是方法内部定义的变量,只在方法内部可见,在该方法结束后,由垃圾回收器自动回收
SQL中全局变量和局部变量的区别及用法
Java成员变量,局部变量,全局变量的区别
java中成员变量、局部变量、全局变量的区别
Java-全局变量和局部变量、变量和常量
c#成员变量和局部变量
如何在类里面引用另一个类的方法里的局部变量
java之成员变量和局部变量的区别
没有更多推荐了,08:44 提问
java中的变量的作用域问题
新人初学java,在变量的作用域这里卡了下
我知道全局变量和局部变量,但是如果我在main的开头就申明了一个变量,那这个变量应该是全局变量吧,下面所有的方法都可以调用这些变量,但是如果我在main函数中间申明了一个变量,那这个变量算什么?还算是全局变量吗?是不是只有后面的方法才能使用它,而在他之前的就不能用?
还有一个问题:
while(!list.isempty()){
tmp = (File)list.removeFirst
这段语句在while语句外面先是定义了一个对象天麻片,但是却在while语句中才分配空间,那是不是可以理解为这个tmp是一个list列表里第一个元素的引用,要对这第一元素操作的话,是不是直接操作tmp就可以了?
在下先谢谢各位了
按赞数排序
main的开头是什么意思,是main方法的上一行,还是main方法内,如果是上一行,那么如果是static的,那么可以算作“全局变量”,否则是成员变量。写在main里面,无论最上面还是哪里,都是成员变量。
java和C++不同,成员变量不需要先申明后使用,所以你可以在作用域可见的范围内,不管前面后面都可以访问。
不过作为局部变量,必须先定义后使用
这是不行的。
----------------------同志你好,我是CSDN问答机器人小N,奉组织之命为你提供参考答案,编程尚未成功,同志仍需努力!
定义在类中,属于全局变量,定义在方法中属于局部变量。全局变量 在整个类中都可以调用,而局部变量只能在方法里调用,如果想要调用,需要传出去。
成员变量和局部变量的区别?
A:在类中的位置不同
成员变量:在类中方法外
局部变量:在方法定义中或者方法声明上
B:在内存中的位置不同
成员变量:在堆内存
局部变量:在栈内存
等等在我博文中有详细解释
我在写java零基础入门的博客文章,每一篇都有代码案例进行理解,有的还配上内存图解释。有关于成员变量和全局变量的问题详细讲解,而且后后边也会有专题的形式讲解这个问题的。您可以关注看一下,一起讨论。当然其他看到的同行也可以进行参考讨论,我的博客地址:http://blog.csdn.net/qq_
只是list底层元素的一个引用,操作tmp不会改变底层元素的。你那代码只是取出了list
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐Java语言的作用域有哪些及如何分类
Java语言的作用域有哪些及如何分类
  Java已经成为一个庞大而复杂的技术平台,对于开发人员而言,要想更好的掌握Java技术,深入理解底层的技术处理细节必不可少。以下是关于Java语言的作用域及分类的内容,欢迎阅读!
  Java语言的作用域有哪些及如何分类
  在程序源码中,声明在不同地方的变量具有不同的作用域,例如:局部变量、全局变量等。在Java语言中,作用域是由花括号&{...}&的位置决定的,它决定了其定义的变量名的可见性与生命周期。
  在Java语言中,变量类型主要有三种:成员变量、静态变量和局部变量。
  类的成员变量的作用范围与类的实例化对象的作用范围相同,当类被实例化时,成员变量就会在内存中分配空间并初始化,直到这个被实例化对象的生命周期结束时,成员变量的生命周期才结束。
  被 static修饰的成员变量称为静态变量或全局变量,与成员变量不同的是,静态变量不依赖于 特定的实例,而是被所有实例所共享,也就是说,只要一个类被加载,JVM就会给类的静态变量分配存储空间。因此,可以通过类名和变量名来访问静态变量。
  局部变量的作用域与可见性为它所在的花括号内。
  此外,成员变量也有四种作用域,它们的区别见下表。
  (1)public。表明该成员变量或方法对所有类或对象都是可见的,所有类或对象都可以直 接访问。
  (2)private。表明该成员变量或方法是私有的,只有当前类对其具有访问权限,除此之外 的其他类或者对象都没有访问权限。
  (3)protected。表明该成员变量或方法对自己及其子类是可见的,即自己和子类具有权限 访问。除此之外的其他类或对象都没有访问权限。
  (4)default。表明该成员变量或方法只有自己和与其位于同一包内的类可见。若父类与子 类位于同一个包内,则子类对父类的default成员变量或方法都有访问权限;若父类与子类位 于不同的package (包)内,则没有访问权限。
  需要注意的是,这些修饰符只能修饰成员变量,不能用来修饰局部变量。private与protected 不能用来修饰类 (只有 public 、abstract 或 final 能用来修饰类)。
  【相关阅读】Java四大核心技术详解
  1Java虚拟机
  Java虚拟机的主要任务是装在class文件并且执行其中的字节码。Java虚拟机包含一个类装载器,它可以从程序和API中装载class文件。Java API中只有程序执行时需要的那些类才会被装载。字节码由执行引擎来执行。
  不同的Java虚拟机中,执行引擎可能实现得非常不同。在由软件实现的虚拟机中,最简单的执行引擎就是一次性解释字节码。另一种执行引擎更快,但是也更消耗内存,叫做&即时编译器(just-in- time compiler)&。在这种情况下,第一次被执行的字节码会被编译成本地机器代码。编译出的本地机器代码会被缓存,当方法以后被调用的时候可以重用。第三种执行引擎是自适应优化器。在这种方法里,虚拟机开始的时候解释字节码�� �但是会监视运行中程序的活动,并且记录下使用最频繁的代码段。程序运行的时候,虚拟机只把那些活动最频繁的代码编译成本地代码,其他的代码由于使用得不是很频繁,继续保留为字节码-由虚拟机继续解释它们。一个自适应的优化器可以使得Java虚拟机在80%~90%的时间里执行被优化过的本地代码,而只需要编译10%~20%的对性能有影响的代码。
  当Java虚拟机是由主机上的软件实现的时候,Java程序通过调用本地方法(native method)和主机交互。Java中有两种方法: Java方法和本地方法。Java方法是由Java语言编写,编译成字节码文件,存储在class文件中的。本地方法是由其他语言(比如c,c++或汇编语言)编写的,编译成何处理器相关的机器代码。本地方法保存在动态链接库中,格式是各个平台专有的。运行中Java程序调用本地方法时,虚拟机装载包含这个本地方法的动态库,并调用这个方法。本地方法是联系Java程序和底层主机操作系统的连接方法。
  通过本地方法,Java程序可以直接访问底层操作系统的资源。一个本地方法接口(Java Native Interface, JNI)-使得本地方法可以在特定主机系统的任何一个Java平台实现上运行。
  如果希望使用特定主机上的资源,它们又无法从Java API访问,那么可以写一个平台相关的Java程序来调用本地方法。如果希望保证程序的平台无关性,那么只能通过Java API来访问底层系统资源。
  2类装载器的体系结构
  一个Java应用程序可以使用两种类装载器:&启动(bootstrap)&类装载器和用户定义的类装载器。启动类装载器(这是系统中唯一的)是Java虚拟机实现的一部分。启动类装载器通常使用某种默认方式从 本地磁盘中装载类,包括Java API类(启动类装载器也被称为原始类装载器、系统类装载器或者默认类装载器)。
  Java应用程序能够在运行时安装用户定义的类装载器,这种类装载器能够使用自定义的方式来装载类。例如,从网络下载class文件。尽管启动类装载器是虚拟机实现的本质部分,而用户定义的类装载器不是,但用户定义的类装载器能够用Java来编写,能够被编译成class文件,能够被虚拟机装载,还能够像其它对象一样实例化。
  由于有用户定义类装载器,所以不必再编译的时候就知道运行中的Java应用程序中最终会加入的所有的类。用户定义的类装载器使得在运行扩展Java应用程序成为可能。当它运行时,应用程序能 够解决它需要哪些额外的类,能够决定是使用一个或是更多的用户定义的类装载器来装载。由于类装载器是用Java编写的,所以用任何在Java代码中可以表述的风格来进行类装载。这些类可以通过网络下载,可以从某些数据库中获� ��,甚至可以动态生成。 每一个类被装载的时候,Java虚拟机都监视这个类,看到它到底是被启动类装载器还是被用户定义类装载器装载。当被装载的类引用了另外一个类时,虚拟机就会使用装载第一个类的类装载器装载引用的类。例如,如果虚拟机使用一个特定的类装载器装载Volcano这个类,它就会使用这个类装载器装载Volcano类使用的所有类。
  由于Java虚拟机采取这种方式进行类的装载,所以被装载的类默认情况下只能看到被同一个类装载器装载的别的类。通过这种方法,Java的体系结构允许在一个Java应用程序中建立多个命名空间。运行时的Java程序中的每一个类装载器都有自己的命名空间。
  Java应用程序可以创建多少个(或多少种)被不同的类装载器装载的类存放在不同的命名空间中,它们不能相互访问,除非应用程序显示地允许这么做。当编写一个Java应用程序的时候,从不同源文件装载的类可以分隔在不同的命名空间中。通过这种方法,就能够使用Java类装载器的体系结构来控制任何不同源文件中装载的代码之间的相互影响,特别是能够阻止恶意代码获取访问或破坏善意代码的权限。
  Web浏览器是一个动态扩展的例子,Web浏览器使用用户定义的类装载器从网络下载用于Java applet的class文件。Web浏览器使用一个用来安装用户定义类装载器的Java应用程序。这个用户定义的类装载器通常被称为Java Applet类装载器,它知道如何向HTTP服务器请求class文件。Java Applet可以作为动态扩展的例子,因为Java应用程序并不知道它什么时候会开始从网络下载浏览器请求的class文件。只有当浏览器遇到有Java applet的页面时,才决定是否需要下载class文件。
  Web浏览器启动的Java应用程序通常为每个提供class文件的网络地址分别创建不同的用户定义类装载器,因此,不同的用户定义类装载器装载不同来源的class文件。这就可以把它们分别放置在Java�� �机应用程序的不同命名空间之下。由于不同来源的Java applet文件放置在不同的命名空间中,恶意的Java applet代码就不会直接访问从别的地方下载的class文件。这就能够限制或阻止不同来源的代码之间的相互访问。
  3Java class文件
  Java class文件主要在平台无关性和网络移动性方面使Java更适合网络。它在平台无关性方面的任务是:为Java程序提供独立于底层主机平台的二进制形式的服务。这种途径途径打破了C或者C++等语言所遵循的传统,使用这些传统语言写的� ��序通常首先被编译,然后被连接成单独的、专门支持特定硬件平台和操作系统的二进制文件。通常情况下,一个平台上的二进制可执行文件不能在其他平台上工作。而Java class文件时可以运行在任何支持Java虚拟机的硬件平台和操作系统上的二进制文件。
  当编译和连接一个C++程序时,所获得的可执行二进制文件只能在指定的硬件平台和操作系统上运行,因为这个二进制文件包含了对目标处理器的机器语言。而Java编译器把Java源文件的指令翻译成字节码,这种字节码就是Java虚拟机的&机器语言&。
  class文件设计得紧凑,因此它们可以快速地在网络上传送。其次,由于Java程序是动态连接和动态扩展的,class文件可以在需要的时候才下载。这个特点使得Java应用程序能够安排从网络上下载class文件的时间,从而可以最大限度地减少终端用户的等待时间。
  4Java API
  Java API通过支持平台无关性和安全性,使得Java适应于网络应用。Java API是运行库的集合,它提供了一套访问主机系统资源的标准方法。运行Java程序时,虚拟机装载程序的class文件所使用的Java API class文件。所有被装载的class文件(包括从应用程序中和从Java API中提取的)和所有已经装载的动态库(包含本地方法)共同组成了再Java虚拟机上运行的整个程序。
  在一个平台能偶支持Java程序以前,必须在这个特定平台上明确地实现API的功能。为访问主机上的本地资源,Java API调用了本地方法。由于Java API class文件调用了本地方法,Java程序就不需要再调用它们了。通过这种方法,Java API class文件为底层主机提供了具有平台无关性、标准接口的Java程序。对Java程序而言,无论平台内部如何,Java API都会有同样的表现和可预测的行为。正是由于在每个特定的主机平台上明确地实现了Java虚拟机和Java API,因此,Java程序自身就能够成为具有平台无关性的程序。
  Java API在Java安全性模型方面也有贡献。当Java API的方法进行任何有潜在危险的操作(比如进行本地磁盘写操作)之前,都会通过查询访问控制器来检验是否得到了授权。访问控制器是一个类,该类用来执行栈检验,已决定是否允许某种操作。
更多相关文章推荐:转载自http://www.cnblogs.com/AlanLee/p/6627949.html
大多数程序设计语言都提供了“作用域”(Scope)的概念。
对于在作用域里定义的名字,作用域同时决定了它的“可见性”以及“存在时间”。在C,C++和Java里,作用域是由花括号的位置决定的。
变量的作用域
int x = 12;
/* only x available */
int q = 96;
/* both x & q available */
/* only x available */
/* q “out of scope” */
Java用一对大括号作为语句块的范围,称为作用域,作为在作用域里定义的一个变量,它只有在哪个作用域结束之前才可使用。
在Java中不能像下面这样书写代码:
int x = 12;
int x = 96; /* illegal */
Java编译器会认为变量已被定义,所以作用域中的变量不能重复定义,但是在C和C++中能将一个变量“隐藏”在一个更大的作用域里,在C和C++中被允许,在Java中是不允许的,因为Java的设计者认为这样做使程序产生了混淆。
再来看两个例子,为了让大家看到效果这里使用截图的方式:
我们再来看这段代码,大家思考一个问题,第11行和第12行为什么没有语法错误?代码如下:
如果我们交换一下位置呢,代码如下:
离开作用域,变量所分配的内存空间将被JVM回收,所以语法不会有错误,而第二种写法name并没有离开{}作用域,所以会语法错误。
上述的变量都是局部变量,那么如果是在有成员变量的情况下又是怎样一种结果呢?我们来用代码说话,代码如下:
大家仔细的观察并结合代码思考,可以得出变量的作用域结论如下:
在同一作用域范围的包裹下成员变量名和局部变量名是可以变量名相同的,在同一个作用域范围的包裹下局部变量和局部变量不可以变量名相同(作用域内不能重复命名),在方法中使用变量的时候如果不指明使用成员变量还是局部变量,那么默认的就是使用局部的那个变量,但是如果局部变量超出了它本身的作用域范围则会失效,被JVM垃圾回收,那么则可以重复命名此变量,并使用最新定义的这个局部变量。
对象的作用域
Java对象不具备与主类型一样的存在时间。用new关键字创建一个Java对象的时候,它会超出作用域的范围之外。所以假若使用下面这段代码:
String s = new String("a string");
3 } /* 作用域的终点 */
那么句柄s,也就是引用会在作用域的终点处消失。然而,s指向的String对象依然占据着内存空间。在上面这段代码里,我们没有办法继续使用这个对象,因为指向它的唯一一个句柄已经超出了作用域的边界。
这样造成的结果是:对于用new创建的对象,只要我们愿意,它们就会一直保留下去。这个编程问题在C和C++里特别突出。在C++里遇到的麻烦最大:由于不能从语言获得任何帮助,所以在需要对象的时候,根本无法确定它们是否可用。而且最麻烦的是,在C++里,一旦完成工作,必须保证将对象手动清除。
这样便带来了一个有趣的问题。假如 Java 让对象依然故我,怎样才能防止它们大量充斥内存,并最终造成程序的“凝固”呢。在 C++里,这个问题最令程序员头痛。但 Java 以后,情况却发生了改观。 Java 有一个特别的“垃圾收集器”,它会查找用 new 创建的所有对象,并辨别其中哪些不再被引用。随后,它会自动释放由那些闲置对象占据的内存,以便能由新对象使用。这意味着我们根本不必操心内存的回收问题。只需简单地创建对象,一旦不再需要它们,它们就会自动离去。这样做可防止在 C++里很常见的一个编程问题:由于程序员忘记释放内存造成的“内存溢出”。
结束语:万丈高楼平地起、冰冻三尺非一日之寒,做任何事情很难一蹴而就,大部分事情都应该有始有终。
阅读(...) 评论()}

我要回帖

更多关于 局部变量的作用域 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信