【发布时间】:2026-02-05 07:10:02
【问题描述】:
请在 Java 的上下文中解释什么是“多态方法”。
【问题讨论】:
-
您对这个词有疑问吗(即释义有帮助)?或者您对多态性的概念有疑问?
-
你首先了解多态性吗?
标签: java polymorphism terminology
请在 Java 的上下文中解释什么是“多态方法”。
【问题讨论】:
标签: java polymorphism terminology
“多态”的意思是“许多形状”。在 Java 中,您可以拥有一个超类,其子类使用相同的名称来做不同的事情。传统的例子是超类Shape,子类Circle、Square和Rectangle,以及方法area()。
所以,例如
// note code is abbreviated, this is just for explanation
class Shape {
public int area(); // no implementation, this is abstract
}
class Circle {
private int radius;
public Circle(int r){ radius = r ; }
public int area(){ return Math.PI*radius*radius ; }
}
class Square {
private int wid;
Public Square(int w){ wid=w; }
public int area() { return wid*wid; }
}
现在考虑一个例子
Shape s[] = new Shape[2];
s[0] = new Circle(10);
s[1] = new Square(10);
System.out.println("Area of s[0] "+s[0].area());
System.out.println("Area of s[1] "+s[1].area());
s[0].area() 调用Circle.area(),s[1].area() 调用Square.area()——因此我们说Shape 及其子类利用了对方法区域的多态调用。
【讨论】:
查理的回答用简单的术语解释了多态性是什么。
从那里继续,这将是一个“多态方法”:
public void Shape CreateShape() {
return new Circle(10);
}
从某种意义上说,它是“多态的”,它的签名表明您将获得Shape,但您真正获得的是Shape 的子类。由于您并不确切知道自己得到了什么(可能是Circle、Square 等),因此您必须使用超类的接口(即多态性)来处理它。
我应该提到(可能是因为我对 Java 的经验很少)“多态方法”是一个不熟悉的术语,因此它可能被用来表示其他东西。这只是我的解释。
【讨论】:
多态是一个表示“一种形式在多种形式中”的过程。
这不是一个编程概念,但它是原理之一。
Example 1 :
class A
{
void print(double d)
{
System.out.println("Inside Double");
}
void print(float f)
{
System.out.println("Inside Float");
}
}
class B
{
public static void main(String [ ] args)
{
A obj1 = new A();
obj1.print(10.0);
}
}
Output :
//save as : B.java
//compile as :javac B.java
//run as : java B
Inside Double
______________________
Example 2 :
class A
{
void print(double d)
{
System.out.println("Inside Double");
}
void print(float f)
{
System.out.println("Inside Float");
}
}
class B
{
public static void main(String [ ] args)
{
A obj1 = new A();
obj1.print(10.0f);
}
}
Output :
//save as : B.java
//compile as :javac B.java
//run as : java B
Inside Float
_______________________
Example 3 :
class A
{
void print(double d)
{
System.out.println("Inside Double");
}
void print(float f)
{
System.out.println("Inside Float");
}
}
class B
{
public static void main(String [ ] args)
{
A obj1 = new A();
obj1.print(10);
}
}
Output :
//save as : B.java
//compile as :javac B.java
//run as : java B
Inside Float
【讨论】:
如果满足以下所有条件,则方法是签名多态的:
在 java.lang.invoke.MethodHandle 类中声明。
它有一个 Object[] 类型的形式参数。
它的返回类型为 Object。
它设置了 ACC_VARARGS 和 ACC_NATIVE 标志。
在 Java SE 8 中,唯一的签名多态方法是 java.lang.invoke.MethodHandle 类的 invoke 和 invokeExact 方法。
【讨论】:
多态方法是一种可以采用多种形式的方法。我的意思是,该方法可能在不同的时间调用不同的方法。
假设你有一个class Animal 和一个class Dog extends Animal 和一个class Cat extends Animal,它们都覆盖方法sleep()
那么..
animal.sleep();
..可以根据变量animal中存储的动态类型调用不同的方法
【讨论】: