宜昌网站seo,心理咨询网站后台,wordpress文章图片不显示,网站名称重要吗引言
成员变量和局部变量在每种编程语言中都有涉及#xff0c;如果之前了解过其他语言的成员变量或者局部变量#xff0c;那么在学习java中的成员变量和局部变量时可以看看有那些联系和不同#xff0c;这一块的东西也不能说难#xff0c;如果第一次接触可能会感觉有点乱如果之前了解过其他语言的成员变量或者局部变量那么在学习java中的成员变量和局部变量时可以看看有那些联系和不同这一块的东西也不能说难如果第一次接触可能会感觉有点乱所以接下来我先把java中总结的成员变量和局部变量的部分内容先列出来带着这些内容学起来会轻松很多
java变量分类 JVM中的主要内存空间 三大变量内存分配情况 三区介绍
栈区
存放各种方法静态方法、实例方法、构造方法等 ps局部变量就在这些方法体中
堆区
存放new出来的对象实例
方法区
存放各个类且静态变量在此初始化 基本介绍
成员变量是在 类 中定义的变量
局部变量是在 方法 中定义的变量成员变量
成员变量分为静态变量类变量 和 实例变量 静态变量有static修饰它从该类的准备阶段就存在了直到系统销毁这个类静态变量的作用域与这个类的生存范围相同 实例变量没有static修饰它从该类的实例被创建时就存在直到系统销毁这个实例实例变量的作用域与对应实例的生存范围相同
静态变量访问方法通过类名访问不需要创建实例 类.静态变量 实例变量访问方法通过实例访问需要先new一个实例 实例.实例变量 其实这里主要注意的还是静态变量主要内容可以看看我的这篇文章Java中的static———静态变量
这里主要说一下成员变量初始化时在内存中运行机制 先看一个代码
public class MemoryShow {public static void main(String[] args) {Person p1 new Person();Person p2 new Person();Person.name 李四;System.out.println(姓名 Person.name);System.out.println(p1年龄 p1.age);System.out.println(p2年龄 p2.age);}
}
class Person {//静态变量static String name 张三;//实例变量int age;
}简单分析一下当程序第一次执行Person类时系统先加载这个类并初始化这个类在类的准备阶段系统就为该类的类变量分配内存空间并指定默认初始值静态变量name也是在这个阶段完成了初始化 然后接下来系统就在堆内存中为Person类分配了一块内存区且为age默认赋值为0然后生成了Person对象并通过引用变量p1指向该对象 当再次执行Person类时已经不需要再为Person类初始化了所以直接生成了Person对象通过p2指向它
局部变量
局部变量相对成员变量就没有那么复杂了 先分别介绍一下局部变量中的三种不同形式 形参 在定义方法签名时定义的变量形参的作用域在整个方法内有效 方法局部变量 在方法体中定义的变量作用域从定义该变量的地方生效到该方法结束时失效 代码块局部变量 在代码块中定义的变量作用域从定义该变量的地方生效到该代码块结束时失效
和成员变量不同的一点是局部变量除了形参外都需要显式初始化就是指定一个初始值否则无法访问
局部变量在内存中的运行机制 因为局部变量需要显式初始化所以系统不会对它进行初始化即系统并没有给局部变量分配内存空间只有它赋值后系统才会分配内存将该值放入其中 因为局部变量不属于任何对象或者类所以它存放在栈内存中且栈内存的变量不需要系统垃圾回收因为它们会随着方法或者代码块运行结束而结束所以局部变量只保存基本类型或者对象的引用引用变量所以局部变量占用内存比较小
java语法允许局部变量和成员变量重名但是如果在一个方法里局部变量会覆盖成员变量 如果想要在该方法里访问成员变量就需要通过**this引用针对实例变量或者类名针对静态变量**作为调用者来限定访问成员 看一个代码就明白了
public class RepeatTest {// 静态变量类变量static String name 张三;// 实例变量 int age 18;public static void main(String[] args) {// 局部变量 和静态变量name 张三重名String name 李四;// 因为静态变量name被这里的局部变量覆盖所以输出为“李四”System.out.println(姓名 name);// 这时候如果想要调用静态变量可以使用类来调用//不能用this调用的原因是main方法是静态方法System.out.println(姓名 RepeatTest.name);// 调用test方法new RepeatTest().test();}public void test() {// 局部变量 和实例变量age 18重名int age 666;// 因为实例变量name被这里的局部变量覆盖所以输出为“666”System.out.println(年龄 age);// 这时候如果想要调用实例变量可以使用this调用System.out.println(年龄 this.age);}
}但是从现在开始就要养成良好的编程习惯在写代码时不要出现局部变量和成员变量重名的情况
变量使用
说了这么多可能你已经晕了但是这些变量归根结底我们了解它们就是为了用它们那什么时候用局部变量什么时候用成员变量呢 我们先看三个代码
public class ScopeTest01 {//静态变量类成员变量//再次强调一下这里为什么定义静态变量而不是实例变量//因为main方法是静态方法不需要对象只通过类调用而实例变量必须有对象才能调用static int i;public static void main(String[] args) {for (i 0; i 5; i) {System.out.println(Hello World!!!);}}
}public class ScopeTest02 {public static void main(String[] args) {//局部变量int i;for (i 0; i 5; i) {System.out.println(Hello World!!!);}}
}public class ScopeTest03 {public static void main(String[] args) {// 代码块局部变量for (int i 0; i 5; i) {System.out.println(Hello World!!!);}}
}这三个代码的运行结果都是一样的而它们分别用了成员变量和局部变量结果都一样那我们就需要看看那种方法是最好的了
首先ScopeTest01 使用的是成员变量我们都知道成员变量存在于堆内存中且只有类销毁时或者实例销毁时它才销毁这就将作用域扩大到类存在范围或者实例存在范围作用域的扩大有两个坏处
增加了变量的生存时间会导致更大的内存开销扩大了变量的作用域不利于提高程序的内聚性
同理可以对比ScopeTest02 和 ScopeTest03最后可以总结出 ScopeTest03 最符合规范
所以定义变量的时候要尽可能的保证作用范围最小这样可以很好的提高程序的性能包括局部变量
考虑使用成员变量有四种情况
如果定义的变量需要描述对象的信息且每个对象都有可能不同那么用成员变量中的实例变量如果定义的变量所描述的信息对这个类的所有对象都相同那么类相关的信息就定义为成员变量中的静态变量如果某个类中需要一个变量保存该类或者实例运行时的状态信息该变量定义为成员变量如果某个信息需要在类的多个方法之间共享则该信息使用成员变量
总结
成员变量和局部变量大概主要内容就是这些了看完可能还是有点乱一定要多看几遍自己总结一下这些东西是学习java的基础内容这都搞不清的话那么之后一会一个静态变量一会一个局部变量都把你搞晕了并且想要用java写出来好代码就必须了解这些内容这将会在你未来的开发中起到重要作用