方法重写——C#与java
本文关键字:java 方法 重写 | 更新日期: 2023-09-27 17:57:40
Java中的方法重写原理与C#不同吗?我在c#工作,现在被要求用java调试一段代码。
这只是为了澄清我的概念。我有一个代码覆盖了c#中的方法。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
namespace ConsoleApplication1
{
public class A
{
public void Food()
{
Console.Write("1");
}
}
public class B : A
{
public void Food()
{
Console.Write("2");
}
}
public class program
{
static void Main(string[] args)
{
A a = new B();
a.Food();
Console.ReadLine();
}
}
}
OUTPUT-1(毫无疑问)(在C#中),但当我在java中执行相同的代码时,我得到的结果是"2"。只是想知道原因,因为压倒一切的原则在语言上是不同的。对不起,我没有java方面的经验。
感谢
在C#中,如果要使方法可重写,则必须在超类中使用关键字virtual
。看看您的示例,如果您将virtual
添加到类A
中的方法Food
中,则输出将是2
而不是1
:
public class A
{
public virtual void Food()
{
Console.Write("1");
}
}
在Java中,没有virtual
关键字。方法自动为virtual
。在Java中,没有办法使方法成为非虚拟的,从而获得与C#相同的行为。
其他信息,基于您的示例
A a = new B()
a.Food();
被调用的Foo
方法是A
类内部的方法。
如果我改变了我使用的类型,
B a = new B()
a.Food();
因此,在这种情况下,现在调用的方法是类B
的Foo
方法。
因此,并不是所有时候,一个超类的方法都有更高的优先级,它只取决于你用哪种类型来声明一个对象。
所以,和已接受的答案一样,您需要一个virtual
关键字来允许在C#中重写方法。最好在派生类中指定override
方法。
public class A
{
public virtual void Food()
{
Console.Write("1");
}
}
public class B : A
{
public override void Food()
{
Console.Write("2");
}
}
那么,如果我有另一个继承派生类的类呢?(第三级继承)
public class C : B
{
public override void Food()
{
Console.Write("2");
}
}
因此,无需将B
设置为虚拟,只需在最深层指定override关键字即可。