精华内容
下载资源
问答
  • Java中static为什么不能修饰局部变量?

    千次阅读 2017-12-15 20:49:22
    Java中static为什么不能修饰局部变量? 与c/c++不同

    Java中static为什么不能修饰局部变量?


    问这样问题的人显然是学过c/c++的,因为在c/c++中static是可以修饰局部变量的

    如果你对这个问题百思不得其解,怎么都想不明白,你还是不要想了,因为没有什么为什么。

    不能就是不能,人为规定的规则罢了。

    如果你非要知道个为什么?

    我不介意在这误人子弟一下,,,,,,

     

    首先让我们来看一下c语言中static的作用

    1.    在函数外模块内表示此变量只能被本模块访问

    2.    在函数内表示只能被此函数访问并且为此变量分配的空间不在栈上

    3.    在函数前修饰函数做用同1

     

    在来看下在c++中static的作用,c++是c的强化版,static在c++中基本与在c中相同,我们就来看下不同的

    1.    在类中修饰成员变量说明此变量是属于类的

    2.    在类中修饰成员函数说明调用此函数不需要this指针(即不需要先实例化对象),此函数只能访问属于类的变量

     

    有如下c++代码

    class A{

            static int a;

            void fun(){

                     ++a;

    }

    };

    int A::a=0;


    class B{

            void fun(){

                     static int b=0;

                     ++b;

    }

    };

    A中的a是属于类的而B中的b则是属于方法的,B完全可以这样定义来实现同一目的

    class C{

            int c;

            void fun(){

                     ++c;

    }

    }


    在c语言中如果想让一个变量每次在函数执行时拥有上一次函数执行后的值,我们会有以下方法

    1.    把此变量定义为全局变量

    int a;

    void fun(){++a;}

    void main()

    {

            a=1;

            fun();

    }


    2.把此变量定义为函数内static修饰的局部变量

    void fun()

    {

            static int a=0;

            ++a;

    }

    void main()

    {

            fun();

    }

    3.把每次的值返回下次调用时再传入

    int fun(int a)

    {

            return ++a;

    }

    void main()

    {

            int a=0;

            a=fun(a);

    }

    4.通过指针去引用此变量

    void fun(int *p)

    {

            ++(*p);

    }

    void main()

    {

            int a=0;

            fun(&a);

    }

    方法1,2是我们常用的方法,但是方法1会增加模块与模块间的耦合度

    所以我们一般用方法2,因为方法2可以减少模块间的耦合度增加模块内的内聚性

    类B用的是方法1,而类C用的是方法2

     

    在B中完全可以把fun()放到类的外边去,不必成为它的成员函数,因为fun()和B有半毛钱的关系?没有,,,,,,

    它和c中的一个普通函数没有什么区别


    面向对象的语言中类是封装属性和操作属性的方法的一种抽象机制,通过类的封装来实现模块内的高内聚与模块间的低耦合,而B中的方法fun()有操作过B的属性?没有,这不符合面向对象的思想

     

    c++之所以会支持局部变量可以被static修饰可能是为了兼容c语言,这也是人们会说c++不是纯面向对象的原因

    在完全面向对象的Java中为什么要去兼容一个面向过程的c????

     

    为什么要把一个java的类定义成

    class D{

            publicvoid fun()

    {

            static int d=0;

            ++d;

    }

    }?

    有什么理由?

    <hr/>

    转自:http://blog.csdn.net/doasisay/article/details/48473517


    展开全文
  • 其实这些变量都之所以叫局部变量,其作用域也只限于声明它的方法体内。在方法被调用时,这些局部变量获得内存空间,到方法执行结束时,他们所占据的内存空间就被释放。用完就释放。而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)
    展开全文
  • static不能修饰局部变量理解

    千次阅读 2013-05-15 23:32:35
    在java中,首先,被static修饰,表示是随着jvm加载类的时候就加载了。...理解二:假如可以用static修饰局部变量,就表示此变量在所在类被jvm加载的时候就初始化加载了。但是方法和对象相关的,而方法只有在

    在java中,首先,被static修饰,表示是随着jvm加载类的时候就加载了。

     

    理解一:假如,用static修饰一个变量,jvm就理解为你需要延长该字段的生命周期,既然是延长,就直接申明为全局变量就行了三,所以报错修饰局部变量,类在,static在;

     

    理解二:假如可以用static修饰局部变量,就表示此变量在所在类被jvm加载的时候就初始化加载了。但是方法和对象相关的,而方法只有在被调用的时候才有意义,你在加载类的时候还没有调用方法,就把方法里的局部变量加载了,这就显的没有必要意义了。所以没必要修饰局部变量。

     

        此时可能就会有异议了:为什么static可以修饰一个方法呢?

        可以这样理解:

                         一个方法被static修饰,即表示和所在类被jvm同时加载。类被加载完成的同时,这个方法就已经准备好了,所以以后我们在调用被static修饰的方法的时候,就直接用加载好的类名直接调用已经加载好的方法就可以了。当然你也可以申明一个该类的对象来调用次方法。

        

    展开全文
  • java 中 Cannot make a static reference to the non-static 解决方法 今天敲代码的时候遇到了这个问题,大体这个问题可以简化成这样; public class Test1 {public String get(){return "1...

    https://blog.csdn.net/q610376681/article/details/49359819/

    java 中 Cannot make a static reference to the non-static 解决方法

    今天敲代码的时候遇到了这个问题,大体这个问题可以简化成这样;

    public class Test1 {
    public String get()
    {
    return "123";
    }
    public static void main(String[] args)
    {
    String string =get();
    }
    }

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    显示
    Cannot make a static reference to the non-static method get() from the type Test1

    好吧,我决定改成这样

    public class Test1 {
    public String get()
    {
    return "123";
    }
    public static void main(String[] args)
    {
    static String string =get();
    }
    }

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    可是还是错的。。。。

    翻了一下java书才知道

    1.java中 静态方法不可以直接调用非静态方法和成员,也不能使用this关键字(这就是这个问题的原因,我用静态的main方法调用了非静态的的get方法)。

    原因解释:类中静态的方法或者属性,本质上来讲并不是该类的成员,在java虚拟机装在类的时候,这些静态的东西已经有了对象,它只是在这个类中”寄居”,不需要通过类的构造器(构造函数)类实现实例化;而非静态的属性或者方法,在类的装载是并没有存在,需在执行了该类的构造函数后才可依赖该类的实例对象存在。所以在静态方法中调用非静态方法时,编译器会报错(Cannot make a static reference to the non-static method func() from the type A)。

    java中不能将方法体内的局部变量声明为static
    main()函数是静态的,没有返回值,形参为数组。
    非静态成员的可以随便调用静态成员

    原来静态这么反人类,那要this的干什么呢?
    大概就是为了使多个类共享一个数据。

    大概修改了一下,将函数变为static,将变量声明为全局静态的

    方法一:

    public class Test1 {
    static String string;
    public static String get()
    {
    return "123";
    }
    public static void main(String[] args)
    {
    string =get();
    System.out.print(string);
    }
    }

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    方法二

    public class Test1 {
    public String get() {
    return "123";
    }
    public static void main(String[] args) {
    Test1 c = new Test1();
    String string = c.get();
    System.out.print(string);
    }
    }

    转载于:https://blog.51cto.com/maplebb/2153891

    展开全文
  • 一、static修饰局部变量 局部变量的作用范围定义该局部变量的代码块或函数范围内有效,局部变量的生命周期随着函数的调用而创建,并且随着函数调用结束而销毁。static修饰的局部变量的作用域并不会改变,只是...
  • 我们知道,static一般是用来修饰变量和函数的 ...后来发现这里的static修饰局部变量只是改变了变量的生命周期,让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束. 加static进入函数...
  • static作用(修饰函数、局部变量、全局变量)

    万次阅读 多人点赞 2018-12-09 20:52:50
    C语言:static作用(修饰函数、局部变量、全局变量) 一、 static全局变量与普通的全局变量有什么区别 ? 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。  全局变量本身就是静态存储方式, ...
  • static函数修饰全局变量和局部变量

    千次阅读 2019-04-09 17:59:49
    static int a=1; void fun1(void){ a=2; } void fun2(void){ int a=3; } void fun3(void){ static int a=4; } int main(int argc,char** args){ printf(“%d”,a); fun1( ); prin...
  • //static修饰的全局变量和局部变量 int main() { int i = 0; for (i = 0; i {  int num = 1; num++; printf("%d\t", num);//2,2,2,2,2 } system("pause"); return 0; } int main() { int i...
  • C语言:static作用(修饰函数、局部变量、全局变量) 一、 static全局变量与普通的全局变量有什么区别 ?  全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。  全局变量本身就是静态存储...
  • static 修饰局部变量

    2016-06-14 10:08:46
    static 修饰局部变量称为静态变量,存储在静态区,存储在静态区的变量,在程序运行时,静态变量的声明除了第一次执行时向内存中加载外,并在内存中保存值,其余再执行到静态变量的声明的地方时直接略过,直接使用...
  • 一、全局变量与static全局变量 首先要清楚全局变量本身就是静态存储,加上static肯定也是静态存储。 两者的主要区别在于作用域。 普通的全局变量其作用域整个源程序,各个源文件之间都可以访问...二、局部变量
  • static修饰局部变量

    千次阅读 2013-05-22 15:23:55
    static修饰局部变量 说明: 实验: 所以我觉得,static修饰局部变量不是调用这个函数时候才进行的初始化,在程序一运行就进行了初始化。
  • 在我们刚开始接触接触C语言的时候一定听说过static关键字... 1):static修饰局部变量 2):static修饰全局变量 3):static修饰函数一、static修饰局部变量普通的局部变量是在栈上进行分配的,局部变量所处的函数
  • java基础-static修饰局部变量

    千次阅读 2020-01-19 11:33:56
    7.现在有如下一段代码 public class Test { public int aMethod() { static int i=0; i++; retu...
  • *******************************概念***************************************************************************************************************************首先得明白全局变量、静态全局变量、局部变量...
  • 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。 下面是a.c的内容 chara='A';//...
  • static局部变量和普通局部变量什么区别?static函数与普通函数有什么区别?  全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态...
  • 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。 下面是a.c的内容 char a = 'A'; // ...
  • static关键字至少有下列n个作用...(2)限制变量的作用域,在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问; (3)限制函数的作用域,在模块内的static函数只可被这一模块内的其
  • static作用(修饰函数、局部变量、全局变量) 在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。 (1)先来介绍它的第一条也是最重要的一条:隐藏。 当我们同时编译多个文件时,所有未加...
  • Java中final修饰局部变量的问题

    千次阅读 2019-08-15 18:00:26
    Java中final修饰局部变量的问题 修饰数据类型 变化 基本类型 基本类型的值不能发生改变 引用类型 引用类型的地址值不能发生改变,但是,该对象的堆内存的值是可以改变的 所修饰部分基本数据类型时 ...
  • 只能在局部调用定义在方法中的变量叫局部变量局部变量的有效范围就是方法内,在局部变量中加上public,或者其他修饰符的话(编译都通不过),就破坏了局部变量的范围,可以说局部变量方法而生的。局部变量中...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 129,939
精华内容 51,975
关键字:

static为什么不能修饰局部变量