当前位置: 首页 > 面试题库 >

Java重载与覆盖

马业
2023-03-14
问题内容

嗨,我只是想确保我正确理解这些概念。Java中的重载意味着您​​可以拥有具有不同数量的参数或不同数据类型的构造函数或方法。即

public void setValue(){
   this.value = 0;
}
public void setValue(int v){
   this.value = v;
}

这个方法怎么样?由于它返回不同的数据类型,是否仍会被视为重载?

public int setValue(){
   return this.value;
}

第二个问题是:java中有什么重载?它与继承有关吗?让我们有以下内容:

public class Vehicle{
  double basePrice = 20000;
  //constructor defined
  public double getPrice(){
     return basePrice;
   }
}

public class Truck extends Vehicle{
  double truckPrice = 14000;
  //constructor defined
  public double getPrice(){
     return truckPrice;
   }
}

所以现在让我说以下

Truck truck = new Truck();

如果我打电话

truck.super.getPrice()

这将返回车辆类的价格20,000

如果我打电话

truck.getPrice()

这将返回卡车级别的价格14,000

我的知识对两个问题都正确吗?


问题答案:

您基本上是正确的。重载在单个类中具有多个方法,其中方法具有相同的名称。但是,返回值不被视为方法 签名
的一部分。因此,不能通过仅更改返回值来重载方法。您的示例中不能包含以下代码:

public void setValue() {
   this.value = 0;
}

public int setValue() {
   return this.value;
}

这将无法编译。

正如罗布(Rob)所指出的,我相信您的意思是 压倒一切(override) ,并且您有正确的说法。请注意,您不能更改返回类型。从Java
5开始,您可以返回基类方法返回的内容的派生类型。在Java 5之前,它必须是相同的类型。也就是说,在Java 5及更高版本之前,您不能执行以下操作:

public class AnimalNoise {}
public class Miaw extends AnimalNoise {}

public class Animal {
    public AnimalNoise makeNoise() {
        return new AnimalNoise();
    }
}

public class Cat extends Animal {
    public Miaw makeNoise() {
        return new Miaw ();
    }
}

但是,即使在Java 5和更高版本中,您 也无法 执行以下操作:

public class Animal {
    public String makeNoise() {
        return "silence";
    }
}

public class Cat extends Animal {
    public Miaw makeNoise() {
        return new Miaw ();
    }
}
public class Miaw {}

最后,经常被忽略的重载和覆盖之间的巨大差异是,重载是在编译时确定的,而重载是在运行时确定的。当他们期望在运行时确定重载时,这使许多人感到惊讶。



 类似资料:
  • 问题内容: 假设我在课堂上说两种方法 和 那是什么感觉 重载还是重载? 问题答案: 重载是指两个或多个具有相同名称但参数不同的方法,就像您的示例一样。重载是从接口或抽象类实现一个方法的,因此超类中的方法具有实现,而子类中的方法具有不同的实现,它们仍然具有相同的方法名称和参数。

  • 问题内容: 我的域中有FinanceRequests和CommisionTransactions。如果我有一个FinanceRequests列表,则每个FinanceRequest可能包含多个需要撤回的CommisionTransactions。不用担心这是怎么做到的。 下面的类(非常底层)使我感到模糊不清,因为它简洁,可以很好地重用现有代码。一个问题类型擦除。 它们在擦除后具有相同的签名,即:

  • 问题内容: 阅读:Joshua Bloch撰写的有效Java-第二版 第8项-在覆盖等于时遵守总合同: 程序员编写看起来像这样的equals方法,然后花很多时间迷惑它为什么不能正常工作的情况并不少见: [代码示例在这里] 问题在于此方法不会覆盖Object.equals,后者的参数类型为Object,而是将其重载。 代码样例: 我的问题: 为什么像此代码示例中那样重载的强类型equals方法不够用

  • 重载-同一类中具有不同签名的同一方法 如果我在父类中有一个重载方法,那么子类会重载或重写这个特定的方法吗?

  • 本文向大家介绍解析Java继承中方法的覆盖和重载,包括了解析Java继承中方法的覆盖和重载的使用技巧和注意事项,需要的朋友参考一下 方法的覆盖 在类继承中,子类可以修改从父类继承来的方法,也就是说子类能创建一个与父类方法有不同功能的方法,但具有相同的名称、返回值类型、参数列表。   如果在新类中定义一个方法,其名称、返回值类型和参数列表正好与父类中的相同,那么,新方法被称做覆盖旧方法。   参数列

  • 所有四种自增和自减运算符(即前置和后置的自增及自减运算符)都可以被重载。本节介绍编译器如何识别前置和后置的自增及自减运算符。 要重载既能允许前置又能允许后置的自增运算符,每个重载的运算符函数必须有一个明确的特征以使编译器能确定要使用的++版本。重载前置++的方法与重载其他前置一元运算符一样。 例如,假设要给 Date 对象 d1 增加一天,当编译器遇到前置自增表达式: ++d1 编译器就会生成成员