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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邱成 中级黑马   /  2012-9-8 23:59  /  2223 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 邱成 于 2012-9-9 22:41 编辑

我想问一下,匿名内部类到底 是说的谁匿名啊!
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 收起 理由
田建 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
首先,搞清楚匿名内部类,要行搞清楚具体格式是怎样的,匿名内部类有一个条件,还么存在实现,要么存在继承,为什么呢?因为其用到了多态.
具体格式如下:
父类或接口名 引用名=new 父类或接口名(){具体子类实现};或直接就是new 父类或接口名(){具体子类实现};分号别忘了
使用格式:
引用名.匿名内部类里面的成员,    或者:  new 父类或接口名(){具体子类实现}.匿名内部类里面的成员


我想问一下,匿名内部类到底 是说的谁匿名啊!(是谁匿名,就看最后生成了哪个对象,生成这个对象的类,就是匿名的!)
interface Useing{
    public void kk()
}
class Usein
{
   Useing a=new Useing(){
     public void kk()
     {
      System.out.println("这是一个接口类型的匿名内部类")你对应格式,可以很明显看出来,这里就是实现Useing接口的匿名内部类
     }
   };
     void print(){
      a.kk();
    }
}
class text
{
    public static void main(String args[])
   {
   Usein b=new Usein();
   b.print();
   }
}
栈是先进后出,因为要等先进的里面的具现实现完自已才会出.
而堆中的数据,不存说先进后出的问题,堆内存主要存的引用型数据,所以,其在栈内存中都有引用,当栈内存引用执行完,其没有了具体引用指向,其就进入了待清理状态,等待垃圾回收机制清除.

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 陈振兴 于 2012-9-9 04:58 编辑

对于匿名内部类我给你举个最简单的例子,然后你结合楼上比较抽象的语言就理解了!
Useing a=new Useing(){//这种书写方式就是匿名的内部类
     public void kk()
     {
      System.out.println("这是一个接口类型的匿名内部类")
     }
   };
     void print(){
      a.kk();
    }
举例:匿名内部类,顾名思义,为什么用内部类?1)某类中访问另外一个类中的私有类。2)某一个类中的对象依赖于另一个类的对象。

如人和心脏是一体的吧!心脏是依附人体而存在,你去看病的时候,你说心脏有点不好,不可能医生就把你心脏拿出来吧!……
抽象到程序当中:
interface Hear{//为什么把心脏抽象成接口,因为每个人都有,心脏的健康状态不一样,抽象出来
//跳动
void jump();
}


class Person{
String name;//什么名字 ,     get,set方法就不写了


Person(String name){this.name=name}//谁看病

public void seeDoctor(){//看医生去了
   new Hear(){
      public void jump(){
         System.out.println(Person.this.name+"哦,你的心脏不太好了,先做个心电图……");
       }
   }.jump();
}

}
匿名内就是如此!
抛砖引玉,回头再看这些专业术语就ok!

一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类,没有类名,根据多态,我们使用其父类名。
因其为局部内部类,那么局部内部类的所有限制都对其生效。
匿名内部类是唯一一种无构造方法类。
匿名内部类在编译的时候由系统自动起名Out$1.class。


还有第二个问题:
栈有两个方法,push和pop,小时候玩过枪吧!就是那个弹夹存放子弹的功能(自己抽象个类试着玩玩)。
然后重点:Java的堆是一个运行时数据区,类的对象从中分配空间。这些对象通过newnewarrayanewarraymultianewarray等指令建立,它们不需要程序代码来显式的释放。堆是
由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数
据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的
变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。

java.util.stack(stack即为堆栈)的父类为Vector。可是stack的父类是最不应该为Vector的。因为Vector的底层是数组,且Vector有get方法(意味着它可能访问到并不属于最后一个位置元素的其他元素,很不安全)。
Stack类以后不要轻易使用。

知识学活了就完全没问题了啊!呵呵
有时间可以参照一下我的日志,但是没有那么多的例子啊!呵呵!从这两天刚泡论坛啦!

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 回答问题可以更有针对性!

查看全部评分

回复 使用道具 举报
Useing a=new Useing(){}这就是了

评分

参与人数 1黑马币 +15 收起 理由
田建 + 15 简洁固然重要,可是你的接口都还没实现!.

查看全部评分

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