一个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文件呢?? 展开
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文件呢?? 展开
2个回答
展开全部
本文将详细的解释内部类,希望和大家交流.
简单的内部类定义形如这样:
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();
}
}
简单的内部类定义形如这样:
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
展开全部
a$1.class是new b();产生的匿名内部类,并非你的class b,因为他是private的。你可以试试去掉private这样就只有2个类了。初步判断是这样,不足之处请指教
如果内部类是匿名的,那么编译器会简单地生成数字,把它们作为内部类标识符使用。若内部类嵌套于其他内部类中,则它们的名字简单地追加在一个$以及外部类标识符的后面。
我之前理解private时错了,但是匿名类的原因,还没有分析透彻
如果内部类是匿名的,那么编译器会简单地生成数字,把它们作为内部类标识符使用。若内部类嵌套于其他内部类中,则它们的名字简单地追加在一个$以及外部类标识符的后面。
我之前理解private时错了,但是匿名类的原因,还没有分析透彻
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询