子 class 中的 Java 方法能否与父 class 中的方法具有相同的签名但不会导致覆盖?
Can a Java method in a sub class have the same signature as a method in the parent class but does not cause overriding?
我最近开始学习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() 方法。我理解重写,方法名称和 return 类型应该相同,但在这种情况下 return 类型是不同的。那么,有没有什么办法可以在不造成重写的情况下,保持同名不同类型的执行呢?
在Java中,方法签名是方法声明的一部分。 是方法名和参数列表的组合。
当我们谈论超类和子类中相同的方法签名 + 协变 return 类型时,我们在谈论重写。
(相同的签名 + 协变 return 类型)== 覆盖
据我所知,如果建立继承关系并且对父 class 中已存在的方法使用相同的签名,则不能更改 return 类型,除非您想要为原始类型的实例类型更改 return 类型,否则会导致语法错误,因此您需要更改 subclass 中的方法签名或覆盖它。假设那将是适用的,那么一个 subclass 将有两个具有相同签名的方法,一个是继承的,另一个是您显式编写的,所以当您调用它时,JVM 将不知道调用哪个,所以那是不适用的。
注意重写一个方法,它应该是实例方法和相同的签名和相同的 return 类型或原始类型的实例和相同的访问修饰符或更强,否则会导致语法错误。
有什么方法可以执行它而不导致覆盖但保持相同的名称和不同的类型?
仅当父 class 中的方法声明为 private
时,才不会发生覆盖,但方法 sides
的访问权限非常有限,因此 [= 中的以下代码16=] class 失败:
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
仅适用于 Pentagon
instances/references:
Pentagon p = new Pentagon();
System.out.println(p.sides()); // -> 5
如果 sides
方法在具有不同 return 类型的两个 class 中都声明为 static
,则代码也不会编译:
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,目前正在研究多态性。考虑以下代码:
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() 方法。我理解重写,方法名称和 return 类型应该相同,但在这种情况下 return 类型是不同的。那么,有没有什么办法可以在不造成重写的情况下,保持同名不同类型的执行呢?
在Java中,方法签名是方法声明的一部分。 是方法名和参数列表的组合。
当我们谈论超类和子类中相同的方法签名 + 协变 return 类型时,我们在谈论重写。
(相同的签名 + 协变 return 类型)== 覆盖
据我所知,如果建立继承关系并且对父 class 中已存在的方法使用相同的签名,则不能更改 return 类型,除非您想要为原始类型的实例类型更改 return 类型,否则会导致语法错误,因此您需要更改 subclass 中的方法签名或覆盖它。假设那将是适用的,那么一个 subclass 将有两个具有相同签名的方法,一个是继承的,另一个是您显式编写的,所以当您调用它时,JVM 将不知道调用哪个,所以那是不适用的。 注意重写一个方法,它应该是实例方法和相同的签名和相同的 return 类型或原始类型的实例和相同的访问修饰符或更强,否则会导致语法错误。
有什么方法可以执行它而不导致覆盖但保持相同的名称和不同的类型?
仅当父 class 中的方法声明为 private
时,才不会发生覆盖,但方法 sides
的访问权限非常有限,因此 [= 中的以下代码16=] class 失败:
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
仅适用于 Pentagon
instances/references:
Pentagon p = new Pentagon();
System.out.println(p.sides()); // -> 5
如果 sides
方法在具有不同 return 类型的两个 class 中都声明为 static
,则代码也不会编译:
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
}
}