A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 52Pig 中级黑马   /  2014-3-1 22:36  /  2060 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

求教,下面代码加入static就报错,求原因。(基础比较弱)。。
  1. public class Greeting {
  2.         public int aMethod() {
  3.                 //int i = 0;
  4.                 static int i = 0;//報錯Illegal modifier for parameter i; only final is permitted
  5.                 i++;
  6.                 return i;
  7.         }
  8.         public static void main (String args[]) {
  9.         Greeting test = new Greeting();
  10.         test.aMethod();
  11.         int j = test.aMethod();
  12.         System.out.println(j);
  13.         }
  14. }
复制代码



评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

12 个回复

倒序浏览
本帖最后由 无道 于 2014-3-1 23:06 编辑

static 这个关键字是用来 修饰成员(成员变量和成员函数,也就是在类中定义的变量和函数),不能修饰局部变量的。在方法 中定义的变量都是局部变量,所以编译不通过,如果你想把I定义成静态的必须将其提升为成员变量 才可以用static修饰。

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
非静态的  方法 里面不能有静态的 成员变量 ,如果非要加上的话,那么你方法上也加上static
public static int aMethod()   
静态的 方法里面可以放非静态和静态的   因为静态的优先存在于内存中

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
static是说明这个东西是属于整个类的
而局部变量的作用域只能在他所属的{}之内。不可能是属于类或对象的。
所以矛盾,故static不能修饰局部变量

public class Test {
public static int a=1;//成员变量,允许
public static void main(String[] args) {
  static int b=1;//错误
}
}

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
年少丶 来自手机 中级黑马 2014-3-3 08:54:07
报纸
主方法要写类里面
回复 使用道具 举报
年少丶 来自手机 中级黑马 2014-3-3 08:55:43
地板
sorry,刚才看错了。static不能修饰局部变量
回复 使用道具 举报
static修饰成员变量或方法,不能修饰局部变量
回复 使用道具 举报
static意思是静态的。方法前加上static叫做静态方法,类前加上static叫做静态类。静态方法必须存在于静态类中,但静态类中的方法可以不都是静态方法。使用静态方法时,直接用类名+“.”+方法名。不用再实例化,创建类的对象,达到方法调用方便,节省空间
回复 使用道具 举报
static是java语言中的一个关键字,要理解static,就必须要先理解另一个与之相对的关键字,很多人可能都还不知道有这个关键字,那就是auto,其实我们通常声明的不用static修饰的变量,都是auto的,因为它是默认的,就象short和long总是默认为int一样;我们通常声明一个变量:
    int a;
    string s;
    其实就是:
    auto int a;
    auto string s;
    而static变量的声明是:
    static int a;
    static string s;
    这样似乎可以更有利于理解auto和static是一对成对的关键字吧,就像private,protected,public一样;
    对于static的不理解,其实就是对于auto的不理解,因为它是更一般的;有的东西你天天在用,但未必就代表你真正了解它;auto的含义是由程序自动控制变量的生存周期,通常指的就是变量在进入其作用域的时候被分配,离开其作用域的时候被释放;而static就是不auto,变量在程序初始化时被分配,直到程序退出前才被释放;也就是static是按照程序的生命周期来分配释放变量的,而不是变量自己的生命周期;



static的全部用法:
1.类的静态成员:
class A
{
private:
    static int s_value;
};
    在cpp中必须对它进行初始化:
int A::s_value = 0;// 注意,这里没有static的修饰!
    类的静态成员是该类所有实例的共用成员,也就是在该类的范畴内是个全局变量,也可以理解为是一个名为A::s_value的全局变量,只不过它是带有类安全属性的;道理很简单,因为它是在程序初始化的时候分配的,所以只分配一次,所以就是共用的;
    类的静态成员必须初始化,道理也是一样的,因为它是在程序初始化的时候分配的,所以必须有初始化,类中只是声明,在cpp中才是初始化,你可以在初始化的代码上放个断点,在程序执行main的第一条语句之前就会先走到那;如果你的静态成员是个类,那么就会调用到它的构造函数;

2.类的静态函数:
class A
{
private:
    static void func(int value);
};
    实现的时候也不需要static的修饰,因为static是声明性关键字;
类的静态函数是在该类的范畴内的全局函数,不能访问类的私有成员,只能访问类的静态成员,不需要类的实例即可调用;实际上,它就是增加了类的访问权限的全局函数:void A::func(int);
    静态成员函数可以继承和覆盖,但无法是虚函数;


全局变量加修饰符static,局部变量不能使用static,以防造成变量使用上的混淆!
回复 使用道具 举报
static用法:用于修饰成员变量,局部变量不能使用
static特点:
1,随着类的加载而加载。
   也就说:静态会随着类的消失而消失。说明它的生命周期最长。
2,优先于的对象存在
明确一点:静态是先存在。对象是后存在的。
3,被所有对象所共享
4,可以直接被类名所调用。
[b]静态使用注意事项:
1,静态方法只能访问静态成员。
        非静态方法既可以访问静态也可以访问非静态。
2,静态方法中不可以定义this,super关键字。
        因为静态优先于对象存在。所以静态方法中不可以出现this。
3,主函数是静态的。
回复 使用道具 举报
public class Greeting {       
         
         static int i = 0 ;
          
        public int aMethod()
                        {
                //int i = 0;
                //報錯Illegal modifier for parameter i; only final is permitted
               
                                i++;
                return i;
            }
        public static void main (String args[]) {
           System.out.println(Greeting.i);
      Greeting test = new Greeting();
       test.aMethod();
        System.out.println(test.aMethod());
       int j = test.aMethod();
      System.out.println(j);
        }
}
结果:0
         2
         3
回复 使用道具 举报
static定义的变量或者方法的生存周期
跟main()的源代码生存周期是一样的
aMethod()中定义的变量只能存放在栈内存区域
而static定义的变量只能存放在全局内存区
产生了矛盾
回复 使用道具 举报
static关键字修饰的变量是静态变量。“ static int i = 0;”在非静态方法aMethod()中,非静态的方法不能调用静态的变量,故编译时会出错。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马