为什么Java和C#在oops方面有所不同?

前端之家收集整理的这篇文章主要介绍了为什么Java和C#在oops方面有所不同?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
1)为什么以下代码不同.

C#:

  1. class Base
  2. {
  3. public void foo()
  4. {
  5. System.Console.WriteLine("base");
  6. }
  7. }
  8.  
  9. class Derived : Base
  10. {
  11. static void Main(string[] args)
  12. {
  13. Base b = new Base();
  14. b.foo();
  15. b = new Derived();
  16. b.foo();
  17. }
  18. public new void foo()
  19. {
  20. System.Console.WriteLine("derived");
  21. }
  22. }

Java的:

  1. class Base {
  2. public void foo() {
  3. System.out.println("Base");
  4. }
  5. }
  6.  
  7. class Derived extends Base {
  8. public void foo() {
  9. System.out.println("Derived");
  10. }
  11.  
  12. public static void main(String []s) {
  13. Base b = new Base();
  14. b.foo();
  15. b = new Derived();
  16. b.foo();
  17. }
  18. }

2)当从一种语言迁移到另一种语言时,我们需要确保顺利过渡.

解决方法

原因是在Java中,默认情况下方法是虚拟的.在C#中,必须明确标记虚拟方法.
以下C#代码等同于Java代码 – 请注意在基类中使用virtual并在派生类中重写:
  1. class Base
  2. {
  3. public virtual void foo()
  4. {
  5. System.Console.WriteLine("base");
  6. }
  7. }
  8.  
  9. class Derived
  10. : Base
  11. {
  12. static void Main(string[] args)
  13. {
  14. Base b = new Base();
  15. b.foo();
  16. b = new Derived();
  17. b.foo();
  18.  
  19. }
  20.  
  21. public override void foo()
  22. {
  23. System.Console.WriteLine("derived");
  24. }
  25. }

您发布的C#代码隐藏了Derived类中的方法foo.这是您通常不想做的事情,因为它会导致继承问题.

使用您发布的类,以下代码输出不同的内容,尽管它始终是相同的实例:

  1. Base b = new Derived();
  2. b.foo(); // writes "base"
  3. ((Derived)b).foo(); // writes "derived"

我在上面提供的固定代码将在两种情况下输出“派生”.

猜你在找的Java相关文章