一个 java 静态内部类的问题,求解

Jack_Yin 2011-09-06 10:03:06
问题,见下面的代码注释.
多谢赐教.



interface TestInterface
{
void test();
}

class OutterClass
{
class CommInnerClass implements TestInterface //普通内部类
{
public void test()
{
System.out.println("This is Common Inner Class.");
}
}

static class StaticInnerClass implements TestInterface //静态内部类
{
public void test()
{
System.out.println("This is Static Inner Class.");
}
}
}
public class TestInnerClass
{
public static void main(String[] args)
{
OutterClass oc = new OutterClass(); //一个外部类对象
OutterClass.CommInnerClass commInnerClass = oc.new CommInnerClass();
//创建普通内部类,必须要要有一个外部类的对象,然后用外部类对象.new的形式创建内部类对象
OutterClass.StaticInnerClass staticInnerClass = new OutterClass.StaticInnerClass();
//而创建静态内部类,必须用new OutterClass.StaticInnerClass(); 这种方式
//staticInnerClass = new oc.StaticInnerClass(); //用这种方式反而不行,为什么不行?
}
}

...全文
195 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jack_Yin 2011-09-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 huaxin520 的回复:]

内部类在创建时,会自动去获取外部类实例的句柄,用于标示内部类的地址(静态内部类除外,因为静态内部类和对象有关,不需要去获取实例的句柄)。
[/Quote]
想了几天,比较赞成这种说法.
普通内部类对象的创建,需要外部类对象引用,是采用这种特殊方式可以将外部类对象的引用偷偷的传到内部类中.
而静态内部类不需要这个外部类的引用(同时,也不能有这个引用,如果用相同的语法创建,估计在编译的时候会对代码做特殊处理,来传递这个外部类对象的引用,这样对于静态内部类就出错了),所以不能用创建普通内部类的方法来创建.
小灰狼 2011-09-08
  • 打赏
  • 举报
回复
静态表示不依赖于实例就可以直接访问,非静态表示它和实例有关

在一般的内部类里,CommInnerClass 可以访问其所在外部类 OutterClass 的实例成员变量,因此 CommInnerClass 必须在外部类实例存在的情况下才可以产生其 OutterClass 的实例。例如,外部类有一个成员变量:public int a; 因为非静态内部类 CommInnerClass 可以访问这个变量 a,而这个变量 a 又必须在外部类 OutterClass 实例存在时才会有,并且如果有N个 OutterClass 实例,就会有N个变量 a,并且每个 CommInnerClass 访问到的变量 a 可能会不一样。所以一般的内部类必须要通过外部类实例来创建对象。

静态内部类可以在不创建其外部类的情况下创建其对象,在静态内部类的实例方法里,是不可以访问其外部类的实例成员变量的。因为静态内部类实例存在时,可能其外部类对象还不存在,也可能有很多个对象存在。
jingluo 2011-09-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 huntor 的回复:]

static与类相关
非static与对象实例相关
[/Quote]++
qybao 2011-09-08
  • 打赏
  • 举报
回复
内部类并没有想象的那么复杂,可以把内部类看作一个特殊的属性
静态内部类就相当于一个静态的特殊属性,可以不通过实例调用
非静态内部类就相当于一个非静态的特殊属性,需要通过实例调用
OutterClass.CommInnerClass commInnerClass = oc.new CommInnerClass(); //所以这里需要实例oc
OutterClass.StaticInnerClass staticInnerClass = new OutterClass.StaticInnerClass(); //这里不需要实例
huaxin520 2011-09-08
  • 打赏
  • 举报
回复
内部类在创建时,会自动去获取外部类实例的句柄,用于标示内部类的地址(静态内部类除外,因为静态内部类和对象有关,不需要去获取实例的句柄)。
Luckyecust 2011-09-07
  • 打赏
  • 举报
回复
1)对象可以调用静态方法,是因为静态方法属于整个类,包括对象
2)对象不能调用内部静态构造方法,是因为内部静态类不属于对象
ps:newinstance.method() 表明此方法是属于这个对象的,但是如果这个method() 是构造方法,表明构造出来的对象依赖于 newinstance ,显然静态内部类不依赖于具体对象
ulwfnh1100 2011-09-06
  • 打赏
  • 举报
回复
我也表示不是很理解!
Jack_Yin 2011-09-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 shuwei003 的回复:]
同意一楼,静态的并非属于某一个对象,所以不能使用对象来创建。而非静态的必须和具体的对象关联。
[/Quote]
但是,类比一下,类的静态方法,用对象调用也是可以的啊.
Jack_Yin 2011-09-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 huntor 的回复:]
static与类相关
非static与对象实例相关
[/Quote]

我其实是根据,类的静态方法来类比的.因为静态方法可以由类直接调用,也可以用对象调用.
所以,这里的这种静态内部类的实例化方式,看不明白.
shuwei003 2011-09-06
  • 打赏
  • 举报
回复
同意一楼,静态的并非属于某一个对象,所以不能使用对象来创建。而非静态的必须和具体的对象关联。
wd9053 2011-09-06
  • 打赏
  • 举报
回复
oc.StaticInnerClass可能是oc包中的一个类,编译器无法区分
huntor 2011-09-06
  • 打赏
  • 举报
回复
static与类相关
非static与对象实例相关

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧