黑马程序员技术交流社区

标题: 本人已经掉入匿名子类的误区,求救! [打印本页]

作者: 张业婷    时间: 2014-10-2 23:58
标题: 本人已经掉入匿名子类的误区,求救!
本帖最后由 张业婷 于 2014-10-3 00:20 编辑

Person man=  new Person(){
      public int test(){
          return 12;
      }
}
int x=man.test();
system.out.println(x);
这句话为什么不对啊?
作者: 罗林军    时间: 2014-10-3 00:11
Person man = new Person(){}这样的形式是父类引用指向子类对象,这是多态的一种体现形式,这个时候man不能调用子类的特有方法的。还有test()方法的返回值要是Int才能返回,楼主的代码应该改为:
class  H
{
        public static void main(String[] args)
        {
                int x=  new Person(){
                public int test(){
                          return 12;
                }
                }.test();
                //int x=man.test();
                System.out.println(x);
        }
}

class Person
{
}

作者: 罗林军    时间: 2014-10-3 00:16
多态的情况下如何调用子类的特有方法,当父类引用指向该子类对象的情况下,可以将其向下转型为子类引用,即强制类型转换,但需注意转换时必须是该父类引用指向相应子类对象的情况下方可,但是匿名子类对象因为匿名,所以只能使用一次,因此不能进行强制类型转换,只能在匿名对象建立那里进行特有方法的调用。
作者: 张业婷    时间: 2014-10-3 00:21
罗林军 发表于 2014-10-3 00:16
多态的情况下如何调用子类的特有方法,当父类引用指向该子类对象的情况下,可以将其向下转型为子类引用,即 ...

谢谢!明白了!
作者: 张业婷    时间: 2014-10-3 00:25
罗林军 发表于 2014-10-3 00:16
多态的情况下如何调用子类的特有方法,当父类引用指向该子类对象的情况下,可以将其向下转型为子类引用,即 ...

不过这还能强制装换吗?怎么强制转换?子类中定义的方法怎么调用?
作者: 罗林军    时间: 2014-10-4 01:01
张业婷 发表于 2014-10-3 00:25
不过这还能强制装换吗?怎么强制转换?子类中定义的方法怎么调用?

楼主可以看看下面的代码和注释,这是父类引用指向子类对象的多态的各种情况的展示,楼主可以根据输出的结果判断准确性
class Fu
{
        static int num = 5;
        void method1()
        {
                System.out.println("fu method_1");
        }
        void method2()
        {
                System.out.println("fu method_2");
        }
        static void method4()
        {
                System.out.println("fu method_4");
        }
}


class Zi extends Fu
{
        static int num = 8;
        void method1()
        {
                System.out.println("zi method_1");
        }
        void method3()
        {
                System.out.println("zi method_3");
        }

        static void method4()
        {
                System.out.println("zi method_4");
        }
}
class  DuoTaiDemo4
{
        public static void main(String[] args)
        {
                //此处为父类引用指向子类对象的多态形式
                Fu f = new Zi();
                /*
                多态情况下调用非静态方法的时候是编译时看左边的引用即父类引用中是否有该方法,
                没有则编译失败,但是如果父类中有该方法,被子类复写后,运行时为子类结果,
                简单而言就是编译时看左边,运行时看右边.
                对于静态方法,静态变量及非静态变量而言,编译和运行都是看父类引用的,也就是说如果
                父类中有该方法或变量,编译则会通过,运行时也是父类中的方法或变量,否则编译失败。
                因此此处的输出语句输出的应为父类中num值,即为5
                */
                System.out.println(f.num);
                /*
                method1方法父类子类中都有,子类复写了父类中的该方法,而对于非静态方法而言,编译
                时看左边,运行时看右边,因此该句调用的应为子类的method1方法
                */
                f.method1();
                /*
                method2方法父类中有,子类中没有复写该方法,因此子类当中默认的还是父类中的method2方法
                对于非静态成员方法而言,编译时看左边,运行时看右边,该句调用的应为子类的method2方法,因为
                没有复写该方法,因此默认是子类的该方法是直接继承自父类的
                */
            f.method2();
                /*
                此处应该编译失败,原因是非静态方法编译时看的是父类引用当中是否有该方法,没有则会编译失败
                如果想调用子类中特有的method3方法,只能通过强制类型转换,即
                Zi z = (Zi)f;
                z.method3();
                */
                f.method3();
                /*
                对于此处的method4,因为为静态方法,编译和运行时都应该看的是左边,即父类中的方法,因此
                此处相当于调用了父类中的method4方法
                */
                f.method4();
        }
}       






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