java67.com在多态性方面是错误的吗?[已关闭]

k5hmc34c  于 2023-01-29  发布在  Java
关注(0)|答案(1)|浏览(169)

2天前关闭。
Improve this question
下面是他们网站上的一个例子:
Java中的多态性示例Java中的多态性、重载和覆盖之间的区别示例让我们来看一个Java中的多态性的简短示例。在此示例中,Pet变量表现为多态性,因为它可以是Cat或Dog。这也是一个方法覆盖的示例,因为makeSound()方法在子类Dog和Cat中被覆盖。

import java.util.ArrayList;
import java.util.List;

abstract class Pet{
    public abstract void makeSound();
}

class Cat extends Pet{

    @Override
    public void makeSound() {
        System.out.println("Meow");
    }  
}

class Dog extends Pet{

    @Override
    public void makeSound() {
        System.out.println("Woof");
    }
 
}

Let's test How the Polymorphism concept works in Java:

/**
 *
 * Java program to demonstrate What is Polymorphism
 * @author Javin Paul
 */
public class PolymorphismDemo{

    public static void main(String args[]) {
        //Now Pet will show How Polymorphism work in Java
        List<Pet> pets = new ArrayList<Pet>();
        pets.add(new Cat());
        pets.add(new Dog());
     
        //pet variable which is type of Pet behave different based
        //upon whether pet is Cat or Dog
        for(Pet pet : pets){
            pet.makeSound();
        }
   
    }
}

Output:
Meow
Woof

***总而言之,您不能将多态性与方法重载或重写进行比较。***多态性是变量根据其引用的对象类型而表现不同的能力。它们是Java编程语言在语言中实现多态性的方式。

在第二个例子中,作者只是想指出,在运行时,我们不知道对象将是什么,但这也包括了一个重写的例子?
阅读更多信息:www.example.comhttps://www.java67.com/2012/10/difference-between-polymorphism-overloading-overriding-java.html#ixzz7rRlx0PQY
那么这是不是一种重写形式呢?

e7arh2l6

e7arh2l61#

术语是一种简化交流的方式。我的大脑想到了一个概念,我想把它传达给你的大脑。我的大脑想出了一些包含我试图传达的概念的单词。我让我的嘴动起来,我的语音盒,颤抖的空气出来,它们到达你的耳朵,从那里到你的大脑,从那里你解码音频信息。
如果你认为我试图传达的概念与我实际上试图传达的概念大致相当,那么沟通就是成功的。

这就是这些条款的全部好处

很明显你只是无可救药地(这不是你问的第一个问题)。你为什么要“关心”呢?你不需要知道“override”这个词是什么意思,你只需要知道JVM /javac应用它们时的概念和规则。你可以所有这些“overriding”,或者你可以称之为“floobargling”,这与我无关。只要你清楚就行。
如果你甚至不理解这本书试图告诉你的这些概念,那么“让我试着问一些java程序员他们认为这个术语是什么意思,然后如果他们认为这个java语言特性是他们认为这个术语意思的一个应用”不会让你更接近理解它。
具体来说,“多态性”在这里是没用的。它是一个模糊的术语,人们用来描述正交的概念。在将概念从大脑传递到声音(或者键盘,如果你喜欢的话),再到耳朵,再到另一个大脑的工作中,用“多态性”这个术语来概括概念很可能会导致沟通失败。
另一方面,Override和Overload的定义要好得多:Java语言规范中
明确**使用的这些术语表示Java上下文中非常具体的东西。你觉得这些是多态的“形式”还是“示例”完全取决于你觉得这个术语的意思。我不明白为什么要知道它。您可能已经对根据您提供的输入内容让相同的代码执行不同的操作的概念有所了解,这就是“多态性”,你试图弄清楚java的“重载”和“覆盖”的概念是什么意思,在这种情况下,我建议你只是..学习这些术语的意思,而不是祈祷你问别人,如果这些是“多态性的形式”,他们对多态性的理解和你一样。
或者,这是一种家庭作业,你需要写一篇关于这一切的文章,在这种情况下,建议基本上是一样的,试着理解概念,不要太担心使用什么术语。

覆盖

在java中,仅适用于方法(不是构造函数,不是字段),任何类型都可以定义一个全新的方法。一个方法有一个“标识”,这个标识由它的名称和它所有的参数类型定义,至少在类文件级别,甚至是它的返回类型。相反,如果您定义了一个方法,其标识与来自超类型类或接口的方法标识完全匹配,那么您就没有定义一个新方法,你覆盖了超类型的方法。在语言级别(因此,javac的作用是什么),紧缩返回类型仍然是一个覆盖(但这不包括参数类型),泛型根本不包含在这个元素中(因为在运行时级别,即类文件和java.exe,泛型不存在)。

class Parent {
  Object foo(String a) {
    System.out.println("In parent");
    return null;
  }
}

class Child extends Parent {
  String foo(String b) {
 // This is an override
    System.out.println("In child");
    return null;
  }
}

Java执行“动态调度”,意思是:每当你调用一个方法时,* 最具体的可用覆盖 * 实际上被调用了。它是关于你的表达式所引用的对象的实际类型,而不是关于表达式的类型。因此:

Parent p = new Child();
p.foo("");

打印“In child”。即使p的类型是parent,如果您跟随指针,p实际上指向的是Child的示例,而Child的foo() impl更具体。因此,你不能告诉java不要这样做--只有Child本身可以(通过调用super.foo(a)来显式调用父级的foo()实现)。你不能像p.super.foo("")那样做,那不是法律的的java。

超载

如前所述,方法 * 的标识包括其参数类型 *。因此,给定:

class Parent {
  void foo(String a) {
    System.out.println("in Parent");
  }
}

class Child extends Parent {
  void foo(Object b) {
    System.out.println("in Child");
  }
}

这是完全不同的方法。就像一个叫“jane”的方法和另一个叫“奥布里”的方法一样不同--完全,完全无关。

Parent p = new Child();
p.foo(null);

这将编译并打印'In Parent'。因为p是Parent类型,foo(null)可能引用的唯一foo方法是Parent中的foo(String)方法,因此调用了该方法。在运行时,系统尽职尽责地查找它的最具体实现。也就是Parent的foo,因为child中的foo是一个完全不同的方法,毕竟它的标识不匹配。
如果您尝试以下操作:

Child c = new Child();
c.foo(null);

有两个完全不同的方法,但是任何一个都可以被调用。Javac将拒绝编译它,并告诉你这是一个不明确的方法调用(javac不清楚你想要哪个)。关键的区别是,在第二个例子中,有两个不同的方法,而在第一个例子中(我们正在重写),只有一个方法标识,以及该标识的两个实现。
假设这是两个不同的方法,编译器需要将p.foo()转换为类文件,并且作为该工作的一部分,它需要命名您试图调用的对象的完整方法标识:Javac会判断出您要调用一堆重载中的哪一个。
那么,哪一个是多态性呢?
这完全取决于你所指的“多态性”。java语言规范没有使用这个词,因此java程序员不需要关心这个词。第一个例子是重写。第二个例子是重载。我不明白在混合中引入一个模糊的、定义不清的术语有什么意义。

相关问题