一个JAVA内部类的问题?

packagecn;classa{privateclassb{Integeri=newInteger(0);}voidgeti(){bc=newb();System.ou... package cn;

class a {
private class b{
Integer i = new Integer(0);
}
void geti() {
b c = new b();
System.out.println(c);
}
}

这段代码编译以后会产生3个类,其中一个a$1.class是怎么产生的
为什么他是私有的就会产生一个匿名的内部类呢??

内部类是匿名的,编译器会产生数字做标示符我也知道
但是我的这段代码里没有生成内部类的代码啊
可以肯定的是new b().i产生的,但为什么不加Private的时候也只产生两个.class文件呢??
展开
 我来答
jrobot
2007-05-14 · TA获得超过615个赞
知道小有建树答主
回答量:313
采纳率:0%
帮助的人:197万
展开全部
本文将详细的解释内部类,希望和大家交流.

简单的内部类定义形如这样:

class A{

class B{}

}这样的类被称为内部类,又 被称为内隐类.

从简单到深入一步一步的分析内部类的特点.

class OuterClass

{ static class A //静态内部类

{ public A( )

{ System.out.println("Test$A !"); } }

class B //非静态内部类

{ public B( )

{ System.out.println("Test$B !"); } }

public void disp( )

{

final int a=10; int b;

class C //成员函数中的局部内部类

{ public C( )

{ System.out.println(“in class C a="+a);

//System.out.println(b);

}

}

C c=new C( );

}

public class Test extends OuterClass

{

public static void main(String args[])

{ OuterClass.A a=new OuterClass.A( );

//建立静态内部类对象

B b=new OuterClass( ).new B( );

//建立非静态内部类的对象

//注意这个OuterClass().new B();相当于生成一个外部类的对象,然后在利用外部类对象生成内部类对象

OuterClass t=new OuterClass( );

t.disp( );

//通过外部对象调用一个对象方法的形式,新建立了对象C.

}

}

注意在上面的b在运行时会为0,因为是类属性.

class OuterClass

{

static class A { } //静态内部类

class B { } //非静态内部类

public void disp( )

{

class C{ } //局部内部类

}

}

编译后的结果:

OuterClass.class

OuterClass$A.class

OutClass$B.class

OuterClass$1$C.class

记住以下几句话:

1,一个内部类的对象能够访问创建它的外部类对象的所有属性及方法(包括私有部分)。

//可以闭上眼镜,把这个内部类等同于一个类的一个方法,当然就可以访问这个外部类的

//所有方法和属性,私有方法和属性是属于外部类的,当然也就等同于内部类的.

2,对于同一个包中的其它类来说,内部类能够隐藏起来。(将内部类用private修饰即可)

//只有在内部类中,才能定义一个为private类型的class,因为这时编译器已经把这个类看作这个类的成员了,但是在一般使用时,就是所谓的”顶级类时”,不能使用private,只能是public 或者是friendly.

如果要是想保证一个类不产生任何的对象,请在构造函数中,把构造函数声明成private.

3, 内部类可定义在方法中,称为局部内部类,但它只能使用方法中的final常量。

//定义在一个方法内的类,又被成为局部内部类,这个类只能使用在方法中的final常量,注意,这个常量是在一个方法中的,那么能否使用一个类中的常量呢?

当然是可以的,因为类中的常量在在一个方法中是可见的.

//

如果把一个类写在了一个if中,比如这样:

class A{

int a = 10;

if(a!=10){

class B{

B(){

System.out.println(a);

}

}

}

}

在编译后会有几个错误呢?

首先那个a没有被定义为final,你有一次上了圈套.

类B同样会被生成出来,只是离开了if域就失效了.

4,内部类可以被定义为抽象类

// abstract 类同样可以在内部类中

5, 非静态内部类不能声明本类的static成员

//只有一个静态的内部类,才可以声明一个static成员,

class A{

static class B{

//如果这里不是一个static类,是不可以被声明这个gg方法的.

static void gg(){

int a = 100;

System.out.println(a);

}

}

}

class aa{

public static void main(String args[]){

A.B hh = new A.B();

hh.gg();

}

}

参考资料: http://hi.baidu.com/changsheng/blog/item/42b8a97764df371ab151b960.html

pacific314b
2007-05-15 · 超过43用户采纳过TA的回答
知道小有建树答主
回答量:138
采纳率:0%
帮助的人:98.1万
展开全部
a$1.class是new b();产生的匿名内部类,并非你的class b,因为他是private的。你可以试试去掉private这样就只有2个类了。初步判断是这样,不足之处请指教

如果内部类是匿名的,那么编译器会简单地生成数字,把它们作为内部类标识符使用。若内部类嵌套于其他内部类中,则它们的名字简单地追加在一个$以及外部类标识符的后面。

我之前理解private时错了,但是匿名类的原因,还没有分析透彻
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式