加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 00:09:19 所属栏目:Java 来源:网络整理
导读:1)为什么以下代码不同. C#: class Base{ public void foo() { System.Console.WriteLine("base"); }}class Derived : Base{ static void Main(string[] args) { Base b = new Base(); b.foo(); b = new Derived(); b.foo(); } public new void foo() { Syst
1)为什么以下代码不同.

C#:

class Base
{
  public void foo()
  {
     System.Console.WriteLine("base");
  }
}

class Derived : Base
{
  static void Main(string[] args)
  {
    Base b = new Base();
    b.foo();
    b = new Derived();
    b.foo();
  }
  public new void foo()
  {
    System.Console.WriteLine("derived");
  }
}

Java的:

class Base {
  public void foo() {
    System.out.println("Base");
  }  
}

class Derived extends Base {
  public void foo() {
    System.out.println("Derived");
  }

  public static void main(String []s) {
    Base b = new Base();
    b.foo();
    b = new Derived();
    b.foo();
  }
}

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

解决方法

原因是在Java中,默认情况下方法是虚拟的.在C#中,必须明确标记虚拟方法.
以下C#代码等同于Java代码 – 请注意在基类中使用virtual并在派生类中重写:
class Base
{
    public virtual void foo()
    {
        System.Console.WriteLine("base");
    }
}

class Derived
    : Base
{
    static void Main(string[] args)
    {
        Base b = new Base();
        b.foo();
        b = new Derived();
        b.foo();

    }

    public override void foo()
    {
        System.Console.WriteLine("derived");
    }
}

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

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读