class Ca 
    {
    int a;
    static int b;
    public static void m1()
    {
     a=10;
     b=10;
    }
    public void m2()
    {
     a=5;
     b=5;
    }
    public static void m3()
    {
      【代码】//调用m1方法
      【代码】//调用m2方法
    }
}
  class Cb
  {
   public static void main(String args[])
   {
   Ca s1=new Ca();
   Ca s2=new Ca();
   Ca.b=5;
   s1.b=6;
   s2.b=7;
   System.out.println(Ca.b);
   System.out.println(s1.b);
   System.out.println(s2.b);
  
   }
  }
那两段代码我怎么打都是错。求教谢谢帮忙O(∩_∩)O哈!

解决方案 »

  1.   

    首先静态的m1方法不能对非静态的变量a赋值
    其次public static void m3()
      {
      【代码】//调用m1方法
      【代码】//调用m2方法
      }这个里面永远不能调用非静态的m2方法
    因为m3是静态的方法。
      

  2.   

     public static void m3()
      {
      【代码】//调用m1方法
      【代码】//调用m2方法
      }
    }你把m3定义成静态,静态方法的意思就是不用实例化一个对象,只要用类名.方法名就可以直接调用的方法(因为静态的东西在类加载的时候就会在内存中“存在”——可用)。
    ok,我们来看,你调用m1方法没问题,m1是静态的,你调用它没问题,因为m1可以确保你调用他的时候在内存中存在可用。而你的m2方法不是静态的,也就是说他是实例方法,要调用一个实例方法需要先创建它们的对象才能用他们,你可以理解为要对象创建了,这个实例方法才会在内存中存在(其实是早就存在只是没对象创建它们是不可用的)。由于静态的东西M3是会先现在内存中存在然后供人使用,而非静态的m2,则没有对象创建就无法供人使用,于是这就会出现:“在静态里调用不能用的东西,因为这东西“不存在(其实是不能用)”,所以java做了这样的限制来避免出现这种情况,这个规则就是:在静态的上下文(方法)不能调用非静态的东西。你可以把非静态方法M2换成一个非静态的变量,如int i =2;这个i,这样更好理解:
    无法在M3中使用i 是因为M3这个方法运行时i在内存中还没有分配内存空间(不存在)
      

  3.   

    总之,你可以化简这么理解:静态的东西一定总是先于非静态的东西在内存中存在、可用(java虚拟机就是这样来办事:静态的东西一定是先准备好)而非静态的东西则要等到“会被用到”才会存在(比如你创建一个对象了,表明你要用了,那对象的非静态方法就准备好了-存在),所以你的M3里就是在调用不存在的东西M2.你非要在M3里调用M2,那么你得让M2先存在,所以你要嘛:把M2也改成静态,要嘛在M3中先new一个Ca对象,让M2存在,然后通过这对象去调用M2。建议第一种,因为第二种:“所谓调用M2”已经变了味了,已经改变你程序设计得初衷,达不到程序所要的效果。
      

  4.   

    用eclipse吧···这种错误真的很让人蛋疼··
      

  5.   


    class Ca {
    static int a;
    static int b;
    public static void m1()
    {
    a=10;
    b=10;
    }
    public void m2()
    {
    a=5;
    b=5;
    }
    public static void m3()
    {
    //【代码】//调用m1方法
    //【代码】//调用m2方法
    }
    }
    public class Cb {
    public static void main(String args[]) {
    Ca s1=new Ca();
    Ca s2=new Ca();
    Ca.b=5;
    s1.b=6;
    s2.b=7;
    System.out.println(Ca.b);
    System.out.println(s1.b);
    System.out.println(s2.b); }
    }
    好了,这中程序要细心,可能是你基础不是很扎实哦。
      

  6.   

    在java的静态方法中,不能使用非静态的属性和方法!静态变量属于类,不依赖于对象的加载而是依赖于类的加载。
    也就是说,静态的方法和属性在类被加载的时候就会被相对应的声明和初始化
    !只要在程序中使用到了这个类,这个类的静态属性和方法就会被声明和初始化!和这个类的对象无关! 
      

  7.   

    还有 当你把错误都改掉之后这个输出结果都是7;因ige为STATIC 定义的属性是全局的,所有对象公用一个
     引用一个
    每个对象对她的修改都是影响所有人的=。=