论坛首页 Java企业应用论坛

浅谈非静态内部类不能有静态成员

浏览 16570 次
精华帖 (0) :: 良好帖 (2) :: 新手帖 (4) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-05-07  
final定义了常量,可以直接初始化
0 请登录后投票
   发表时间:2010-05-07  
等lz研究清楚了,再来给我们讲解
0 请登录后投票
   发表时间:2010-05-07   最后修改:2010-05-07
	public class OuterClass {
		public class InnerClass {
			//基本数据类型和String,可以
			static final int i = 0;
			static final byte b = 0;
			static final String str = "";
			static final long l = 0;
			static final double d = 0;
			static final char c = 0;
			static final short s = 0;
			static final boolean bool = true;
			static final float f = 0;
            
			//其他类型对象,不可以
			static final Object object = null; //这里编译错误
		}
	}
0 请登录后投票
   发表时间:2010-05-18  
再次纠正问题:
引用
对于红色标记的部分,当时理解上有误,我们知道 InnerClass可以有静态常量(static final),那么InnerClass类加载一定在OuterClass对象创建之前完成

通过进一步研究类加载的原理,我们知道Class对象仅在需要时才会被加载,static初始化是在类加载进行的,所以当我们没有使用内部类时不会加载,也就是说外部类的加载与创建于内部类的加载没有必然的联系,我们现在解释为什么非静态内部类不能有静态成员(排除静态常量)是一种java的约定,可能是sun程序员用以有别于静态内部类的考虑。
下面是解释Class对象仅在需要时才会被加载的例子:
class Candy {
  static { print("Loading Candy"); }
}

class Gum {
  static { print("Loading Gum"); }
}

class Cookie {
  static { print("Loading Cookie"); }
}

public class SweetShop {
  public static void main(String[] args) {	
    print("inside main");
    new Candy();
    print("After creating Candy");
    try {
      Class.forName("Gum");
    } catch(ClassNotFoundException e) {
      print("Couldn't find Gum");
    }
    print("After Class.forName(\"Gum\")");
    new Cookie();
    print("After creating Cookie");
  }
} /* Output:
inside main
Loading Candy
After creating Candy
Loading Gum
After Class.forName("Gum")
Loading Cookie
After creating Cookie
*///:~
0 请登录后投票
   发表时间:2010-05-18  
    
 class OuterClass{   
	 {
		 System.out.println(InnerClass.i);//在OuterClass类内部可能会访问InnerClass的静态成员,不保证InnerClass已初始化
		 System.out.println(InnerClass.ii);
	 }
	     class InnerClass{   
	         private static int i;  //error
	         static final int ii=1;//OK,编译器常量,不需要对InnerClass初始化就可以读取
	     }   
}

0 请登录后投票
   发表时间:2010-05-18  
回去翻翻 thinking in java 你就明白了
0 请登录后投票
   发表时间:2010-05-19  
快乐柠檬 写道
    
 class OuterClass{   
	 {
		 System.out.println(InnerClass.i);//在OuterClass类内部可能会访问InnerClass的静态成员,不保证InnerClass已初始化
		 System.out.println(InnerClass.ii);
	 }
	     class InnerClass{   
	         private static int i;  //error
	         static final int ii=1;//OK,编译器常量,不需要对InnerClass初始化就可以读取
	     }   
}


这是因为static final是编译期常量,类加载之前就已经分配内存。
0 请登录后投票
   发表时间:2010-06-14  
对"非静态内部类不能有静态成员"发表一下自己的见解,还请大家多指教。

其实,根本原因在于sun怎么设计内部类怎么依附于外部类这个关系。
(大家可以对内部类抽象成为外部类的一个局部域,不要束缚在单独类的基本概念上,在这里是一个特殊类了。)

实际把非静态内部类比做外部类的非静态方法容易理解一点,原因和在非静态方法中定义静态成员一个道理。
 
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics