黑马程序员技术交流社区

标题: 为什么不能这个调用父类 [打印本页]

作者: 高鑫    时间: 2012-5-4 03:23
标题: 为什么不能这个调用父类
  1. class Fu
  2. {
  3.         static void show()
  4.         {
  5.                 System.out.println("fu show run");
  6.         }
  7. }
  8. class Zi extends Fu
  9. {
  10.           void show()
  11.         {
  12.                 System.out.println("zi show run");
  13.         }
  14. }

  15. class  ExtendsDemo3
  16. {
  17.         public static void main(String[] args)
  18.         {
  19.         Zi z = new Zi();
  20.         Fu.show();  //Fu.show();错在哪了?
  21. }
  22. }
复制代码
这道题提示 错误: Zi中的show()无法覆盖Fu中的show(),我知道写z.show();是对的,可为什么Fu.show();错了呢?
作者: 赵玮_Tom    时间: 2012-5-4 06:19
本帖最后由 赵玮_Tom 于 2012-5-4 06:21 编辑

因为静态方法只能覆盖静态方法。创建子类对象时,会先加载父类,父类中有一个函数名称为show、返回值为void的空参函数(子父类中判断覆写是根据方法名称和函数列表以及返回值的,方法名称和函数列表以及返回值都相同,认为这两个方法形成覆盖关系)而毕老师视频中曾经讲过,静态方法只能覆盖静态方法,而父类中是静态方法,子类中是非静态,所以编译报错。
作者: 一生一世    时间: 2012-5-4 07:08
同学,你仔细看一下,你这是覆盖父类中的方法吗?你这可是赤裸裸的陪着覆盖外衣的定义子类特有的方法呀,就像上面所有的那样,子类覆盖父类的方法要求子类中的方法必须要和父类中的方法名,返回值类型以及参数列表一样,才行呀,还有就是子类中覆盖父类的方法时权限一定要比父类中的方法的权限要大,所以jvm才会告诉你,你这根本就不叫重写,你这叫子类中的自定义方法
作者: 于清云    时间: 2012-5-4 08:32
本帖最后由 于清云 于 2012-5-4 08:36 编辑

同学,你Fu.show();没错,类中的静态方法可以通过类名.方法名来调用,但是你这的代码编译时候会报错:

如果,你想在main方法内部直接通过类名来调用show方法,那么你必须在子类中把show设置成静态方法,如下:
class Fu

{

        static void show()

        {

                System.out.println("fu show run");

        }

}

class Zi extends Fu

{

          static void show()

        {

                System.out.println("zi show run");

        }

}


class  ExtendsDemo3

{

        public static void main(String[] args)
        {

        Zi z = new Zi();

        Fu.show();  
}

}

360截图20120504082156410.jpg (8.82 KB, 下载次数: 67)

360截图20120504082156410.jpg

作者: 张成龙    时间: 2012-5-4 08:46
只有静态方法才能覆盖静态方法
作者: 壹氧化碳    时间: 2012-5-4 09:06
父类中有个静态方法,子类要重写覆盖
作者: 韩新凯    时间: 2012-5-4 10:07
静态只能覆盖静态
作者: wang耀雨    时间: 2012-5-4 12:05
Zi继承Fu,Fu中show为静态方法,Zi中为非晶态方法,非静态不能覆盖静态、内存机制都不一样,所以编译失败。但是静态只能覆盖静态。
在主函数(主函数也是静态)中用类名直接调用静态方法天经地义,Fu.show();没错。
作者: 崔仁军    时间: 2012-5-4 12:39
1   static  修饰方法:static  修饰的方法叫做静态方法。对于静态方法来说,可以使用类名.方法名的方式来访问, 静态方法只能继承,不能重写(Override )。
class Fu
{
          void show()
         {
                 System.out.println("fu show run");
         }
}
class Zi extends Fu
{
           void show()
         {
                 System.out.println("zi show run");
         }
}
class  ExtendsDemo3
{
         public static void main(String[] args)
        {
               Zi z = new Zi();
               Fu.show();  //在这如果要调用子类的方法就把父类的static去掉
}
}




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