【问题标题】:Overload an overridden, inherited method重载重写的继承方法
【发布时间】:2025-12-06 15:55:01
【问题描述】:

假设我的 A 类和 B 类继承自 A。我想重写方法 public void print(),它应该可以正常工作。

但是是否有可能在B中重载public void print(),但是这次没有在A类中声明方法而带一个参数?

abstract class A {
    String name;
    public void print();
}

class B extends A {
    @Override
    public void print() {
        System.out.println("Hello"); // Works just fine
    }

    public void print(String s) {
        System.out.println("Hello" + s); // Doesn't work when calling it, as it must be declared in A
    }
}

【问题讨论】:

  • 没有。这称为重载,与继承无关。无论如何,用需要参数的方法覆盖无参数方法,它会如何工作?
  • 为什么要覆盖super中不存在的方法?只需简单地声明它。你要做的是命名重载,同名,不同参数。
  • @Gendarme 你是对的,对不起。重载就是我的意思。但是是否可以重载方法 print() 而不在 A 中声明它 print(string s)?
  • 有可能重载 print(),你已经做到了。你把它称为B bb = new B(); -> bb.print("text");
  • 要做到这一点,你需要做((B)obj).print("there");。因为A obj = new B() 意味着您的对象类型将是AB 的实例,您需要告诉编译器尝试将其转换为B 并使用强制转换(B)obj。 P.S.:我不太好解释这个。如果有人认为我错了,请纠正我。

标签: java class inheritance overriding


【解决方案1】:

是的,可以在 B 中使用参数重载 public void print() 而无需在 A 类中声明方法。但是您必须将抽象类定义为:

abstract class A
{
String name;
public abstract void print();
}

一个抽象类可以有抽象方法也可以有普通方法。当您声明普通方法时,您还必须为该方法提供实现。否则你必须用抽象关键字声明该方法(否则你会得到编译错误),即不需要给出实现。在您的情况下,您必须使用上面提到的 abstract 关键字声明 printf() 方法。当您扩展类 A 然后在类 B 中时,您必须提供 printf() 方法的实现,该方法在类 A 中是抽象的,称为方法覆盖。除此之外,您可以使用任何参数定义 printf() 方法,这称为方法重载。但是您只能使用 B 类对象访问这两种方法,因为抽象类不能被实例化,而只能被继承。请参考以下代码:

abstract class A
{
String name;
public abstract void print();
}
class B extends A
{
@Override
public void print(){
System.out.println("Hello");
}
//Overloaded method with String parameter
public void print(String s){
System.out.println("Hello" + s);
}
public static void main(String[] args){
new B().print();//calling inherited method with class B object
new B().print("Bishal");//calling overloaded method with class B object
}
}

【讨论】:

    【解决方案2】:

    这很好。它被认为是重载方法,这是java中的常见做法。您只需要在 A 类抽象中声明 print() 方法,例如:

    public abstract class A 
    {
    String name;
    public abstract void print();
    }
    

    【讨论】:

    • 您似乎没有理解这个问题。这没有回答。
    最近更新 更多