我最近开始学习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()方法不能被重写。我理解在重写中,方法名和返回类型应该相同,但在本例中返回类型不同。那么,有没有办法执行它而不导致重写,但保持相同的名称和不同的类型?
如我所知,如果您建立继承关系,并且对父类中已存在的方法使用相同的签名,则无法更改返回类型,除非您希望更改作为原始类型实例的类型的返回类型,否则将导致语法错误,因此,您需要更改子类中的方法签名或重写它。假设这是适用的,那么一个子类将有两个具有相同签名的方法,一个是继承的,另一个是显式编写的,因此当您调用它时,JVM将不知道要调用哪个方法,因此这是不适用的。要小心重写一个方法,它应该是一个实例方法和相同的签名和相同的返回类型,或者是一个原始类型的实例和相同的访问修饰符或更强的值,否则会导致语法错误。
有没有办法执行它而不会导致重写,但保持相同的名称和不同的类型?
仅当父类中的方法声明为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
}
}
在Java中,方法签名是方法声明的一部分。它是方法名称和参数列表的组合。
当我们在超类和子类中讨论相同的方法签名时,我们讨论的是协变返回类型,所以我们讨论的是重写。
为什么我的子类方法不重写其父类中相同签名的方法? 我有一个类,它扩展了一个抽象类,后者扩展了抽象类Actor(这里的上下文是一个pong游戏)。和都有一个具有相同签名的方法: 目的是让方法重写的方法。这里的问题是,当我在内部调用时,只调用的方法。 在中的上设置的断点会脱扣,而在中的上设置的断点从不脱扣。我还在方法上尝试了,但它仍然调用方法。 目标是让对象以与其他对象不同的速度上下移动。因此方法也会
我有以下场景: 以下是我的问题: 如果中的静态方法是公共的,则编译错误将为: 静态方法m1()与I中的抽象方法冲突。 因此,当访问修饰符是默认值时,它试图隐藏,而当它是公共的时,它是冲突的。为什么会有这样的区别呢?背后的理念是什么?
Java不允许通过更改子类的返回类型来重写方法,有什么特别的原因吗? 由于返回类型不是方法签名的一部分,编译器不认为具有不同返回类型(但具有相同名称、相同数量和类型的参数)的方法是相同的吗?
为什么不可能在子类中有一个静态方法,它的签名与父类中的签名相同? 我只是想知道为什么他们允许在这里使用final修饰符?我们都知道静态方法属于一个类而不属于对象,所以不可能在子类中重写方法。所以对于我来说在这里是多余的。
在JLS 8第8.4.8.1节中,有一条声明: 在某些参数化下,泛型超类C中的具体方法可以与该类中的抽象方法具有相同的签名。在这种情况下,具体方法是继承的,而抽象方法不是。然后应将继承的方法视为覆盖其来自C的抽象对等体。 有人能为泛型类提供这种参数化的例子吗?我不能。
无法使用下面的行从子类访问方法, 假设我在子类中有一个方法,而父类中没有相同的方法。在这种情况下,我们无法使用上述代码行访问子类方法print()。但是请注意,如果我们在父类中有相同的方法,那么我们可以使用上面的代码访问它。 可能没有这样的现实生活场景,但试图理解为什么我无法访问子类使用类型为父的子对象,如果我们没有在父类中定义相同的方法。 示例代码如下: 更多解释——如果我在父类中定义了方法,那