Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 阐述多态性_Java_Oop_Polymorphism_Overriding - Fatal编程技术网

Java 阐述多态性

Java 阐述多态性,java,oop,polymorphism,overriding,Java,Oop,Polymorphism,Overriding,我已经阅读了许多关于多态性的问题。这个问题是一个构建我的想法的问题,因为我已经阅读和研究了很多,以至于我脑子里有很多想法。我需要对我关于多态性的想法进行评论和批评。我将使用Java来演示我的想法 多态性是指在谈论某个实体时具有不同形式的特征。可以通过以下方式实现: 派生类从其基类继承所有可见的方法,因此可以重写某些方法的行为。 e、 g: 这里实现多态性的方式是,如果在运行时,draw()与Rectangle实例一起使用,则将调用Rectangle类中的draw()的实现 由于矩形是一种形

我已经阅读了许多关于多态性的问题。这个问题是一个构建我的想法的问题,因为我已经阅读和研究了很多,以至于我脑子里有很多想法。我需要对我关于多态性的想法进行评论和批评。我将使用Java来演示我的想法

多态性是指在谈论某个实体时具有不同形式的特征。可以通过以下方式实现:

  • 派生类从其基类继承所有可见的方法,因此可以
    重写某些方法的行为。
    e、 g:

这里实现多态性的方式是,如果在运行时,
draw()
Rectangle
实例一起使用,则将调用
Rectangle
类中的
draw()
的实现

由于矩形是一种形状,因此多态性是指
draw()
根据调用它的上下文采用不同的形式。这也称为继承多态性

  • 实现多态性的另一种方法是通过接口

    interface Vehicle{
         void move();
    }
    
    class Car implements Vehicle{
         void move(){
             System.out.println("The car is moving!");
         }
    }
    
    class Plane implements Vehicle{
         void move(){
             System.out.println("The plane is flying!");
         }
    }
    
    // we declare an object of type Vehicle
    // At compile-time, the concrete implementation of someVehicle is no known  
    // and thus polymorphism is achieved in the sense that someVehicle could
    // either be a Car or a Plane depending on which concrete class is used 
    // to instantiate it at run-time.
    
    Vehicle someVehicle;
    
  • 用户定义的运算符重载(不是在Java中,而是在C++中)

在Java中,运算符重载的一个例子是+运算符,其中+根据操作数执行特定功能。如果+应用于字符串,则会将其连接起来。如果将其应用于整数,它将执行算术加法


现在,方法重载也是实现多态性的一种方法吗?在对多态性的理解中,我遗漏了什么?

多态性的行为与您所解释的方式相同,但不是实现覆盖先前定义的方法的新方法的实际行为。多态性更像是一个抽象的概念。一般而言:

多态性是对象具有多种形式的能力。这个 在OOP中,多态性的最常见用法发生在父类 引用用于引用子类对象


还可以找到更多信息。

我认为您对java中发生的其他事情感到困惑。在C++等其他编程语言中,运算符重载是多态性的一种形式,然而在java中,它们是区分了诸如int和BoAlAn(字符串排序)以及扩展基JavaLang.Objor的其他所有元素之间的区别。语言设计者决定不让类具有运算符重载,因为它可能会非常混乱。因此,Java中没有有效的运算符多态性,因为除了toString()方法之外,您无法定义自己的运算符或重写其他运算符,但在我看来,这确实是一个接口。我认为你不能说+(对于字符串)操作符是java中操作符重载的一个例子,即使使用字符串,它也是调用toString()方法,在我看来,这并不是真正的操作符重载,因为当你应用操作执行顺序的规则时,操作符才有这个术语。如果只有一个运算符,+将字符串连接在一起,则不会应用求值顺序规则,因此这只是一个语法问题。对于整数和浮点数,有+、-、/运算符,但不能重载它们,这样就不是多态性。

多态性这个词的意思是“多种形式”

您给出的两个示例是多态性的确切有效示例:

  • 在第一个示例中,“绘制”功能的“多种形式”取决于您称之为“绘制”的对象的形状

  • 在第二种情况下,“移动”功能的“多种形式”取决于车辆

将被调用的实际方法是在运行时决定的,因为后期绑定

事实上,这两个示例非常相似,它们都是子类型的示例,这是在Java中实现多态性的方式

注意,在Java中需要子类型,因为Java是一种静态类型的语言。在动态类型语言(如Smalltalk)中,即使对象的类不属于同一类层次结构,拥有不同的“draw”方法实现就足够了

现在,关于方法重载:如果定义一个方法的多个版本接收不同的参数类型,那么该方法也会有“多种形式”

不同之处在于,在这种情况下,在编译时决定调用哪个方法。这就是为什么许多人将方法重载称为静态多态性

然而,由于它是静态的,并且基本上可以通过为方法指定不同的名称并根据所使用的类型决定调用哪个方法来实现相同的功能,因此许多人也会说方法重载实际上不是多态性


我认为这基本上取决于你想要使用的“多态性”的定义,但我希望上面的解释有助于澄清区别。

我可能有点过于简化了,但在我(可怜的、破碎的)看来,多态性是一个对象通过继承作为另一个对象的能力。例如,基于您的
Shape
Rectangle
示例,我将能够创建
Rectangle
的实例,并将其传递给期望
Shape
的任何方法/对象。现在,因为您已经重写了
draw
方法,当任何对象类使用此方法时,它将执行
Rectangle
的方法,因为类型或实例没有更改,只执行调用者“看到的”(您给了它一个
Rectangle
,但它仍然只看到一个
Shape
)@MadProgrammer方法重载不应与在运行时选择正确方法的多态形式混淆,例如
interface Vehicle{
     void move();
}

class Car implements Vehicle{
     void move(){
         System.out.println("The car is moving!");
     }
}

class Plane implements Vehicle{
     void move(){
         System.out.println("The plane is flying!");
     }
}

// we declare an object of type Vehicle
// At compile-time, the concrete implementation of someVehicle is no known  
// and thus polymorphism is achieved in the sense that someVehicle could
// either be a Car or a Plane depending on which concrete class is used 
// to instantiate it at run-time.

Vehicle someVehicle;