从理论上讲,Java不支持成员重写,因此我一直在考虑是否可以将此代码段用于重写类的成员。但是,我不太确定此代码在什么情况下可能会失败。我的意思是,如果这一切正常进行,那么它不会被忽视吗?这可能是一个愚蠢的问题,但我真的很想知道这段代码在我无法想到的不同情况下可能会做什么。因此,如果有人可以向我解释它,那将是非常不错的。谢谢!
ClassA { int i = 10; void eat(){ System.out.println(“ A类:进食”); } void bark(){ System.out.println(“ In Class A:Barking”); } } class ClassB扩展了ClassA { // int i = 20; ClassB(){ super.i = 20; //更改A类中i的值。 } void eat(){ System.out.println(“在B类中:进食”); } } 公共类Main { public static void main(String [] args){ ClassB b = new ClassB(); System.out.println(bi); 打 (); b。树皮(); ClassA ua =新的ClassB(); System.out.println(ua.i); ua.eat(); ua.bark(); ClassA a =新的ClassA(); System.out.println(ai); } }
我不太确定这段代码在什么情况下可能会失败。
它(在某种程度上)在人类读者/概念层面上是失败的。
Java语言就是它。这意味着Java程序员知道期望什么,该做什么和不该做什么。
并且是继承的基本规则之一(在Java中,而且在一般情况下):您对超级类的字段非常谨慎。成员字段应被视为类的内部实现细节。您不会将其暴露给外部世界。除非有充分的理由,否则不要将其公开给子班。而且,如果您真的想在Java中执行此操作,则正确的方法是:protected
对该字段使用关键字。
您的想法基本上是让子类“了解”超类字段,更糟糕的是:在创建时更改“内部状态”。
因此,在现实世界中,此类代码可能会迅速导致各种令人讨厌的惊喜。因为人们在现实世界中也不会想到,一个子类做这样的事情,因此,他们可能会在大型应用程序调试问题时真的惊讶地发现:“我应该是10,为什么20”。
长话短说:您可以做某事并不意味着您应该做。相反,好的编程就是以“标准”的方式做事,这不会令您的读者感到惊讶。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句