2011-11-05 138 views
1

我的一个朋友问我他​​是否可以用Java重写一个静态变量,我很震惊他甚至考虑过这种奇怪的编码方式。然后他解释说,这在PHP中是可行的,我想知道为什么一个好的开发人员应该这样做是否有很好的理由。在我看来,静态成员被认为是阶级成员,并且与对象无关,因此他们与派生阶级无关,但我无法说服他,因为他太天真顽固了。静态后期绑定是否需要重载静态变量?

任何人都可以提出一个很好的论点来反对这件事,或说服我这是一个很酷的功能吗?

+0

你的问题是什么?它是标题中的一个,还是最后一段中的那个? – EJP

回答

1

静态继承没有任何意义。这并不是说这是不可能的,只是你没有从中受益。

对于正常的继承,您可以获得对同一事物拥有不同实现的好处,并且不知道/关心将使用哪个实现。有了静态继承,你没有一个对象可以操作,而且你正在使用类名,所以你不能利用多态性。

例如如果你正在调用Child.someMethod(),那么你被绑定到了孩子的实现上,如果你真的只需要父母,那么你可以改为使用Parent.someMethod()。如果你需要添加一些东西到父实现中,你只需要创建一个Child.someOtherMethod()来调用父对象,然后再做其他事情。静态继承只是语法糖......

0

据我所知,Java中的static关键字用于定义类变量。一个Class变量对于该类的所有对象都有一个实例。所以在Java中你不能重写一个静态变量,这是没有意义的。对一个类中的静态变量所做的任何更改都会传播给另一个类。这是在JAVA中使用静态的东西。

这与它应该在PHP中工作的方式一样(我不是真正的PHP专家),但是如果你的朋友可以提供代码来显示PHP中的静态变量被覆盖,并且变量具有不同于另一个值的值上课,我会很高兴。

+0

PHP中的LSB(http://us2.php.net/lsb)允许静态方法像正常的实例化对象方法一样利用继承。通过我刚刚发布的链接查看示例#2,您将看到B类扩展了A类,并且A类有一个方法test(),但调用代码会直接引用B类; 'B :: test()',但是因为B扩展了A,所以它可以工作。如果你使用的是PHP版本<5.3.x,这将不起作用。这是一个很酷的功能b/c它为您提供了与普通类继承相同的灵活性,但具有静态成员变量和方法。 –