日期:2014-05-20  浏览次数:20797 次

小女子紧急救援?
本人初学JAVA对static的用法很迷糊,以下有三个程序,大家帮我分析一下,谢谢!
public   class   mm
{
  public   static   void   main(String   args[])
  {  
    star();}
    public   static   void   star()
  {
    System.out.print( "i   love   you ");
  }
}
//书上说:在star()method之前要加上static关键字,是因为main()本身也声明成static,而static   method内只能访问到static成员的原因,故要把star()声明成static才行!     可是下面的程序的方法中为什么没有声明成static???

class   mm
{   int   num;
  void   set_num(int   n)   //为什么此处的方法不用声明成static也可以被g1.set_num(5)访问???
{
  num=n;
  System.out.println( "num= "+num);
  }
}
  public   class   gg
{   public   static   void   main(String   args[])
  {
    gg   g1=new   gg();
    g1.set_num(5);//g1.set_num(5);为什么可以访问非static的void   set_num(int   n)??
  }
}
而下面的内部类,却又要声明成static才能访问???

public   class   mm
{  
  public   static   void   main(String   args[])
    {   gg   g1=new   gg();
      g1.set_num(5);
    }
    static   class   gg   //这个所谓的内部类,此处为什么要声明成static???
    {
        int   num;
  void   set_num(int   n){
    num=n;
  System.out.println( "num= "+num);
    }
}
请各位大哥大姐帮忙,烦恼好多天了,谢谢谢谢!

------解决方案--------------------
棣栧厛
------解决方案--------------------
寰堢畝鍗?锛屽湪闈欐€佹柟娉曚腑璁块棶鍒殑闈為潤鎬佹柟娉曠敤鐢熸垚绫诲璞$殑琛屽舰寮忥紝鐢ㄥ璞℃潵璋冪敤閭d釜闈為潤鎬佹柟娉曞氨鍙互浜嗭紝锛屽湪闈欐€佹柟娉曢噷瑕佽闂潪闈欐€佹柟娉曞彧鏈夌敤瀵硅薄鏉ヨ皟鐢紝绗簩涓綘鐢熸垚浜嗕竴涓璞1锛岀涓€涓綘鏄洿鎺ュ啓鐨剆tar();娌℃湁瀵硅薄璋冪敤銆傜涓変釜鍐呴儴绫讳篃涓€鏍蜂綘鐩存帴浣跨敤浜嗗唴閮ㄧ被鐨刵um鑰屾病鏈夐€氳繃瀵硅薄璁块棶锛屾墍浠ュ繀椤诲0鏄庢垚static
------解决方案--------------------
did you find that class gg and method star which shouled be decleared static are ranking the same with method main which is static

my poor english!
------解决方案--------------------
public class mm
{
private int a=1;
private static int b=2;

public static void star()// MUST STATIC
{
System.out.print( "i love you ");
}

public static void main(String args[])//STATIC
{

star();
// System.out.print( "a= "+a);//ERROR: NOT STATIC MENBER
System.out.print( "b= "+b);//STATIC MENBER

}
}
------解决方案--------------------
杩欎釜璁哄潧濂藉儚鍑洪棶棰樹簡锛宨涓嶆槸鎵撲笉杩涙潵瀛楀氨鏄墦杩涙潵鐨勫瓧鍒犱笉鎺夛紝浣犳病涔熸槸杩欐牱鍚楋紵
------解决方案--------------------
第一、 g1.set_num(5);//g1.set_num(5);为什么可以访问非static的void set_num(int n)??
因为 g1是gg的一个实例(对象) 一个对象既可以访问静态成员也可以访问动态成员,所以这个地方非static的void set_num(int n)可以被g1调用。

第二、 static class gg //这个所谓的内部类,此处为什么要声明成static???
之所以要声明成静态内嵌类,是因为你在static main()里使用了 直接创建gg实例(对象)的方式了, 如果你以下面的方式创建gg的对象的话,就不用声明为静态内嵌类:
mm m= new mm();
mm.gg g1 = m.new gg(); 以这种方式创建g1的话,内嵌类就不用声明为static了,

第三、给你讲述一下静态内嵌类和动态内嵌类
内嵌类,实际上也是作为外围类的“成员”来看待的。不使用static修饰的内嵌类是动态内嵌类,其定义内部可以访问外围类的任何成员,并可通过“外围类.this”的格式来代表外部类的当前对象,其对象必须依附外围类的一个对象才能创建,即动态内嵌类的对象必须绑定于一个外围类的对象。
假设A为外围类,B为其内部的动态内嵌类,要从A的外部(包括静态方法,静态初始化语句)创建内嵌类的对象需要经过这样的步骤: