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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张小明   /  2011-7-21 17:05  /  5790 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在某资料中看见这样一句话“成员内部类不可以有静态属性”,怎么理解这句话呢?

评分

参与人数 1技术分 +1 收起 理由
admin + 1 为什么呢??

查看全部评分

6 个回复

倒序浏览
黑马网友  发表于 2011-7-21 17:34:59
沙发

我也新手 看你问的问题我搜的 希望能帮到你

是内存分配导致的。

这么说吧,静态的对象,在内存中实默认实例化的,在加载的时候就会存放到内存中。
也就是可以直接调用而不需要手动实例化。

理解这个就不难理解你说的问题了。
首先内部的静态类他是不能直接被实例化的。你必须实例化外部类才能实例化它。而外部类不是默认加载的,他只有在手动实例化之后才有内存分配。

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

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

评分

参与人数 1技术分 +1 收起 理由
admin + 1 新手报到

查看全部评分

回复 使用道具 举报
楼上解释是对的
简单来说就是静态属性先于类分到内存地址,
另外,静态属性只会被初始化一次
回复 使用道具 举报
黑马网友  发表于 2011-7-21 18:35:39
板凳
不要说的那么复杂嘛 成员内部类不可以有静态属性,这是因为静态属性是在加载类的时候创建,这个时候内部类还没有被创建.
所以内部类中不可以包含静态属性

评分

参与人数 1技术分 +1 收起 理由
admin + 1 先给分

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-21 18:37:03
报纸
确实是内存分配导致的!
我想呢:  静态的方法和变量  与其他的方法、变量是没有放在一起的!被单独放在一个内存块中!
内部类是在运行到  需要的那块代码出才产生的!

内部类也可以 有静态属性 的话,就会造成内存的浪费!  只需要用那么一两次,但是你把它弄成了静态方法,好久不能释放!内存要是不够了的话,还不能释放,会出现严重的内存泄漏问题!

所以成员内部类不可以有静态属性!

评分

参与人数 1技术分 +1 收起 理由
admin + 1 先给分再看

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-23 02:17:43
地板
看了大家的回复,总结一下,被静态修饰的属性优先于对象存在,随着类的加载而加载,生命周期长,这时内部类还未被创建,并且被静态修饰的属性存在于方法区中,不会随内部类的使用完毕而销毁,浪费内存。
这样总结不知道合不合适。

评分

参与人数 1技术分 +2 收起 理由
小龙 + 2 2点17分在线,精神可嘉,加分必须的!

查看全部评分

回复 使用道具 举报
恩,看完上面的回答,在下产生了一个问题,静态方法内部不能声明静态内部类的问题,我指的静态方法里面是不能有public,static变量的,在编译的时候是否把class当作一个变量来编译呢,请看下面代码:
public class Demo2 {
        public static void main(String[] args) {
                Test.Method1();
                class Test2{
                        public  void  Method2() {
                                System.out.println("new Test2().Method2()");
                        }
                }

//                static class Test3{
//                        public static void Method3(){
//                                System.out.println("在方法内部声明静态类会报错,谁能解释一下");
//                        }
//                }
        }
        static class Test{

                        public static void Method1() {
                                System.out.println("Test内部类静态方法,编译运行SUCCESS!");
                        }
        }
}
把注释的代码取消就会报错。。。。,也就是Test3,其他的Test,Test2都运行正常。。。是不是和我的猜想一样。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马