public class TestStatic
{
//定义一个非静态的内部类,是一个空类
private class In{}
//外部类的静态方法
public static void main(String[] args)
{
//下面代码引发编译异常,因为静态成员(main方法)无法访问非静态成员(In类)
new In();
}
}[/code]但是你可以在外部类定义一个非静态的方法,在这个方法内部来访问非静态内部类,如下[code=java]package cn.itcast.heima.mythreadtest;
public class Outer
{
private int outProp = 9;
class Inner
{
private int inProp = 5;
public void acessOuterProp()
{
//内部类可以直接访问外部类的成员
System.out.println("外部类的outProp属性值:" + outProp);
}
}
public void accessInnerProp()
{
//外部类不能直接访问内部类属性,下面代码出现编译错误
//System.out.println("内部类的inProp属性值:" + inProp);
//如需访问内部类成员,必须显式创建内部类对象
System.out.println("内部类的inProp属性值:" + new Inner().inProp);
}
public static void main(String[] args)
{
//执行下面代码,只创建了外部类对象,还未创建内部类对象
Outer out = new Outer();
}
}[/code]---------------------------------------------
总之:非静态内部类对象必须寄存在外部类的对象里面,而外部类对象则不一定有非静态内部类对象寄存在其中
,所以如果存在一个非静态内部类,这一定存在一个被他寄存的外部类对象,反之则不一定,
所以外部类对象访问非静态内部类成员时候,可能非静态普通内部类的对象根本不存在,反之则一定存在作者: 匿名 时间: 2011-7-18 17:39 标题: 回复 楼主 的帖子 道理很简单,不难想象,如果在Out里面定义一个int n,你直接运行了,这个n肯定不能被调用,因为要想调用n,要先创建一个Out的实例化对象,只有一份糖醋里脊的食谱你是吃不到糖醋里脊的。
同理,在Out中创建的类要使用也要像调用一个成员变量,一个方法那样才行,都要先有一个Out类的实例化对象才能实现
public class Out{
int n = 5;
public static void main(String[] args) {
System.out.println("n");
}
}
代码改成这样就没问题了
public class Out{
public static void main(String[] args) {
Out out = new Out();
Inner in = out.new Inner();
}
class Inner{
}
}作者: 匿名 时间: 2011-7-19 10:50 标题: 解决问题的两种方法 这个问题我刚看到时也感觉到有些困惑,有种错觉之前这样用没有出现同样的问题,后来经查询资料才明白其中的原理。第一种解决方案就像大家所说的,这在张孝祥老师的面象对象基础中也有讲到。还有一种方式是在内部类的前面加上static关键字,虽然这有背内部类的思想,但同样也能解决该问题的方式为何不用呢…作者: 匿名 时间: 2011-7-19 13:00 标题: 回复 板凳 的帖子 貌似你所说的有误。
实例内部类对象是与外部对象关联的。所以实例化实例内部类,先要获得外部类的对象。同一个类中非静态方法由于已经关联了对象,所以不必指定外部对象,但是在静态方法以及客户类中实例化实例内部类,必须先实例化外部对象。所以静态方法中是可以创建实例内部类对象的。