Java 阐述多态性
我已经阅读了许多关于多态性的问题。这个问题是一个构建我的想法的问题,因为我已经阅读和研究了很多,以至于我脑子里有很多想法。我需要对我关于多态性的想法进行评论和批评。我将使用Java来演示我的想法 多态性是指在谈论某个实体时具有不同形式的特征。可以通过以下方式实现:Java 阐述多态性,java,oop,polymorphism,overriding,Java,Oop,Polymorphism,Overriding,我已经阅读了许多关于多态性的问题。这个问题是一个构建我的想法的问题,因为我已经阅读和研究了很多,以至于我脑子里有很多想法。我需要对我关于多态性的想法进行评论和批评。我将使用Java来演示我的想法 多态性是指在谈论某个实体时具有不同形式的特征。可以通过以下方式实现: 派生类从其基类继承所有可见的方法,因此可以重写某些方法的行为。 e、 g: 这里实现多态性的方式是,如果在运行时,draw()与Rectangle实例一起使用,则将调用Rectangle类中的draw()的实现 由于矩形是一种形
- 派生类从其基类继承所有可见的方法,因此可以
重写某些方法的行为。 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++中)
现在,方法重载也是实现多态性的一种方法吗?在对多态性的理解中,我遗漏了什么?多态性的行为与您所解释的方式相同,但不是实现覆盖先前定义的方法的新方法的实际行为。多态性更像是一个抽象的概念。一般而言: 多态性是对象具有多种形式的能力。这个 在OOP中,多态性的最常见用法发生在父类 引用用于引用子类对象
还可以找到更多信息。我认为您对java中发生的其他事情感到困惑。在C++等其他编程语言中,运算符重载是多态性的一种形式,然而在java中,它们是区分了诸如int和BoAlAn(字符串排序)以及扩展基JavaLang.Objor的其他所有元素之间的区别。语言设计者决定不让类具有运算符重载,因为它可能会非常混乱。因此,Java中没有有效的运算符多态性,因为除了toString()方法之外,您无法定义自己的运算符或重写其他运算符,但在我看来,这确实是一个接口。我认为你不能说+(对于字符串)操作符是java中操作符重载的一个例子,即使使用字符串,它也是调用toString()方法,在我看来,这并不是真正的操作符重载,因为当你应用操作执行顺序的规则时,操作符才有这个术语。如果只有一个运算符,+将字符串连接在一起,则不会应用求值顺序规则,因此这只是一个语法问题。对于整数和浮点数,有+、-、/运算符,但不能重载它们,这样就不是多态性。多态性这个词的意思是“多种形式” 您给出的两个示例是多态性的确切有效示例:
- 在第一个示例中,“绘制”功能的“多种形式”取决于您称之为“绘制”的对象的形状
- 在第二种情况下,“移动”功能的“多种形式”取决于车辆
我认为这基本上取决于你想要使用的“多态性”的定义,但我希望上面的解释有助于澄清区别。我可能有点过于简化了,但在我(可怜的、破碎的)看来,多态性是一个对象通过继承作为另一个对象的能力。例如,基于您的
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;