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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 曹佳佳 中级黑马   /  2013-1-10 16:47  /  1407 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张向辉 于 2013-1-16 12:09 编辑

书上写的神神叨叨的实在不理解给了一段代码看也不是很明白
谁能帮我讲讲这段代码和匿名类
interface A {
        public void fun1();
}
class B {
  int i=10;
  public void get(A a)//声明了一个get方法,用于对A接口的实例化,并调用fun1()方法
  {
          a.fun1();
  }
  public void test()
  {
          this.get(new A()
          {
                  public void fun1()
                  {
                          System.out.println(i);
                  }
          }
  );
  }
}
public class niming {
        public static void main(String[] args) {
                B b=new B();
                b.test();
        }
}

评分

参与人数 2技术分 +1 黑马币 +30 收起 理由
高境 + 1 赞一个!
黄锦成 + 30 神马都是浮云

查看全部评分

4 个回复

倒序浏览
get方法要传入一个A的实现类对象
---------------------------------------------------------------------------------------------------------------------------------
原本我们是要写一个A的实现类B
class B implements A{
                  public void fun1()
                  {
                          System.out.println(i);
                  }
}
然后条用get方法 get(new B());
---------------------------------------------------------------------------------------------------------------------------------
但是我们可以连类B都不写出来,这就要使用到匿名类的,我们在new 对象时,要有类名,如上面的new B(); 但是我们连类B都不写出来,怎么new呢?这是只能用A了,但是A是接口,怎么可以new 呢?这时我们可以看到new A()后面接了个{},即new A(){},在{}里面实现接口的方法即可

this.get(new A()
          {
                  public void fun1()
                  {
                          System.out.println(i);
                  }
        }
);

评分

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

查看全部评分

回复 使用道具 举报
这段话的意思可以这样理解:new A()你可以理解为下面代码中的 A TT = new A();的简写格式
class TT implements A{

            override//重新借口A的方法

          public void fun1(){
                  System.out.println(xxxx);
          }

}
!--------------------------------------------------------------------------------------------
new A()                                                
          {
                  public void fun1()
                  {                                                  =     TT
                          System.out.println(i);
                  }
          }
!---------------------------------------------------------------------------------------------

点评

A TT = new A(); 是个错误写法 应相当于: A a = new TT();  发表于 2013-1-10 17:44

评分

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

查看全部评分

回复 使用道具 举报
匿名内部类就是把一个类放在new语句中,也就是说一个匿名内部类只能使用一次,那么就需要在定义匿名内部类的同时创建它的对象
匿名内部类只能实现一个接口或者指定一个父类,
格式;
    new 接口或父类名() {类体}
如 class A(){}
    A a = new A() {}:创建A类的子类对象,而这个子类也是刚刚创建的。这个子类没有名字!虽然不知道这个子类叫什么名字,但可以使用A类的引用来指向它(就是多态)
也就是说,只能使用他父类的引用来指向它,那么这个引用也就只能调用A类中存在的方法,而不能再去调用子类独有的方法。
匿名内部中,都是在重写父类方法,如果写独有方法,也无法被调用.




另外说一下匿名内部类的构造代码块,由于是匿名内部类,所以没有构造器,那么构造代码块就相当于构造器的作用
格式
new A() {
  {//构造代码块}//代替了构造器的工作
}

匿名内部类的构造代码块用的比较少,了解下就行了,后期匿名内部类用的较多,多看几遍视频
回复 使用道具 举报
首先我们看看不用匿名内部类的写法,其实很麻烦,因为你发现你实现了A接口,但你在fun1()里面要访问B对象的成员变量i,你还要去new B对象才可以
interface A {
        public void fun1();
}
class B {
  int i=10;
  public void get(A a)
  {
          a.fun1();
  }
  public void test()
  {
          this.get(new C());----------然后这里还有new一个实现了A接口的C。
  }
}

class C implements A{   ---------------------这里是按常规写法。
        public void fun1(){---------------------使用匿名内部类最主要的还是你可以省略这段代码,就不用单独写一个类去实现A接口了。
                System.out.println(new B().i);----------------而且针对你这个题还有一点麻烦的就是,你会发现,你要打印B的成员变量I ,你这里还要new一个才可以,这就很麻烦了,但这个是限于这个题才这样的。
        }


你这样一对比就知道好处了,但是匿名内部类也只限于接口中的方法比较少的时候采用,如果接口中方法太多,那么要都在匿名内部类中实现的实现的话就会显得很臃肿,不易读。
还有LZ  的niming 最好写成NiMing稍微规范一点点。
}


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