1.变量
1.1什么是成员变量?
1.1.1概念
成员变量指的是在类里定义的变量;成员变量又被分为类变量和实例变量两种;而类变量指的就是有static修饰的变量,实例变量则无static修饰。
1.1.2生存范围比较
类变量:在类的准备阶段产生,在类被销毁时结束。
(类的生命周期:类加载、类验证、类准备、类解析、类初始化)
成员变量:在该类的实例被创建时产生,,在该实例被销毁时结束。
一般而言,类变量的生存范围大于成员变量的生存范围。
1.1.3简述
类变量—>依附于这个类—>与类共存亡;
实例变量—>依附于它的实例—>与实例共存亡;
1.1.4代码图片讲解
代码如下:
public class Demo {
public static void main(String[] args) {
System.out.println("age的初值为:" + Person.age);//类变量age已经初始化完毕,值为0,对应图1.1
Person person = new Person();//创建Person对象,实例变量name已经产生,对应图1.2
System.out.println("name的初值为:" + person.name);//实例变量name无初值,输出为null
}
}
class Person{
public String name;//实例变量
public static int age;//类变量
}
1.2什么是局部变量?
1.2.1概念
局部变量,指的时在方法中定义的变量。
1.2.2分类
局部变量分为形参、方法局部变量、代码块局部变量。(除形参外,其余两种变量需要程序员赋值初始化)
1.2.2.1形参
形参是在定义方法时,用来接收调用该方法的一种参数。
public class Demo {
public static void fun(int a) {//a为形参
System.out.println(a);//形参在这个fun方法内有效
}
public static void main(String[] args) {
fun(10);
}
}
1.2.2.1方法局部变量
方法局部变量的作用域从定义了该变量开始,当该方法结束时消失。
public class Demo {
public static void main(String[] args) {
int a = 10;//方法局部变量需要程序员初始化
System.out.println(a);
}//方法结束,a消失
}
1.2.2.1代码块局部变量
代码块局部变量在该代码块结束时失效。
public class Demo {
public static void main(String[] args) {
for(int i = 0;i < 5;i++) {
System.out.println(i);
}
//System.out.println(i);//离开了for这个代码块,代码块局部变量i消失,这行代码无法被执行
}
}
2.变量使用规则(延伸)
2.1规则
- 根据需要使用该变量的范围合理选择变量,不要扩大其生存时间
- 如果增大了变量的生存时间,会导致内存开销增大,不利于提升程序的运行速度
- 如果扩大了变量的作用域,这将不利于提升程序的内聚性。
低内聚性的坏处:
1、增加理解模块的困难度。
2、增加维护系统的困难度,因为一个逻辑修改会影响许多模块,而一个模块的修改会使得一些相关模块也要修改。
3、增加模块复用困难度,因为大部分的应用程序无法复用一个由许多不一定相关的机能组成的模块。
2.2根据基本代码举例说明
以for循环为例
for( ……;……;……){
}
欠佳方案1:
public class Demo {
static int i;//使用类成员变量
public static void main(String[] args) {
for(i = 0;i < 5;i++) {
System.out.println(i);
}
}
}
欠佳方案2:
public class Demo {
public static void main(String[] args) {
int i;//使用方法局部变量
for(i = 0;i < 5;i++) {
System.out.println(i);
}
}
}
最优方案:
public class Demo {
public static void main(String[] args) {
for(int i = 0;i < 5;i++) {//使用代码块局部变量,生存周期恰好合适
System.out.println(i);
}
}
}