黑马程序员技术交流社区

标题: 匿名内部类d.show()调用可以,d.abc()调用就编译失败? [打印本页]

作者: 靓仔    时间: 2014-2-21 16:43
标题: 匿名内部类d.show()调用可以,d.abc()调用就编译失败?
本帖最后由 靓仔 于 2014-2-23 16:13 编辑

1:匿名内部类其实就是内部类的简写格式。
2:定义匿名内部类的前提:
        内部类必须是继承一个类或者实现接口
3:匿名内部类的格式: new 父类或者接口(){定义子类的内容}
4:其实匿名内部类就是一个匿名子类对象。而且这个对象有点胖,可以理解带内容的对象。
5:匿名内部类中定义的方法最好不超过三个。
*/
abstract class AbsDemo
{
        abstract void show();
}
class Outer
{
        int x = 3;
        /*
        class Inner extends AbsDemo
        {
                void show()
                {
                        System.out.println("x =="+x);
                }
        }
        */
        public void function()
        {
                //new Inner().show();
                AbsDemo d=new AbsDemo()//替代绿色部分
                {
                        void show()
                        {
                                System.out.println("x=="+x);
                        }
                        void abc()
                        {
                                System.out.println("hah");
                        }
                };
                d.show();
                //d.abc();编译失败
        }
}
class  InnerClassDemo5
{
        public static void main(String[] args)
        {
                new Outer().function();
        }
}

作者: 松涛小玮    时间: 2014-2-21 17:25
  AbsDemo d=new AbsDemo()//这里相当于建立了AbsDemo的字类对象
                {
                         void show()
                         {
                                 System.out.println("x=="+x);
                         }
                         void abc()
                         {
                                 System.out.println("hah");
                         }
                 };
这里相当于建立了AbsDemo的子类对象,这个子类对象覆盖了父类的方法并且自定义了一个abc方法,abc方法是子类的方法 d是指向父类的引用  不能调用子类的自定义方法  但是可以调用被覆盖的父类方法  这里其实是多态的问题 父类不能转型成子类  所以子类自己的方法 父类不能用
作者: 薆情媬証書    时间: 2014-2-21 19:54
楼上正解,楼主写的 new AbsDemo() {}是内部类,而内部类相当于一个子类对象,然后楼主将父类类型(AbsDemo)指向了子类对象(就是该内部类!)根据面向对象的三大特性之一的多态性这样写没有任何问题,但是其缺点就是访问的局限性,该对象(d)只能访问父类中的成员和方法,无法访问子类特有的属性和方法!总得来说就是体现了多态访问的局限性
作者: 徐芾清    时间: 2014-2-22 10:31
请注意这句话:内部类必须是继承一个类或者实现接口
个人认为能理解这句话就能够也很容易理解这个问题了
在父类引用指向子类对象的时候(既多态),是无法引用子类中的方法的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2