黑马程序员技术交流社区
标题:
内部类为什么不能定义静态
[打印本页]
作者:
邝雄伟
时间:
2013-1-28 01:32
标题:
内部类为什么不能定义静态
为什么内部类里面不能定义静态的?是内存加载的问题么?能解释下内部类与静态内存是怎么加载的么?
作者:
郭孟涛
时间:
2013-1-28 01:35
静态的对象,在内存中实默认实例化的,在加载的时候就会存放到内存中。
也就是可以直接调用而不需要手动实例化。
理解这个就不难理解楼主说的问题了。
首先内部的静态类他是不能直接被实例化的。你必须实例化外部类才能实例化它。而外部类不是默认加载的,他只有在手动实例化之后才有内存分配。
这时问题出现了。既然静态对象是默认加载,那么静态内部类应该先于外部类被加载到内存中。
那么这是又和我们之前的一个结论相反(首先内部的静态类他是不能直接被实例化的。你必须实例化外部类才能实例化它。)所以这种写法是错误的。
这会产生歧义。比如
class Outer {
int outerX;
Inner inner1 = new Inner();
Inner inner2 = new Inner();
class Inner {
int innerX;
}
}
Outer outer1 = new Outer();
Outer outer2 = new Outer();
假如innerX是static的,那么这个static的含义是
1:仅是同一outer实例下的不同inner实例共享:
outer1.inner1.innerX=outer1.inner2.innerX,And
outer2.inner1.innerX=outer2.inner2.innerX,But
outer1.inner1.innerX!=outer2.inner1.innerX,Hence
outer1.inner2.innerX!=outer2.inner2.innerX
2: 所有outer实例的inner实例都共享:
outer1.inner1.innerX=outer1.inner2.innerX,And
outer2.inner1.innerX=outer2.inner2.innerX,And
outer1.inner1.innerX=outer2.inner1.innerX,Hence
outer1.inner2.innerX=outer2.inner2.innerX
作者:
郭孟涛
时间:
2013-1-28 01:43
简单来说:类的概念就是提供的一个模板,我们需要的时候才实例化它,开辟内存。
作者:
杨浩
时间:
2013-1-28 02:40
class Outer
{
private static int num=3;
static class Inner //内部类
{
void show()
{
System.out.println("show run..."+num);
}
static void function()//如果内部类中定义了静态成员,该内部类也必须是静态的;
{
System.out.println("function run..."+num);
}
}
public void method()
{
Inner in=new Inner();
in.show();
}
}
class InnerClassDemo
{
public static void main(String[] args)
{
Outer out=new Outer();
out.method();
/*
//直接访问外部类中的内部类的成员(内部类非静态)
Outer.Inner in=new Outer().new Inner();
in.show();
//也可以写作
Outer out-new Outer();
Outer.Inner in=out.new Inner();
in.show();
*/
//如果内部类是静态的,那就相当于外部类
Outer.Inner in=new Outer.Inner();
in.show();
//如果内部类是静态的,成员是静态的
Outer.Inner.function();
}
}
复制代码
内部类可以是静态的,而且内部类里面可以有静态成员呀。
如果内部类有静态成员的话,那么内部类必须是静态。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2