黑马程序员技术交流社区

标题: 类继承时函数覆盖,毕老师说静态覆盖静态没有意义?why? [打印本页]

作者: 一只玉米    时间: 2015-5-5 17:35
标题: 类继承时函数覆盖,毕老师说静态覆盖静态没有意义?why?
如题,子类覆盖父类静态方法时,毕老师说静态覆盖静态没有意义?为什么?例:

class Fu
{
  public static void method()
        {
         System.out.print("我是父类中的方法");
        }
}
class Zi extends Fu
{
        public static void method()
        {
         System.out.print("我是子类中的方法");
        }
}
class M
{
        public static void main(String[] args)
        {
         Zi z=new Zi();
         z.method();
        }
}


运行结果:我是子类中的方法,覆盖成功了。

作者: ZSMAN    时间: 2015-5-5 18:11
静态方法直接调用就行了:Zi.method();Fu.method()。这两个函数都能被外部直接调用,覆盖了也没用~
作者: ZSMAN    时间: 2015-5-5 18:18
重写是为了屏蔽父类的方法,静态能使外部直接调用父类方法,所以静态覆盖静态没有意义~这是我的理解~~
作者: fantacyleo    时间: 2015-5-5 18:21
静态函数不能被覆盖,只能被隐藏。不能被覆盖,意味着静态函数不参与多态判断。引用变量类型是什么,就调用那个类型的方法,不会在运行时根据实际引用的对象进行动态绑定
作者: 15059320049    时间: 2015-5-5 18:54
本帖最后由 15059320049 于 2015-5-5 22:49 编辑

前面几楼说的正确,我从内存上分析下,静态方法是存储在方法区中,在方法区中父类和子类各自都有这个方法的引用,别的类调用不到,这能多态吗?你把主函数里的代码改成这样  Fu z = new Zi();  z.method();  按照多态的结果打印“我是子类中的方法”,实际打印“我是父类中的方法”。所以说覆盖了有意义吗?不能实现多态,静态方法。可以知道用类对象调用:Zi.method().

总结下: 对于覆盖有3种不能构成覆盖 1 方法是静态方法 2 被private修饰 3 被final修饰

作者: 一只玉米    时间: 2015-5-5 21:32
ZSMAN 发表于 2015-5-5 18:18
重写是为了屏蔽父类的方法,静态能使外部直接调用父类方法,所以静态覆盖静态没有意义~这是我的理解~~ ...

非静态时,外部也可以用new Fu() 对象来调用啊
作者: 一只玉米    时间: 2015-5-5 21:33
fantacyleo 发表于 2015-5-5 18:21
静态函数不能被覆盖,只能被隐藏。不能被覆盖,意味着静态函数不参与多态判断。引用变量类型是什么,就调用 ...

不太懂,和多态有关系么?
作者: 一只玉米    时间: 2015-5-5 21:36
15059320049 发表于 2015-5-5 18:54
前面几楼说的正确,我从内存上分析下,静态方法是存储在方法区中,在方法区中父类和子类各自都有这个方法的 ...

和多态有关系?当时毕老师还没讲多态呢。还有 静态可以覆盖静态。
作者: ZSMAN    时间: 2015-5-5 21:44
一只玉米 发表于 2015-5-5 21:32
非静态时,外部也可以用new Fu() 对象来调用啊

试试这个:  
Fu z=new Zi();
         z.method();
作者: ZSMAN    时间: 2015-5-5 21:47
一只玉米 发表于 2015-5-5 21:32
非静态时,外部也可以用new Fu() 对象来调用啊

如果覆盖成功,  
Fu z=new Zi();
         z.method();
这个结果应该是执行子类中的函数~
作者: 一只玉米    时间: 2015-5-5 22:10
ZSMAN 发表于 2015-5-5 21:47
如果覆盖成功,  
Fu z=new Zi();
         z.method();

是,执行子类的方法。但是 。。。又能说明什么,还有为啥都往多态上联想呢
作者: as12510    时间: 2015-5-5 22:20
父类和子类中的静态方法分别可以通过类名调用,严格意义上来讲,静态的不算重写,因为静态是在方法区的静态区域。不会被覆盖掉
作者: ZSMAN    时间: 2015-5-5 22:24
一只玉米 发表于 2015-5-5 22:10
是,执行子类的方法。但是 。。。又能说明什么,还有为啥都往多态上联想呢 ...

Fu z=new Zi();
         z.method();
这个结果你看了吗?它的结果是执行了父类的方法~你觉得覆盖成功了,实际上没有啊~覆盖是多态的基础。以上是个人的理解,如果还不明白可以看看这个:http://bbs.csdn.net/topics/50433622
作者: 15059320049    时间: 2015-5-5 22:47
一只玉米 发表于 2015-5-5 21:36
和多态有关系?当时毕老师还没讲多态呢。还有 静态可以覆盖静态。

可以覆盖,看我说的就知道没意义了。因为不能实现多态
作者: 一只玉米    时间: 2015-5-5 23:35
15059320049 发表于 2015-5-5 22:47
可以覆盖,看我说的就知道没意义了。因为不能实现多态

谢谢,我再想想
作者: 一只玉米    时间: 2015-5-5 23:36
ZSMAN 发表于 2015-5-5 22:24
Fu z=new Zi();
         z.method();
这个结果你看了吗?它的结果是执行了父类的方法~你觉得覆盖成功了 ...

谢谢,我再想想
作者: 一只玉米    时间: 2015-5-5 23:37
as12510 发表于 2015-5-5 22:20
父类和子类中的静态方法分别可以通过类名调用,严格意义上来讲,静态的不算重写,因为静态是在方法区的静态 ...

谢谢,我再想想
作者: 苟苟    时间: 2015-5-6 00:14
路过,涨姿势了
作者: hufu4635    时间: 2015-5-6 08:11
本帖最后由 hufu4635 于 2015-5-6 08:20 编辑

这个不是覆盖成功了,这个的意思相当于,子类实际上写了一个新的方法,重写只适用于实例方法的,不能用于静态方法。

下面的图的运行结果可以明显看出来父类被覆盖了,如果把子父类的方法都改成静态的,可以发现,当我们调用show方法的时候结果明显改变了。
这充分证明了,父类的方法并没有被重写。

QQ图片20150506081706.png (178.68 KB, 下载次数: 23)

QQ图片20150506081706.png

1.png (130.97 KB, 下载次数: 27)

1.png

作者: 一只玉米    时间: 2015-5-6 08:41
hufu4635 发表于 2015-5-6 08:11
这个不是覆盖成功了,这个的意思相当于,子类实际上写了一个新的方法,重写只适用于实例方法的,不能用于静 ...

恩,谢谢
作者: 一只玉米    时间: 2015-5-6 08:42
问题已解决,结贴了,勿回复!!!




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