当前位置:网站首页 > 技术博客 > 正文

java成员变量和成员方法



成员变量和局部变量在每种编程语言中都有涉及,如果之前了解过其他语言的成员变量或者局部变量,那么在学习java中的成员变量和局部变量时可以看看有那些联系和不同,这一块的东西也不能说难,如果第一次接触可能会感觉有点乱,所以接下来我先把java中总结的成员变量和局部变量的部分内容先列出来,带着这些内容学起来会轻松很多!

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

栈区

存放各种方法(静态方法、实例方法、构造方法等)
ps:局部变量就在这些方法体中;

堆区

存放new出来的对象(实例);

方法区

存放各个类,且静态变量在此初始化;


 
   

成员变量分为静态变量(类变量)实例变量
静态变量有static修饰,它从该类的准备阶段就存在了,直到系统销毁这个类,静态变量的作用域与这个类的生存范围相同
实例变量没有static修饰,它从该类的实例被创建时就存在,直到系统销毁这个实例,实例变量的作用域与对应实例的生存范围相同

静态变量访问方法:通过类名访问,不需要创建实例;

类.静态变量

实例变量访问方法:通过实例访问,需要先new一个实例

实例.实例变量

其实这里主要注意的还是静态变量,主要内容可以看看我的这篇文章:Java中的static———静态变量

这里主要说一下成员变量初始化时在内存中运行机制;
先看一个代码:

 
   

简单分析一下,当程序第一次执行Person类时,系统先加载这个类,并初始化这个类,在类的准备阶段,系统就为该类的类变量分配内存空间,并指定默认初始值(静态变量name也是在这个阶段完成了初始化);
然后接下来系统就在堆内存中为Person类分配了一块内存区,且为age默认赋值为0;然后生成了Person对象,并通过引用变量p1指向该对象;
当再次执行Person类时,已经不需要再为Person类初始化了,所以直接生成了Person对象,通过p2指向它;

局部变量相对成员变量就没有那么复杂了
先分别介绍一下局部变量中的三种不同形式:
形参: 在定义方法签名时定义的变量,形参的作用域在整个方法内有效
方法局部变量:方法体中定义的变量,作用域从定义该变量的地方生效,到该方法结束时失效
代码块局部变量: 在代码块中定义的变量,作用域从定义该变量的地方生效,到该代码块结束时失效



和成员变量不同的一点是:局部变量除了形参外,都需要显式初始化,就是指定一个初始值,否则无法访问;

局部变量在内存中的运行机制:
因为局部变量需要显式初始化,所以系统不会对它进行初始化,即系统并没有给局部变量分配内存空间,只有它赋值后,系统才会分配内存将该值放入其中;
因为局部变量不属于任何对象或者类,所以它存放在栈内存中,且栈内存的变量不需要系统垃圾回收,因为它们会随着方法或者代码块运行结束而结束;所以局部变量只保存基本类型或者对象的引用(引用变量),所以局部变量占用内存比较小;

java语法允许局部变量和成员变量重名,但是如果在一个方法里,局部变量会覆盖成员变量
如果想要在该方法里访问成员变量,就需要通过this引用(针对实例变量)或者类名(针对静态变量)作为调用者来限定访问成员;
看一个代码就明白了:

 
   

但是,从现在开始就要养成良好的编程习惯,在写代码时不要出现局部变量和成员变量重名的情况;

 
   
 
   
 
   

这三个代码的运行结果都是一样的,而它们分别用了成员变量和局部变量,结果都一样,那我们就需要看看那种方法是最好的了;

首先,ScopeTest01 使用的是成员变量,我们都知道成员变量存在于堆内存中,且只有类销毁时或者实例销毁时它才销毁,这就将作用域扩大到类存在范围或者实例存在范围,作用域的扩大有两个坏处

  1. 增加了变量的生存时间,会导致更大的内存开销
  2. 扩大了变量的作用域,不利于提高程序的内聚性

同理可以对比ScopeTest02 和 ScopeTest03,最后可以总结出 ScopeTest03 最符合规范

所以定义变量的时候要尽可能的保证作用范围最小,这样可以很好的提高程序的性能,包括局部变量;

考虑使用成员变量有四种情况

  1. 如果定义的变量需要描述对象的信息,且每个对象都有可能不同,那么用成员变量中的实例变量
  2. 如果定义的变量所描述的信息这个类的所有对象都相同,那么类相关的信息就定义为成员变量中的静态变量
  3. 如果某个类中需要一个变量保存该类或者实例运行时的状态信息,该变量定义为成员变量;
  4. 如果某个信息需要在类的多个方法之间共享,则该信息使用成员变量

ps:内容有问题欢迎私信或者评论区讨论;

  • 上一篇: pyc文件怎么生成
  • 下一篇: fork函数实现原理
  • 版权声明


    相关文章:

  • pyc文件怎么生成2025-08-12 20:01:02
  • url_for flask2025-08-12 20:01:02
  • mysql各版本的区别2025-08-12 20:01:02
  • ftok(".",'a')2025-08-12 20:01:02
  • linux实时监控命令2025-08-12 20:01:02
  • fork函数实现原理2025-08-12 20:01:02
  • u盘解除写保护教程2025-08-12 20:01:02
  • 反编译.o2025-08-12 20:01:02
  • python xlwt xlrd2025-08-12 20:01:02
  • c语言中结构体初始化2025-08-12 20:01:02