黑马程序员技术交流社区

标题: 多态问题、、、高手looklook~ [打印本页]

作者: 邱俊杰    时间: 2012-4-11 18:01
标题: 多态问题、、、高手looklook~
  1. public class DuoTai_3
  2. {
  3.         /**
  4.          * @param args
  5.          */
  6.         public static void main(String[] args)
  7.         {
  8.                 Fu f = new Zi();
  9.                
  10.                 f.method1();
  11.                 f.method2();
  12.                 //f.method3();     [color=Red]为什么这个调用不了?子类不是继承了父类的了么?[/color]
  13.                 f.method4();
  14.                
  15.                

  16.         }
  17. }

  18. class Fu
  19. {
  20.         static int num = 5;
  21.         void method1()
  22.         {
  23.                 System.out.println("fu method_1");
  24.         }
  25.         void method2()
  26.         {
  27.                 System.out.println("fu method_2_"+num);
  28.         }
  29.         static void method4()
  30.         {
  31.                 System.out.println("fu method_4");
  32.         }
  33. }


  34. class Zi extends Fu
  35. {
  36.         static int num = 8;
  37.         void method1()
  38.         {
  39.                 System.out.println("zi method_1_"+num);
  40.         }
  41.        
  42.         void method3()
  43.         {
  44.                 System.out.println("zi method_3");
  45.         }

  46.         static void method4()
  47.         {
  48.                 System.out.println("zi method_4");
  49.         }
  50. }
复制代码

作者: 尹博    时间: 2012-4-11 18:08
f是父类Fu的引用指向了子类Zi的对象,而父类中没有method3()这个方法,这是子类中特有的方法,所以对于f这个属于父类类型的引用在父类中找不到这个方法,不能直接调用,要调用只能将f这个引用强制转换成子类类型的引用,这样才能调用method3方法。
作者: 李敏    时间: 2012-4-11 18:20
1.  对于静态的属性和方法,属于类成员,用类名直接调用就是了。实际上:当通过对象来访问类属性的时候,系统会在底层转换为通过该类来访问类属性。
2.多态的问题。子类继承了父类,父类类型可以指向子类对象。这样父类能调用它们公共的方法,但是你这个父类中没有method3()这个方法,在编译时期会在父类中找这个方法,找不到,所以报错。多态时,如果想调用子类特有的方法,需要转型
3.静态方法的问题。在继承中,同名的静态方法会被隐藏。如果需要访问父类中被隐藏的实例变量,需要用到super 关键字。----->关于这一点,是论坛中同学总结的。嘻嘻
你的代码有以上这三个问题。
作者: 程小龙    时间: 2012-4-11 18:25
在毕老师的视频已经提到,在多态中,子类继承了父类,但是父类中没有method3()这个方法,在编译时期会在父类中找这个方法,找不到,所以报错。
作者: 莫运飞    时间: 2012-4-11 18:31
class DuoTai_3
{
        
        public static void main(String[] args)
        {
               Zi f = new Zi();               
                f.method1();
                f.method2();
               f.method3();    // 为什么这个调用不了?子类不是继承了父类的了么?
                f.method4();
               
       }
}
class Fu
{
        static int num = 5;
        void method1()
        {
                System.out.println("fu method_1");
        void method2()
        {
                System.out.println("fu method_2_"+num);
        }
        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_"+num);
        }
        
        void method3()
        {
                System.out.println("zi method_3");
        }

        static void method4()
        {
                System.out.println("zi method_4");
        }
}


你创建的是父类的对象,父类又没有method3(); 编译会报错的。你重新创建对象就可以调用了 Zi f = new Zi();

作者: 邓斌    时间: 2012-4-11 18:44
多态的我引用。子类转换成父类。父类中的方法都可以调用。
如果需要调用子类的方法。需要强转子类。

儿子可以假扮成老子。继承老子的功能。
假扮老子的儿子要想用自己特有功能,而老子没有的。需要卸妆后才能调用本有的。

作者: 李哲    时间: 2012-4-11 18:50
Fu f = new Zi()这种形式,f中只有那些“已经覆盖父类方法”的方法才可以被调用。
作者: 常万    时间: 2012-4-11 20:47
邓斌 发表于 2012-4-11 18:44
多态的我引用。子类转换成父类。父类中的方法都可以调用。
如果需要调用子类的方法。需要强转子类。

这哥们精辟;P毕老师的视频听的很认真呢
作者: 姜志钦    时间: 2012-4-11 21:02
class DuoTai_3
{
    /**
     * @param args
     */
    public static void main(String[] args)
    {
        Fu f = new Zi();

        f.method1();
        f.method2();
        
            ((Zi) f).method3();   //这样就可以了 ,如上面所说声明父类创建子类,子类独有的方法需要向下转型父类(强制转换);
        //f.method3();     为什么这个调用不了?子类不是继承了父类的了么?
        f.method4();      



    }
}

class Fu
{
    static int num = 5;
    void method1()
    {
        System.out.println("fu method_1");
    }
    void method2()
    {
        System.out.println("fu method_2_"+num);
    }
    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_"+num);
    }

    void method3()
    {
        System.out.println("zi method_3");
    }

    static void method4()
    {
        System.out.println("zi method_4");
    }
}
注:这个问题这两天多次出现,强制转换容易混淆,你就记住父亲在上,向上不用特意转型,因为你从父亲那里遗传下来的。向下要特意转型,因为自然界中遗传不能逆转,只能人为转换。




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