`
bingzhen66
  • 浏览: 36415 次
文章分类
社区版块
存档分类
最新评论

28.黑马程序员-匿名内部类

 
阅读更多

------- android培训java培训、期待与您交流! ----------

1.概念
  • 匿名内部类其实是内部类的简写格式。
2.前提
  • 内部类必须是继承一个类或者实现接口。
    • 内部类可以直接继承 其他外部类,继承直接外部类没意义。
3.格式
  • 匿名内部类的格式: new 父类或者接口()
          • {定义子类的内容}
          • [.方法]
  • 其实匿名内部类就是一个匿名子类对象,而且这个类有点胖,可以理解为带内容的对象。
4.定义
  • (一)首先是一个普通的成员内部类:
  • 一般的成员内部类步骤
    • 1.内部类继承了一个类(可以是抽象类和接口)。//这个是为了简化为匿名类而增加的,一般可以不写。
    • 2.复写内部类中的方法
    • 3.外部类创建内部类的对象
    • 4.调用这个对象的方法。
  • abstract class AbsDemo //内部类所继承的外部类,也可以是接口。
  • {
    • abstract void show();
  • }
  • class outer
  • {
    • int x = 3;//直接外部类的成员变量
    • class Inner extends AbsDemo
    • {
      • void show()
      • {
        • Sop("");
      • }
    • }
    • public void function()
    • {
      • new Inner().show();//建立内部类对象,调用内部类的方法。
    • }
  • }
  • (二)简化后的匿名内部类
  • 简化为匿名内部类思路:
    • 首先考虑因为是匿名的,就没法创建内部类对象。该内部类有一个父类,可以new父类,父类是一个抽象类有抽象方法,不能直接创建对象。创建抽象类对象就是实现抽象方法,步骤: new父类(抽象类或方法都可以), 覆盖或 实现里面的抽象方法。
  • 匿名内部类步骤
    • 这个是最终的匿名内部类, 这是一个对象,它是AbsDemo的子类对象。
      • new AbsDemo()
      • {
        • void show()
        • {
          • Sop("");
        • }
    • 1.new Inner().show(); //这个是调用内部类对象的show方法。
    • 2.new AbsDemo().show();//由于 Inner匿名,所以用父类代替。这个对象还少show方法。
    • 3. new AbsDemo()
    • {
      • void show()
      • {
        • Sop("");
      • }
    • }//从这往上是一个对象体,这个对象是AbsDemo的匿名子类对象。
    • .show();//这个是对象调用show方法。









  • 匿名内部类示例:
  • abstract class AbsDemo //内部类所继承的外部类,也可以是接口。
  • {
    • abstract void show();
  • }
  • class outer
  • {
    • int x = 3;//直接外部类的成员变量
    • public void function()
    • {
      • new AbsDemo()//这是一个对象,它是AbsDemo的子类对象。
      • {
        • void show()
        • {
          • Sop("");
        • }
      • }
    • }
  • }
5.注意
  • 父类方法过多(大于两个)时,不允许使用匿名内部类,实现没有问题,但是太繁琐。
  • 匿名类的存在是为了简化书写、覆盖父类方法, 一般只有匿名子类对象结尾调用一次方法。像调用第二个方法,必须新建第二个匿名类。
  • 多态无法使匿名类调用自己的新加方法,因为父类无法调用子类特有方法。
  • 什么时候使用匿名内部类呢?
    • 当需要传递一个对象参数,这个参数是接口或抽象类对象并且这个接口或抽象类的方法不大于两个。
    • 这个参数就可以写成匿名内部类。格式如下:
      • 方法(new 接口()
      • {
        • 方法
        • {
        • }
      • });//注意这里,大括号是接口子类对象体的,小括号是参数的,分号是语句结束。
  • 有一种特殊的情况:能不能不继承任何抽象类、实现任何接口就能实现匿名内部类呢?答案是可以的,因为我们有上帝Object.
6.面试题
(一)
  • 存在一个inter接口、一个主函数,补足Test。
  • interface Inter
  • {
    • void method();
  • }
  • class Test
  • {
  • //补足代码。通过匿名内部类。

  • }
  • class InnerClassTest
  • {
    • public s v main(String[] args)
    • {
      • Test.function().method();
    • }
  • }

  • 分析。
  • 1.这个问题的关键在 Test.function().method();
    • 首先Test. function()可以看出:Test类中function是静态的。
    • 再就是.method()能看出: Test.function()的运算结果是一个Inner对象,原因是只有Inner对象才能调用method方法。
    • 分析完毕。
  • 2.代码如下:
    • static Inner function()
    • {
      • return new Inter()
      • {
        • public void method()
        • {
          • Sop("");
        • }
      • }
    • }
(二)

7.总结:
  • 匿名内部类就是直接new一个接口或抽象类。当然,这个类是它们的子类,叫做匿名内部子类。接口或抽象类无法直接创建对象,只需要把它们的方法实现即可。简单说:直接new接口(匿名类)对象,后面补足方法。









分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics