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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邝雄伟 中级黑马   /  2013-1-28 01:32  /  1104 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么内部类里面不能定义静态的?是内存加载的问题么?能解释下内部类与静态内存是怎么加载的么?

3 个回复

倒序浏览
静态的对象,在内存中实默认实例化的,在加载的时候就会存放到内存中。
也就是可以直接调用而不需要手动实例化。
理解这个就不难理解楼主说的问题了。
首先内部的静态类他是不能直接被实例化的。你必须实例化外部类才能实例化它。而外部类不是默认加载的,他只有在手动实例化之后才有内存分配。

这时问题出现了。既然静态对象是默认加载,那么静态内部类应该先于外部类被加载到内存中。

那么这是又和我们之前的一个结论相反(首先内部的静态类他是不能直接被实例化的。你必须实例化外部类才能实例化它。)所以这种写法是错误的。

这会产生歧义。比如

class Outer {
  int outerX;
  Inner inner1 = new Inner();
  Inner inner2 = new Inner();
  class Inner {
    int innerX;
  }
}

Outer outer1 = new Outer();
Outer outer2 = new Outer();

假如innerX是static的,那么这个static的含义是
1:仅是同一outer实例下的不同inner实例共享:
outer1.inner1.innerX=outer1.inner2.innerX,And
outer2.inner1.innerX=outer2.inner2.innerX,But
outer1.inner1.innerX!=outer2.inner1.innerX,Hence
outer1.inner2.innerX!=outer2.inner2.innerX

2: 所有outer实例的inner实例都共享:
outer1.inner1.innerX=outer1.inner2.innerX,And
outer2.inner1.innerX=outer2.inner2.innerX,And
outer1.inner1.innerX=outer2.inner1.innerX,Hence
outer1.inner2.innerX=outer2.inner2.innerX
回复 使用道具 举报
简单来说:类的概念就是提供的一个模板,我们需要的时候才实例化它,开辟内存。
回复 使用道具 举报
  1. class Outer  
  2. {  
  3.         private static int num=3;  
  4.         static class Inner    //内部类  
  5.         {  
  6.                 void show()  
  7.                 {  
  8.                         System.out.println("show run..."+num);  
  9.                 }  
  10.                 static void function()//如果内部类中定义了静态成员,该内部类也必须是静态的;  
  11.                 {  
  12.                         System.out.println("function run..."+num);  
  13.                 }  
  14.         }  
  15.         public void method()  
  16.         {  
  17.                 Inner in=new Inner();  
  18.                 in.show();  
  19.         }  
  20. }  


  21. class  InnerClassDemo  
  22. {  
  23.         public static void main(String[] args)   
  24.         {  
  25.                 Outer out=new Outer();  
  26.                 out.method();  
  27.                 /*
  28.                 //直接访问外部类中的内部类的成员(内部类非静态)
  29.                  
  30.                 Outer.Inner in=new Outer().new Inner();
  31.                 in.show();
  32.                 //也可以写作
  33.                 Outer out-new Outer();
  34.                 Outer.Inner in=out.new Inner();
  35.                 in.show();
  36.                 */  

  37.                 //如果内部类是静态的,那就相当于外部类  
  38.                 Outer.Inner in=new Outer.Inner();  
  39.                 in.show();  

  40.                 //如果内部类是静态的,成员是静态的  
  41.                 Outer.Inner.function();  

  42.         }  
  43. }  
复制代码
内部类可以是静态的,而且内部类里面可以有静态成员呀。
如果内部类有静态成员的话,那么内部类必须是静态。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马