Java中static的用法,static、public为什么不能修饰局部变量?

人为规定的,记住就好。

其实这些变量都之所以叫局部变量,其作用域也只限于声明它的方法体内。在方法被调用时,这些局部变量获得内存空间,到方法执行结束时,他们所占据的内存空间就被释放。

用完就释放。

而static,public是用来声明全局变量或是被其他对象引用的变量。

String name;              //成员变量,实例变量
static String name="小明";//静态变量,类变量

区别:
1.生命周期不同
成员变量随着对象的创建而存在,随着对象的回收而销毁。
静态变量在类加载的时候创建,随着类的消失而消失。
2.调用方式不同
成员变量只能被对象调用。
静态变量能被对象调用,也能被类名调用。
3.别名不一样
成员变量叫实例变量。
静态变量叫类变量。
4.数据存储不一样
成员变量储存在堆内存的对象中,也叫对象的特有数据。
静态变量储存在方法区的静态区,所有也叫对象的共享数据。

关于static的用法:

  1. static变量
    static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。
    对于类成员变量,系统会在加载类时会为每一个类成员变量分配一个储存单元,所有该类成员变量都共享这一储存单元。
    静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法/变量的。当然静态可以访问静态,非静态可以访问非静态。

    可以直接通过类名来访问,访问语法为:
    类名.静态方法名(参数列表…)
    类名.静态变量名

  2. 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)
  • 21
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

醋酸菌HaC

请我喝杯奶茶吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值