"多态"意味着"多种形状"。在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
及其子类利用多态调用了方法 area。
Charlie的答案简单地解释了多态是什么。
接下来,这就是一个“多态方法”:
public void Shape CreateShape() {
return new Circle(10);
}
多态方法是一种可以采用多种形式的方法。我所指的是,该方法在不同的时间可能会调用不同的方法。
假设您有一个Animal类
和一个Dog extends Animal类
和一个Cat extends Animal类
,它们都覆盖了方法sleep()
那么...
animal.sleep();
根据存储在变量animal
中的动态类型,可以调用不同的方法。
如果以下所有条件都成立,则该方法是签名多态的:
它在java.lang.invoke.MethodHandle类中声明。
它具有类型为Object[]的单个形式参数。
它具有返回类型Object。
它设置了ACC_VARARGS和ACC_NATIVE标志。
在Java SE 8中,唯一的签名多态方法是java.lang.invoke.MethodHandle类的invoke和invokeExact方法。
多态方法或函数是具有通用返回类型的Java中的函数(静态)或方法。
例如:
class SomeCollection<T> {
public <T> getFirstItem() //left unimplemented for example reasons
}
比如说,我们实例化一个new SomeCollection<MyObject>();
,这意味着方法getFirstItem()
会在这个实例中返回一个MyObject
。
这就是多态函数/方法的含义。
它是在方法或函数中定义的类型的泛型和多态的结合。
该函数有许多形式,可以在对象构造时定义。在我的例子中,该函数以MyObject
作为返回类型。
这个问题的其他答案是方法/函数参数中多态的例子。
希望对你有所帮助。
谢谢, Rhys
多态是一种表示“一种形式多种形式”的过程。
它不是一个编程概念,但它是其中的一个原则。
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