java非静态内部类为何不能有静态的成员?

本文解释了Java中内部类的概念及其与外部类的关系,并探讨了关键字static的意义及类加载的过程。通过具体例子说明为什么内部类不能包含静态成员变量。

 1,首先解释几个概念:

      1)内部类---顾名思义,内部类就是在一个类(外部类)的内部再定义一个类(内部类),这个内部类作为外部类的一个成员存在,也就是说内部类可随意访问外部类的成员数据和成员方法。

package  cb;  
public class Out//外部类  
{  
      private int a=1;//外部类的一个数据成员  
      class Inner//内部类  
      {  
         public void test()  
        {  
            int b=2*a;//此处调用外部类的成员  
            System.out.println(b);  
  
        }  
        
     }  
}//这就是内部类的一个基本的认识
      2)关键字static---:static意为静态的意思,当static修饰类的成员(数据成员和成员方法)时,该成员属于整个类,即所有该类的对象都有该属性,调用的时候不必创建对象直接用类名调用即可。

      3)类的加载---:对于一段代码,它们在java虚拟机中的加载(分配内存)顺序是不一样的,java虚拟机的要求是:所有的静态变量必须在所有的非静态变量之前加载;对于内部非静态类,先加载外部类后加载内部类。


2,有了以上知识的铺垫,这个问题就很容易理解了:首先内部类作为外部类的一个非静态成员,它的加载必须有外部类的对象实例(此时非静态成员已经加载),而当你加载该对象实例的时候,内部类里的静态成员并未被加载,这就违背了“所有的静态变量必须在所有的非静态变量之前加载”这一原则,所以这本身就是一个矛盾。而如果内部类是静态的话,就不会存在该矛盾了,因为访问Class Inner 是不需要Class Outer的实例的。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值