什么是java中的多态方法?

我正在研究用于SCJP测试的java语言。

理解“多态方法”有点难。

你能帮我解释一下吗? 或者给我一些链接?

“多态”意味着“许多形状”。 在Java中,您可以使用具有相同名称的具有不同内容的子类的超类。 传统的例子是超类Shape ,带有子类CircleSquareRectangle ,以及方法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只有一些经验)“多态方法”是一个不熟悉的术语,所以它可能被用来表示其他东西。 这只是我的解释。

这个答案假定了重载,inheritance和generics的知识。

我们可以看到以下多态的任何方法都被称为多态方法。 请注意,方法仅由其签名唯一识别。 返回类型不计。 因此,方法多态性与它的返回类型无关。

多态性的类型/多态方法

polymorphism这个词的根源在于两个希腊词: poly (表示很多)和morphos (表示forms)。 在编程中,多态性是实体(例如,变量,类,方法,对象,代码,参数等)在不同上下文中具有不同含义的能力。 具有不同含义的实体称为多态实体。 存在各种类型的多态性。 每种类型的多态都有一个名称,通常表明在实践中如何实现这种类型的多态。 正确使用多态性会产生通用和可重用的代码。

多态性可分为以下两类:

  • Ad hoc多态性

    • 重载多态
    • 强制多态性
  • 通用多态性

    • 包含多态性
    • 参数多态性

让我们先讨论Ad hoc多态性 。 如果一段代码适用于有限数量的类型,并且在编写代码时必须知道所有这些类型,则称为ad hoc多态。 Ad hoc多态性也称为表观多态性,因为它不是真正意义上的多态性。 一些计算机科学纯粹主义者根本不认为ad hoc多态是多态的。

Ad hoc多态性进一步分为两类:

a)重载多态

b)强制多态性

重载多态:

让我们先讨论Overloading polymorphism 。 重载是一种特殊的多态性。 当方法(称为Java中的方法和其他语言中的函数)或运算符至少有两个适用于不同类型的定义时,重载结果。 在这种情况下,相同的名称(对于方法或运算符)用于它们的不同定义。 也就是说,同名表现出许多行为,因此具有多态性。 这些方法和运算符称为重载方法和重载运算符。 Java允许您定义重载方法。 Java有一些重载的运算符(比如使用整数的字符串运算符添加它们但是使用字符串连接),但它不会让你为ADT重载运算符。 也就是说,您无法在Java中为运算符提供新定义。

因此,所有重载方法都是多态的。

强制多态性

强制是一种特殊的多态性。 当类型被自动隐式转换(强制)为另一种类型时发生强制,即使它没有明确意图。 考虑Java中的以下语句:

  int num = 707; double d2 = num; //Coercion - Implicit Type conversion 

让我们用一种方法来看待它:

 double square(double num) { return num * num; } 

在这里,square()方法可以通过整数参数或双参数调用。 不要将此多态性与超类型接受子类型的多态性混淆。 这是包含多态性,它属于通用多态性。 不同之处在于,这里不是另一个的子类型。 没有inheritance权。

假设m是声明类型T的forms参数的方法。如果S是可以隐式转换为T的类型,则方法m相对于S和T是多态的。

现在我们讨论通用多态性 。 如果一段代码以这样的方式编写,即它适用于无数种类型(也适用于编写代码时未知的新类型),则称为通用多态。 在通用多态性中,相同的代码适用于许多类型,而在ad hoc多态中,为不同类型提供了不同的代码实现,给出了多态性的明显印象。

包含多态性

包含是一种通用的多态性。 它也被称为子类型(或子类)多态性,因为它是使用子类型或子类进行实现的。 这是面向对象编程语言支持的最常见的多态类型。 Java支持它。 当使用类型编写的一段代码适用于其所有子类型时,会发生包含多态性。

Java支持使用inheritance的包含多态性,inheritance是一种子类别机制。 您可以使用类型的forms参数(例如,Person)在Java中定义方法,并且可以在其所有子类型上调用该方法,例如,Employee,Student,Customer等。假设您有方法processDetails()如下:

 void processDetails(Person p) { /* Write code using the formal parameter p, which is of type Person. The same code will work if an object of any of the subclass of Person is passed to this method. */ } 

一段代码只有在无限多种类型的情况下才被称为通用多态。 在包含多态性的情况下,代码工作的类型的数量受到约束但是是无限的。 约束是所有类型必须是编写代码的术语类型的子类型。 如果对类型可以有多少个子类型没有限制,则子类型的数量是无限的(至少在理论上)。

假设m是声明超类型T的forms参数的方法。如果S是子类型,则方法m相对于S和T是多态的。

参数多态性

Parametric是一种通用的多态性。 它也被称为“真正的”多态,因为它允许您编写适用于任何类型(相关或不相关)的真正通用代码。 有时,它也被称为generics。

在参数多态中,一段代码以这样的方式编写,即它适用于任何类型。 对比参数多态与包涵体多态性。 在包含多态性中,代码是针对一种类型编写的,它适用于所有子类型。 这意味着代码在包含多态性中工作的所有类型都通过超类型 – 子类型关系相关联。 但是,在参数多态中,相同的代码适用于所有类型,这些类型不一定相关。

参数多态通过在编写代码时使用类型变量来实现,而不是使用任何特定类型。 类型变量假定需要执行代码的特定类型。 Java从Java 5到generics支持参数多态。 Java支持多态实体(例如,参数化类)以及使用参数多态的多态方法(参数化方法)。 在Java中,参数多态性是使用generics实现的。

 class Collections { public static  void copy(List dest, List src) { ... } 

这就结束了Java中的多态方法及其类型。

资源

多态性是表示“多种forms的一种forms”的过程。

它不是编程概念,但它是原则之一。

 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 

要了解更多信息 – http://algovalley.com/java/polymorphism.php

如果满足以下所有条件,则方法是签名多态的:

它在java.lang.invoke.MethodHandle类中声明。

它有一个Object []类型的forms参数。

它有一个返回类型的Object。

它设置了ACC_VARARGS和ACC_NATIVE标志。

在Java SE 8中,唯一的签名多态方法是类java.lang.invoke.MethodHandle的invoke和invokeExact方法。

JVM规范2.9。 特殊方法

java中的多态方法

在面向对象的编程中,多态性是指编程语言根据数据类型或类不同地处理对象的能力。 更具体地说,它是重新定义派生类的方法的能力。

多态方法是一种可以采用多种forms的方法 。 通过我的意思,该方法可以在不同的时间调用不同的方法。

假设你有一个class Animal和一个class Dog extends Animal和一个class Cat extends Animal ,它们都覆盖了方法sleep()

然后..

 animal.sleep(); 

..可以根据存储在变量animal的动态类型调用不同的方法