人为规定的,记住就好。
其实这些变量都之所以叫局部变量,其作用域也只限于声明它的方法体内。在方法被调用时,这些局部变量获得内存空间,到方法执行结束时,他们所占据的内存空间就被释放。
用完就释放。
而static,public是用来声明全局变量或是被其他对象引用的变量。
String name; //成员变量,实例变量
static String name="小明";//静态变量,类变量
区别:
1.生命周期不同
成员变量随着对象的创建而存在,随着对象的回收而销毁。
静态变量在类加载的时候创建,随着类的消失而消失。
2.调用方式不同
成员变量只能被对象调用。
静态变量能被对象调用,也能被类名调用。
3.别名不一样
成员变量叫实例变量。
静态变量叫类变量。
4.数据存储不一样
成员变量储存在堆内存的对象中,也叫对象的特有数据。
静态变量储存在方法区的静态区,所有也叫对象的共享数据。
关于static的用法:
-
static变量
static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。
对于类成员变量,系统会在加载类时会为每一个类成员变量分配一个储存单元,所有该类成员变量都共享这一储存单元。
静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法/变量的。当然静态可以访问静态,非静态可以访问非静态。可以直接通过类名来访问,访问语法为:
类名.静态方法名(参数列表…)
类名.静态变量名 -
static代码块
static代码块在jvm加载类的时候会自动执行,但是static代码块不能在方法内,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。
例如:
public class TestStatic {
private static int a=0;
private int b=0;
public static void main(String[] args) { //main方法
TestStatic TsMain = new TestStatic();
//TsMain.StaticMethod(); //不用用对象调用, 因为StaticMethod为静态方法,jvm加载时会调用
TsMain.NotStaticMethod();
}
static {
TestStatic.a = 1; //类名直接访问静态变量
System.out.println(a);
TestStatic TS = new TestStatic();//创建对象,可访问所有
TS.haha();
TS.b = 1000;
System.out.println(TS.b);
}
static {
TestStatic.a = 2;
System.out.println(a);
}
static {
TestStatic.a = 3;
System.out.println(a);
}
public void haha() {
System.out.println("hello");
}
public static void StaticMethod(){
System.out.println("-----------静态方法---------");
System.out.println(a); //静态访问静态变量,可以
//System.out.println(TestStatic.b); //静态访问非静态变量,不可以
//TestStatic.NotStaticMethod(); //静态访问非静态方法,不可以
}
public void NotStaticMethod(){
System.out.println("-----------非静态方法---------");
System.out.println(a); //非静态访问静态变量,可以
System.out.println(b); //非静态访问非静态变量,可以
TestStatic.StaticMethod();//非静态访问静态方法,可以
}
}
运行结果:
1
hello
1000
2
3
-----------非静态方法---------
3
0
-----------静态方法---------
3
再看一道面试题:
public class TestStatic {
static int i=1;
static int j=1;
public static void main(String args[]){
int f1=f1(1);
System.out.println("f1的最终值="+f1);
int f2=f2(1);
System.out.println("f2的最终值="+f2);
}
static int f1(int n){
if(n>=5)
return n;
n=n+i;
i++;
System.out.println("i="+i);
return f1(n);
}
static int f2(int n)
{
n += j;
j++;
System.out.println("j="+j);
if (n >= 5)
return n;
return n+ f2(n);
}
结果:
i=2
i=3
i=4
f1的最终值=7
j=2
j=3
j=4
f2的最终值=13
参考博客: [leizhimin 的BLOG ](http://lavasoft.blog.51cto.com/62575/18771/) [海 子的博客](http://www.cnblogs.com/dolphin0520/p/3799052.html) [yezixingchen的博客](http://yezixingchen.iteye.com/blog/1597186)