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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 恨死我了 中级黑马   /  2013-12-16 09:32  /  795 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 恨死我了 于 2013-12-16 13:54 编辑

内部类中定义一个静态方法,内部类的类修饰符也要定义为静态的吗,为什么?

评分

参与人数 1黑马币 +3 收起 理由
乔兵 + 3

查看全部评分

6 个回复

正序浏览
被static修饰的对象在相同JVM中只有唯一实例,表现出来就是其他对象共享此对象(共用相同的对象).
静态方法可以在没有产生类对像的时候使用!
非静态方法必须产生类对像才可以使用!


如果是非静态的内部类了,说明这个类只使用于包含它的那个类,专用的。 为什么还要在它里面定义静态的呢


原因简单解释一下:把外边的类叫做OutClass,内部类叫做InnerClass,首先要了解JAVA的装载过程,先加载类,然后初始化静态的东西,并且JAVA编译器必须保证所有的静态都在使用前分配好内存空间,然后非静态的只有在使用的时候才分配内存空间。 所以非静态的InnerClass必须得要OutClass实例化之后才会存在,所以非静态InnerClass的静态成员在开始的时候并没有得到初始化(因为这些内存是无法通过任何方式访问的),这就和JAVA的编译原则相违背了。
按照上面的讲如果InnerClass为OutClass的静态成员,就可以在它里面定义静态的了

回复 使用道具 举报
定义一个静态的域或者方法,要求在静态环境或者顶层环境
这里静态环境具体说,你的例子里如果加上 static class A就ok

非静态内部类 依赖于一个外部类对象,而静态域/方法是不依赖与对象——仅与类相关
(细说了,就是加载静态域时,根本没有外部类对象)
因此,非静态内部类中不能定义静态域/方法,编译过不了

而常量之所以可以(不论有无static),因为java在编译期就确定所有常量,放到所谓的常量池当中。常量的机制和普通变量不一样

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
恨死我了 发表于 2013-12-16 09:55
明白了,谢谢。只有因为是静态方法所以要用静态类调用,对吧?

哈,我都差点晕了。
因为静态是先于非静态被加载的,静态方法存在时,非静态内部类还没进内存,就是说等创建了非静态的内部类对象之后,
这个对象是可以调用外部类的静态方法的;

敲了个例子,你看看
  1. /*外部类*/
  2. public class Outer {
  3.       public static void main(String[] args) {
  4.             /*创建内部类,并调用外部类的静态方法*/
  5.             Outer.Inner inner = new Outer().new Inner();
  6.             inner.show();
  7.       }

  8.       /*静态外部方法*/
  9.       public static void run(){
  10.             System.out.println("haha");
  11.       }
  12.       /*非静态内部类*/
  13.       class Inner{
  14.             public void show(){
  15.                   run();
  16.             }
  17.       }
  18. }
复制代码



评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
发哥-阿花 发表于 2013-12-16 09:48
静态是随着类的的加载一起进内存的,非静态是随着新创建的对象的;
你的方法是用static修饰的话,内部类可 ...

明白了,谢谢。只有因为是静态方法所以要用静态类调用,对吧?
回复 使用道具 举报
静态是随着类的的加载一起进内存的,非静态是随着新创建的对象的;
你的方法是用static修饰的话,内部类可以不用static修饰,但是你的内部类要调用你的静态方法的话,就必须用static修饰了;

评分

参与人数 1黑马币 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马