java中成员内部类内为什么不允许有任何静态声明

 我来答
月绝菲
推荐于2018-04-13 · 超过38用户采纳过TA的回答
知道小有建树答主
回答量:135
采纳率:100%
帮助的人:79.3万
展开全部

  看下内部类Eclipse给的错误我们可以看出一部分,静态的属性或者方法不允许声明在非静态的对象中.

  

  下面我们看下think in java 中谈内部类

  内部类自动获得对其外围类所有成员的访问权,这是如何做到的?
当某个外围类创建了一个内部类对象时,此内部类对象必定秘密捕获一个指向那个外围类对象的引用.然后,在你访问此外围类的成员时.就是用那个引用来选择外围类的成员,幸运的是,编译器会帮你处理所有的细节,但你现在可以看到:内部类的对象只能在于其外围类的对象相关联的情况下才能被创建(非static内部类).

下面说下我自己想法和综合网上的想法

  1. 重点在于内部类比如和外部类有联系,如果我们创建了static的方法或者字段就破坏了这种耦合,和java的设定背道而驰.如果一个非静态内部类有了静态成员,静态成员不依托于任何内部类实例,那结果也就是此内部类不需要外部类实例就初始化了变量,严重侵害了内部类的定向

  2. 内部类的对象 脱离了其外围类的对象 就不会存在, 静态变量 的作用就是 让该类的所有对象共享一个状态。 这个类的所有对象都可以获取和修改这个状态。如果仅仅是这个目的,就可以推出这个状态也是所有外部对象所共享的状态,因此这个定义就可以提升至 外围类中定义,没有必要在内部类中定义,因此在JAVA中不允许在内部类中声明 静态变量

  3. 如果我们不从抽象的语义方面去理解, 可以这么想:


    public class Outter {
       class Inner{
           static Inner a1=new Inner();
       }
    }

    如果上面的代码编译无误, 我们可以直接 Outter.Inner.a来拿到Inner类的实例, 而内部类的实例是一定要绑定到一个外部类的实例的. 然后java里试图用final来为上述限制松绑, 以提供更多的灵活性.


感觉没有语法什么方面的问题,主要还是为了内部类的定义,不想超脱原来的范围


另外说下final 那个成功的原因:

    不是你声明了final就可以成功的,只能是编译器知道其值,然后编译器把他当做编译期常量来使用,其实说白了就是和这个类没啥关系了,只是你写那里了,但是没啥卵用,如果你改成可变的就是运行期确定值这个就是不能被编译通过的



    

      

xxrl5
推荐于2017-12-15 · TA获得超过171个赞
知道答主
回答量:32
采纳率:0%
帮助的人:18.2万
展开全部
成员内部类 之所以叫做成员 就是说他是类实例的一部分 而不是类的一部分 结构上来说 他和你声明的成员变量是一样的地位 一个特殊的成员变量 而静态的变量是类的一部分和实例无关 你若声明一个成员内部类 让他成为主类的实例一部分 然后又想在内部类声明和实例无关的静态的东西 你让JVM情何以堪啊 若想在内部类内声明静态字段 就必须将其内部类本身声明为静态 静态内部类里面的字段 就算没有static修饰符也是静态的
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友85cd0964c
2012-02-23 · TA获得超过385个赞
知道小有建树答主
回答量:204
采纳率:0%
帮助的人:247万
展开全部
我记得应该是在非静态方法中不能有静态声明,如果想要声明静态方法或变量,一定要将此处大括号外面的方法声明成静态
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zymlqf
2012-02-27
知道答主
回答量:22
采纳率:0%
帮助的人:5.9万
展开全部
静态声明一般用在属性或方法的声明中,此类信息会在类载入时直接进入运行环境!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式