当前位置: 首页 > 知识库问答 >
问题:

子类中的Java方法是否可以与父类中的方法具有相同的签名,但不会导致重写?

魏高邈
2023-03-14

我最近开始学习Java,目前正在研究多态性。考虑下面的代码:

    public class Polygon{
       public static void perimeter( ){
             System.out.print("In Polygon perimeter");
       }
       public void area( ){
             System.out.println("In Polygon area");
       }
       public void sides( ){
             System.out.println("In Polygon sides");
       }
       public void angleSum( ){
             System.out.println("In Polygon angleSum");
       }
  }
  public class Pentagon extends Polygon{
       public static void perimeter( ){
             System.out.println("In Pentagon perimeter");
       }
       public void area( ) {
             System.out.println("In Pentagon area");
       }
       public int sides( ){
              return 5;
       }
       public void angleSum(int x) {
             System.out.println("In Pentagon angleSum");
      }
  }

在执行这段代码时,我发现sides()方法不能被重写。我理解在重写中,方法名和返回类型应该相同,但在本例中返回类型不同。那么,有没有办法执行它而不导致重写,但保持相同的名称和不同的类型?

共有3个答案

程枫
2023-03-14

如我所知,如果您建立继承关系,并且对父类中已存在的方法使用相同的签名,则无法更改返回类型,除非您希望更改作为原始类型实例的类型的返回类型,否则将导致语法错误,因此,您需要更改子类中的方法签名或重写它。假设这是适用的,那么一个子类将有两个具有相同签名的方法,一个是继承的,另一个是显式编写的,因此当您调用它时,JVM将不知道要调用哪个方法,因此这是不适用的。要小心重写一个方法,它应该是一个实例方法和相同的签名和相同的返回类型,或者是一个原始类型的实例和相同的访问修饰符或更强的值,否则会导致语法错误。

袁泰平
2023-03-14

有没有办法执行它而不会导致重写,但保持相同的名称和不同的类型?

仅当父类中的方法声明为private时,才不会发生重写,但方法sides的访问权限非常有限,因此Main中的以下代码将被调用。java类失败:

class Polygon {
    private void sides() {
        System.out.println("In Polygon sides");
    }
}

class Pentagon extends Polygon {
    public int sides() {
        return 5;  // is not aware of `sides` in Polygon
    }
}
Polygon p = new Pentagon();
p.sides(); // -> sides() has private access in Polygon

因此,方法sides仅可用于pentage实例/引用:

Pentagon p = new Pentagon();
System.out.println(p.sides());  // -> 5

如果在具有不同返回类型的两个类中,将方法声明为静态方法,则代码也不会编译:

class Polygon {
    public static void sides() {
        System.out.println("In Polygon sides");
    }    
}

class Pentagon extends Polygon {
    public static int sides() {
        return 5; // sides() in Pentagon cannot hide sides() in Polygon
                  // return type int is not compatible with void
    }
}
华哲茂
2023-03-14

在Java中,方法签名是方法声明的一部分。它是方法名称和参数列表的组合。

当我们在超类和子类中讨论相同的方法签名时,我们讨论的是协变返回类型,所以我们讨论的是重写。

 类似资料:
  • 为什么我的子类方法不重写其父类中相同签名的方法? 我有一个类,它扩展了一个抽象类,后者扩展了抽象类Actor(这里的上下文是一个pong游戏)。和都有一个具有相同签名的方法: 目的是让方法重写的方法。这里的问题是,当我在内部调用时,只调用的方法。 在中的上设置的断点会脱扣,而在中的上设置的断点从不脱扣。我还在方法上尝试了,但它仍然调用方法。 目标是让对象以与其他对象不同的速度上下移动。因此方法也会

  • 我有以下场景: 以下是我的问题: 如果中的静态方法是公共的,则编译错误将为: 静态方法m1()与I中的抽象方法冲突。 因此,当访问修饰符是默认值时,它试图隐藏,而当它是公共的时,它是冲突的。为什么会有这样的区别呢?背后的理念是什么?

  • Java不允许通过更改子类的返回类型来重写方法,有什么特别的原因吗? 由于返回类型不是方法签名的一部分,编译器不认为具有不同返回类型(但具有相同名称、相同数量和类型的参数)的方法是相同的吗?

  • 为什么不可能在子类中有一个静态方法,它的签名与父类中的签名相同? 我只是想知道为什么他们允许在这里使用final修饰符?我们都知道静态方法属于一个类而不属于对象,所以不可能在子类中重写方法。所以对于我来说在这里是多余的。

  • 在JLS 8第8.4.8.1节中,有一条声明: 在某些参数化下,泛型超类C中的具体方法可以与该类中的抽象方法具有相同的签名。在这种情况下,具体方法是继承的,而抽象方法不是。然后应将继承的方法视为覆盖其来自C的抽象对等体。 有人能为泛型类提供这种参数化的例子吗?我不能。

  • 无法使用下面的行从子类访问方法, 假设我在子类中有一个方法,而父类中没有相同的方法。在这种情况下,我们无法使用上述代码行访问子类方法print()。但是请注意,如果我们在父类中有相同的方法,那么我们可以使用上面的代码访问它。 可能没有这样的现实生活场景,但试图理解为什么我无法访问子类使用类型为父的子对象,如果我们没有在父类中定义相同的方法。 示例代码如下: 更多解释——如果我在父类中定义了方法,那