黑马程序员技术交流社区
标题:
直接访问静态内部类的静态方法疑问。
[打印本页]
作者:
曹宇
时间:
2013-5-9 00:12
标题:
直接访问静态内部类的静态方法疑问。
本帖最后由 曹宇 于 2013-5-11 14:47 编辑
class Noname5
{
public static void main(String[] args)
{
Outer.Inter.run(); //主函数调用
}
}
class Outer //外部类,非静态
{
static int x =3; //静态外部类成员变量
static class Inter //静态内部类
{
static void run() //静态内部类成员方法
{
System.out.println(x);
}
}
}
复制代码
如上代码:
为什么在主函数中,使用 Outer.Inter.run();就可以?
就算Inter是静态类,可是Outer是非静态的啊,还没有创建Outer对象,哪里来的Inter呢?
是不是 编译过程中,已经生成了Outer和Inter的class文件,然后运行的时候因为Outer中有Inter这个静态 所以自己就进了内存了?
因为正常方法中如;
class Test
{
}
class Demo
{
public static void main(String [] args)
{
}
}
编译之后是会有Test.class文件的,可是在主函数中不创建Test的对象,这个class文件是不会进内存的只在磁盘上保留啊。
因为内部类带个静态那么这个class文件就不需要主函数自行就会进入内存吗?进入静态区?
还请高手解答。
作者:
曹宇
时间:
2013-5-9 00:35
好吧,我2B了,其实这问题很简单。
class Test
{
static run()
{}
}
class Demo
{
public static void main(String[] atgs)
{
Test.run(); //本来就可以直接这样的。。。。。我自己犯晕了,现在明白了,就想探讨一下原理。
}
}
如上代码,我自己思维混乱了。。
不过不疑问这个问题了,
现在想知道就像上面说的,如果我没有创建Test对象,而主函数直接Test.run(); 就用了,那么是否说明,包含静态的类会自动加载进内存?
作者:
337091921
时间:
2013-5-9 00:36
为什么用Outer.Inter.run();就可以?
类中的类可以理解为类中的普通方法和属性,因为Inter是静态的,所以静态的可以被类名的直接调用,所以Outer.Inter.
同理 run方法也是静态的,也可以类名调用,所以用Inter.run();如果要调用类中类中的方法,所以Outer.Inter.run();。
作者:
曹宇
时间:
2013-5-10 13:35
任江峰 发表于 2013-5-9 21:41
static修饰后的成员具备以下特点:
1,随着类的加载而加载,也就是说,静态会随着类的消失而消失, ...
恩,意思就是JVM一运行,所有能用到的类都会自动进内存是吧,而不是创建了对象才会进去
?
作者:
黑马-雷钊
时间:
2013-5-10 18:46
class Noname5
{
public static void main(String[] args)
{
Outer.Inter.run(); //主函数调用
}
}
class Outer //外部类,非静态
//
{
static int x =3; //静态外部类成员变量
static class Inter //静态内部类
{
static void run() //静态内部类成员方法
{
System.out.println(x);
}
}
}
这个道理其实很简单。不要把它想的那么复杂。我给你解释下程序的执行过程你就全明白了。我们可以把静态内部类当成一个
普通的静态成员。只要是静态就会随着类的加载而加载对不对。。同时也会被存储到方法区里。这样就能被类名点调用了。
那么我用外部类的类名调用它的静态成员也没问题吧?然后就很正常了。调用内部类中的静态方法就是java的基本特性了。
作者:
曹睿翔
时间:
2013-5-10 22:36
问题解决请编辑改为已解决,有疑问可以继续追问
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2