#粤嵌我来了##粤嵌星计划#
粤嵌星计划挑战
今天打卡第九天
今天学习内容
1.java 中关于成员变量和局部变量的描述
在java中,根据定义的位置的不同,可以将变量分为两大类:成员变量(存于堆内存中,和类一起创建)和局部变量(存于栈内存中,当方法执行的时候,让出内存,让其他的的方法类使用内存)
1.1成员变量
类变量从该类的准备阶段开始存在,知道系统完全销毁这个类,类变量的作用域,于这个类的生存范围相同;
而实例变量:则是从该类的实例被创建是开始存在的,知道系统白完全销毁这个实例,实例变量的作用域于对应实例的生存范围相同
正是基于这个原因,可以把类变量和实例变量统称为成员变量。其中类变量可以理解为类成员变量,它作为类本身的一个成员,与类本身共存亡;实例变量则可以理解为实例成员变量,它作为实例的一个成员与实例共存亡。
只要类存在,类就可以访问类变量 类。类变量
只要实例存在,实例就是可以访问实例变量 实例。实例变量
当然实例也可以访问类变量。但是需要注意的是因为实例不拥有类变量,所以通过实例来访问类变量进行操作,实际上是****对类变量进行操作 ,当有其他实例来访问类变量时,访问的类变量是被对象访问操作过的类变量。
成员变量无需显示初始化,只要为一个类定义了类变量或实例变量,系统
就会为这个类的准备阶段或者创建该类的实例时进行默认的初始化。
1.2局部变量
局部变量根据定义形式的不同,又可以分为如下三种:
形参:在定义方法签名时定义的变量,形参的作用域在整个方法中都有效
代码块局部变量:这个局部变量的作用域从定义该变量的地方产生,该代码结束的时候失效
方法局部变量:在方法体中定义的局部变量,他的作用阈是从定义该变量的地方生效,到该方法结束时失效
1 public class Person {
2 public int num;
3 public String name;
4
5 public static void main(String[] args) {
6 Person p1 = new Person();
7 Person p2 = new Person();
8 p1.num = 2;
9 p2.num = 3;
10 p1.name = "张三";
11 p2.name = "李四";
12 }
13
14
15 }
当程序执行Person p1 = new Persong()时;如果这行代码是第一次使用Person类,则系统通常会在第一次使用Person类的时候加载这个类,并且会初始化这个类,在类的准备阶段,系统将会为该类的类变量分配内存空间,并指定默认的初始化值,当person类初始化完成后,系统内存结构如图所示
可以看出,当person类初始化完成之后,系统将在堆内存中为PErson分配一块内存空间,实际上是创建一个类对象,在这块内存区里保存num类变量的内存,并设置num的默认初始值为0。
系统接着创建了一个Person对象,并把这个Person对象赋给p1变量,Person对象包含了名为name的实例变量,实例变量是在创建实例时分配内存空间并指定初始值的。当创建了第一个person对象后,系统内存中的存储示意图如下图所示。
从上图可以看出num不属于对象,它属于类,所以创建第一个对象时并不需要为num分配内存空间,系统只是为name分配了内存空间,并指定初始值为null。
第二个对象创建完成后,成员变量如上图所示在内存中存储。
当程序需要访问类变量时,尽量使用类来作为主调,不要使用对象作为主调,这个可以避免产生歧义。
3、局部变量的初始化和内存中的运行机制
局部变量必须经过显示初始化之后才能使用,系统不会为局部变量执行初始化。
定义了局部变量以后,系统并没有给局部变量进行初始化,直到程序给这个局部变量赋给初值时,系统才会为这个局部变量分配内存空间,并将初始值保存到这块内存中。
局部变量不属于任何类或者实例,因此它总是保存在方法的栈内存中。
*栈内存中的变量无需系统垃圾回收,随着方法或者代码块的运行结束而结束。局部变量通常只保存了具体的值或者引用地址,所以所占的内存比较小。
变量的使用规则
能不使用成员变量就别使用成员变量
能不使用方法局部变量就别使用方法局部变量
使用代码块局部变量性能最好。