黑马程序员技术交流社区
标题:
为什么“成员内部类不可以有静态属性”呢?
[打印本页]
作者:
张小明
时间:
2011-7-21 17:05
标题:
为什么“成员内部类不可以有静态属性”呢?
在某资料中看见这样一句话“成员内部类不可以有静态属性”,怎么理解这句话呢?
作者:
匿名
时间:
2011-7-21 17:34
标题:
我也新手 看你问的问题我搜的 希望能帮到你
是内存分配导致的。
这么说吧,静态的对象,在内存中实默认实例化的,在加载的时候就会存放到内存中。
也就是可以直接调用而不需要手动实例化。
理解这个就不难理解你说的问题了。
首先内部的静态类他是不能直接被实例化的。你必须实例化外部类才能实例化它。而外部类不是默认加载的,他只有在手动实例化之后才有内存分配。
这时问题出现了。既然静态对象是默认加载,那么静态内部类应该先于外部类被加载到内存中。
那么这是又和我们之前的一个结论相反(首先内部的静态类他是不能直接被实例化的。你必须实例化外部类才能实例化它。)所以这种写法是错误的。
作者:
王松朝
时间:
2011-7-21 18:16
楼上解释是对的
简单来说就是静态属性先于类分到内存地址,
另外,静态属性只会被初始化一次
作者:
匿名
时间:
2011-7-21 18:35
不要说的那么复杂嘛 成员内部类不可以有静态属性,这是因为静态属性是在加载类的时候创建,这个时候内部类还没有被创建.
所以内部类中不可以包含静态属性
作者:
匿名
时间:
2011-7-21 18:37
确实是内存分配导致的!
我想呢: 静态的方法和变量 与其他的方法、变量是没有放在一起的!被单独放在一个内存块中!
内部类是在运行到 需要的那块代码出才产生的!
内部类也可以 有静态属性 的话,就会造成内存的浪费! 只需要用那么一两次,但是你把它弄成了静态方法,好久不能释放!内存要是不够了的话,还不能释放,会出现严重的内存泄漏问题!
所以成员内部类不可以有静态属性!
作者:
匿名
时间:
2011-7-23 02:17
看了大家的回复,总结一下,被静态修饰的属性优先于对象存在,随着类的加载而加载,生命周期长,这时内部类还未被创建,并且被静态修饰的属性存在于方法区中,不会随内部类的使用完毕而销毁,浪费内存。
这样总结不知道合不合适。
作者:
376699155
时间:
2016-1-18 11:48
恩,看完上面的回答,在下产生了一个问题,静态方法内部不能声明静态内部类的问题,我指的静态方法里面是不能有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都运行正常。。。是不是和我的猜想一样。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2