A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张扬 黑马帝   /  2011-7-31 19:20  /  2548 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我想问一下,匿名内部类到底 是说的谁匿名啊
interface Useing{
    public void kk()
}
class Usein
{
   Useing a=new Useing(){
     public void kk()
     {
      System.out.println("这是一个接口类型的匿名内部类")
     }
   };
     void print(){
      a.kk();
    }
}
class text
{
    public static void main(String args[])
   {
   Usein b=new Usein();
   b.print();
   }
}
因为Usein是一个接口,不能进行实例化。 所以创建了一个匿名类,实现接口中的抽象方法!  
1、匿名类说的到底是 谁匿名??
2、堆栈结构中, 栈是先进后出的,那么堆呢??因为 方法的局部变量位于栈上,对象位于堆上。 所以内部类对象不能使用 局部变量。
    请说一下堆和栈的详细情况,谢谢了

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

1 个回复

倒序浏览
黑马网友  发表于 2011-7-31 19:25:15
沙发
1.使用接口创建出来的而非使用类实现接口出来的就是匿名类了。
因为接口是无法new的,而使用接口new对象实际是就是产生了一个没有进行命名的类,而这种类就叫做匿名类了。
interface Abc{
public void fn();
}
class Test{
void fn(){
//这里的new Abc()就是一个匿名类,由接口直接产生,而未通过class XXX implements Abc得到
new Abc(){
public void fn(){}
}
}
}


2.不太清楚你问的东西大概什么意思?说一下我的理解
一个类定义完毕,如果JAVA虚拟机加载了这个类,那么它会将所有的static修饰的成员(变量和方法)加载入栈内存,这一部分内存只有一种时候才会被释放,就是JVM退出的时候。
如果使用该类定义了一个对象,也就是new出来的东西,那么会在堆内存中创建一块内存地址,用于存放这个对象,当该对象被释放掉时(JVM不退出,仅仅是回收了这一块内存),被占用内存将清空。
至于内部类的问题,本人认为内部类实际上就是在一个类中定义了一种新的数据类型,当这种数据类型没有被使用时,JVM不会加载它,换句话说,内部类也是一种类,不使用就不加载,只不过它的格式特殊一些而已,单从JAVA编译后的形态来看,内部类独立成一个.class文件,只不过类名是:外部类名$内部类名.class。所以内部类操作时和普通类是一样的,完全满足普通类的各种加载释放原理。
引用LZ的原话“方法的局部变量位于栈上”这句话我不能苟同,本人认为局部变量是在堆内存中的

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马