`
experience
  • 浏览: 198538 次
社区版块
存档分类
最新评论

重写方法不被认为是在类上声明的

阅读更多

 

当在类中指定方法时,如果有多个方法与调用兼容(例如,存在两种同名的方法,并且其参数与传递的参数兼容),则 C# 编译器将选择最佳方法进行调用。下面的方法将是兼容的:

C#

复制代码

public class Derived : Base
{
public override void DoWork(int param) { }
public void DoWork(double param) { }
}

Derived 的一个实例中调用 DoWork 时,C# 编译器将首先尝试使该调用与最初在 Derived 上声明的 DoWork 版本兼容。重写方法不被视为是在类上进行声明的,而是在基类上声明的方法的新实现。仅当 C# 编译器无法将方法调用与 Derived 上的原始方法匹配时,它才尝试将该调用与具有相同名称和兼容参数的重写方法匹配。例如:

C#

复制代码

int val = 5;
Derived d = new Derived();
d.DoWork(val);  // Calls DoWork(double).

由于变量 val 可以隐式转换为 double 类型,因此 C# 编译器将调用 DoWork(double),而不是 DoWork(int)。有两种方法可以避免此情况。首先,避免将新方法声明为与虚方法同名。其次,可以通过将 Derived 的实例强制转换为 Base 来使 C# 编译器搜索基类方法列表,从而使其调用虚方法。由于是虚方法,因此将调用 Derived 上的 DoWork(int) 的实现。例如:

C#

复制代码

((Base)d).DoWork(val);  // Calls DoWork(int) on Derived.
分享到:
评论

相关推荐

    重载重写、接口、抽象类、String指针和字符串拼接、异常catch、throw、throws、字符流和字节流

    2. **方法重写**:子类中出现的方法如果名称、参数列表与父类中的方法完全相同,则认为是方法重写。重写时,子类方法的返回类型必须与父类方法兼容或更具体,权限修饰符不能更低。 3. **包管理**:Java使用包来组织...

    软件编程词汇表(一些编程词汇的解释)

    方法是类中定义的功能单元,用于实现特定的行为。方法可以接受参数,并返回结果。在Java中,方法定义通常包括返回类型、方法名、参数列表和方法体。 #### 50. 方法局部变量 (Method Local Variables) 方法局部变量...

    final变量.

    在某些情况下,`final`是必需的,例如在方法中的匿名内部类中,需要传递一个不可变的参数。`final`变量可以确保在内部类中引用外部类的变量时,该变量的值不会在内部类中被意外修改。 3. **使用方法**: - **修饰...

    JAVA继承_接口_抽象类等练习.doc

    根据提供的文档信息,我们可以总结并深入探讨以下几个关键的Java知识点: ### 1. 方法重载(Overloading) **概念:** 方法重载是指在一...这是因为`final`修饰的方法不能被子类重写,这确保了方法的行为不会被改变。

    2023年Java面向对象知识测试A卷答案.doc

    描述中指出,错误的是C选项:父类中被`private`权限修饰的方法不能被子类重写,因为`private`方法在子类中不可见。子类方法的权限必须至少等于父类中被重写方法的权限,且子类重写接口中的方法必须是`public`的,...

    Java面向对象知识测试--A卷-答案.doc

    描述中提到的错误选项C指出,父类中被`private`权限修饰的方法可以被子类重写,这是不正确的。Java中,`private`方法不能被子类访问,因此也就无法重写。正确的是,子类要重写父类方法,该方法在父类中必须是`public...

    final关键字详细解读

    在实际开发中,如果设计的类不需要有子类,或者设计者认为此类已经足够完美,不应该被继承和修改,那么可以使用final来修饰此类。 2. final修饰成员变量:当final修饰成员变量时,该变量变成常量。final常量的命名...

    java 接口 类 继承 多态的简单实例

    在Java中,只有标记为`@Override`的方法才被认为是重写,这样可以避免因命名冲突而错误地覆盖其他方法。 在这个实例中,所有创建的类都将实现两个接口,这将展示如何通过接口实现多态性。同时,为了进一步展示Java...

    java面试宝典

    - `final`:用于声明不可变的变量、不可继承的类或不可重写的变量。 - `finally`:异常处理中用于确保某个代码块一定会被执行。 - `finalize`:对象被垃圾回收前可以被调用的方法,用于释放资源。 **1.40 运行时...

    c++课件\钱能C++程序设计教程(第二版)课件\13 抽象类.ppt

    设置纯虚函数的目的是防止抽象类被实例化,因为抽象类仅用于提供继承结构,不允许创建对象。这样可以确保只有具体类才能创建对象,从而保证了代码的安全性和设计的合理性。 【抽象类与具体类】的区别在于,抽象类不...

    多态的实现原理.docx

    如果子类重写了父类的方法,它们共享同一个方法表项,被认为是父类的方法。 方法表中只包含非私有的实例方法,不包括静态方法。因为静态方法与对象无关,可以直接通过类名调用,而实例方法需要通过对象引用间接调用...

    SCJP考题中的陷阱

    26. **声明不能被标记**:Java中,不能在声明上添加标签。 27. **continue必须在循环中**:continue只能在for、do、while循环中使用,不能在switch的case语句中。 28. **原始数组类型之间不能相互赋值**:尽管原始...

    Java常考面试题

    static方法跟类的任何实例都不相关,所以概念上不适用。 Java支持的数据类型有八种基本数据类型:byte、short、int、long、float、double、boolean、char。自动装箱是Java编译器在基本数据类型和对应的对象包装类型...

    corejava_面试题

    equals方法是Object类中的方法,用于比较两个对象的内容是否相等,但是需要在子类中重写此方法,比如String类已经重写了equals方法来比较两个字符串的内容。 11. 静态变量和实例变量的区别? 静态变量属于类,所有...

    Java基础阶段测试(含答案解析).doc

    6. 构造函数:构造函数是类的一个特殊方法,用于初始化新创建的对象,其名字与类名相同,没有返回类型,正确的声明是`A(int x){...}`。 7. 类的继承:Java中类间的继承关系是单继承,即一个子类只能继承一个父类。 ...

    Java面试宝典2017

    final用于声明一个不能被继承的类、不能被重写的成员方法或不可修改的变量。finally用于try-catch结构中确保资源的释放。finalize是Object类的一个方法,用于垃圾回收时清理资源。 40. 运行时异常...

    Java基础阶段测试(含答案) (2).pdf

    5. **final关键字**:final可以修饰类、变量和方法,修饰的变量一旦赋值后不可改变,修饰的类不能被继承,修饰的方法不能被重写。 6. **抽象类与抽象方法**:abstract关键字用于声明抽象类和抽象方法。抽象方法没有...

Global site tag (gtag.js) - Google Analytics