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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 光sail 中级黑马   /  2012-4-22 15:17  /  3993 人查看  /  7 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

内部类不能声明静态成员,怎么理解?

class fileinfo{

public String filename;

public int index;

static public int total;

public int size;

}


提示错误信息如下:

The field total cannot be declared static; static fields can only be declared in static or top level types

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

7 个回复

倒序浏览
你可以理解为 静态成员是在编译的时候静态的初始化
而在非静态内部类里面创建静态成员,是无法在编译阶段完成的
你可以想象,要初始化这个静态成员必须要创建外部类对象,因为内部类不是静态的,一定要创建外部类对象才能使用这个内部类,而创建对象这个步骤是在运行时创建而不是编译时能创建的

解决的话要将这个内部类声明为静态的

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
内部类成员静态化,相当于外部类进内存成员就进了内存,要调用非静态的方法,而内部类随着类的加载而加载了,就不需要对象了,直接拿类调用就可以了,所以成员静态没有意义了没有意义

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
当内部类中定义了静态成员,该内部类必须是static的,当外部类中的静态方法访问内部类时,内部类也必须是static。
回复 使用道具 举报
首先我们要搞清楚静态的特点,然后内部类也就自然而然的明白了。毕老师的那个视频讲得已经很清楚了,我做了一个笔记你看下

特点:
    是一个修饰符,用于修饰成员
    静态修饰的成员被所有对象所共享,存储的是共享数据,而非静态存储的是对象特有数据
    静态优先于对象存在,因为static的成员随着类的加载就已经存在
    静态修饰的成员可以用类名.静态变量直接调用
注意事项:
    静态方法只能访问静态成员(非静态方法既可以访问静态也可以访问非静态)
    静态方法不可以使用this和super关键词
    主函数是静态的  


对于内部类来说,他也是一个外部类的成员,只不过这个成员是一个类,和普通成员么有什么区别。咱们想一下,如果内部类可以声名,那么我们就可以使用类名直接调用了。但是这个类被隐藏在了外部类中,是不存在的。只有调用者创建了这个外部类并且调用了这个成员(也就是内部类)才可以使用的。
哦了,加分!!!!


回复 使用道具 举报
static特点:
1.随着类的加载而加载。
   也就是说,静态类会随着类的消失而消失。说明它的生命周期最长。
2.优先于对象存在。
    明确一点:静态是先存在,对象是后存在的。
3.被所有对象所共享。
4.可以直接被类名所调用。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马