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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邱俊杰 中级黑马   /  2012-4-11 18:01  /  2310 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

8 个回复

倒序浏览
f是父类Fu的引用指向了子类Zi的对象,而父类中没有method3()这个方法,这是子类中特有的方法,所以对于f这个属于父类类型的引用在父类中找不到这个方法,不能直接调用,要调用只能将f这个引用强制转换成子类类型的引用,这样才能调用method3方法。

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
1.  对于静态的属性和方法,属于类成员,用类名直接调用就是了。实际上:当通过对象来访问类属性的时候,系统会在底层转换为通过该类来访问类属性。
2.多态的问题。子类继承了父类,父类类型可以指向子类对象。这样父类能调用它们公共的方法,但是你这个父类中没有method3()这个方法,在编译时期会在父类中找这个方法,找不到,所以报错。多态时,如果想调用子类特有的方法,需要转型
3.静态方法的问题。在继承中,同名的静态方法会被隐藏。如果需要访问父类中被隐藏的实例变量,需要用到super 关键字。----->关于这一点,是论坛中同学总结的。嘻嘻
你的代码有以上这三个问题。
回复 使用道具 举报
在毕老师的视频已经提到,在多态中,子类继承了父类,但是父类中没有method3()这个方法,在编译时期会在父类中找这个方法,找不到,所以报错。
回复 使用道具 举报
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();
回复 使用道具 举报
多态的我引用。子类转换成父类。父类中的方法都可以调用。
如果需要调用子类的方法。需要强转子类。

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

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1 很给力!

查看全部评分

回复 使用道具 举报
李哲 中级黑马 2012-4-11 18:50:11
7#
Fu f = new Zi()这种形式,f中只有那些“已经覆盖父类方法”的方法才可以被调用。
回复 使用道具 举报
常万 中级黑马 2012-4-11 20:47:27
8#
邓斌 发表于 2012-4-11 18:44
多态的我引用。子类转换成父类。父类中的方法都可以调用。
如果需要调用子类的方法。需要强转子类。

这哥们精辟;P毕老师的视频听的很认真呢
回复 使用道具 举报
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");
    }
}
注:这个问题这两天多次出现,强制转换容易混淆,你就记住父亲在上,向上不用特意转型,因为你从父亲那里遗传下来的。向下要特意转型,因为自然界中遗传不能逆转,只能人为转换。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马