override->重写(=覆盖)、overload->重载、polymorphism -> 多态
override是重写(覆盖)了一个方法,以实现不同的功能。一般是用于子类在继承父类时,重写(重新实现)父类中的方法。
重写(覆盖)的规则:
1、重写方法的参数列表必须完全与被重写的方法的相同,否则不能称其为重写而是重载.
2、重写方法的访问修饰符一定要大于被重写方法的访问修饰符(public>protected>default>private)。
3、重写的方法的返回值必须和被重写的方法的返回一致;
4、重写的方法所抛出的异常必须和被重写方法的所抛出的异常一致,或者是其子类;
5、被重写的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行重写。
6、静态方法不能被重写为非静态的方法(会编译出错)。
overload是重载,一般是用于在一个类内实现若干重载的方法,这些方法的名称相同而参数形式不同。
重载的规则:
1、在使用重载时只能通过相同的方法名、不同的参数形式实现。不同的参数类型可以是不同的参数类型,不同的参数个数,不同的参数顺序(参数类型必须不一样);
2、不能通过访问权限、返回类型、抛出的异常进行重载;
3、方法的异常类型和数目不会对重载造成影响;
多态的概念比较复杂,有多种意义的多态,一个有趣但不严谨的说法是:继承是子类使用父类的方法,而多态则是父类使用子类的方法。
一般,我们使用多态是为了避免在父类里大量重载引起代码臃肿且难于维护。
举个例子:
public class Shape
{
public static void main(String[]
args){
Triangle tri = new Triangle();
System.out.println("Triangle is a type of shape? " + tri.isShape());// 继承
Shape shape = new Triangle();
System.out.println("My shape has
" + shape.getSides() + " sides."); // 多态
Rectangle Rec = new Rectangle();
Shape shape2 = Rec;
System.out.println("My shape has " + shape2.getSides(Rec) + " sides.");
//重载
}
public boolean isShape(){
return true;
}
public int getSides(){
return 0 ;
}
public int
getSides(Triangle tri){ //重载
return 3 ;
}
public int
getSides(Rectangle rec){ //重载
return 4 ;
}
}
class Triangle extends Shape
{
public int getSides() {
//重写,实现多态
return 3;
}
}
class Rectangle extends Shape
{
public int getSides(int i) { //重载
return i;
}
}
注意Triangle类的方法是重写,而Rectangle类的方法是重载。对两者比较,可以发现多态对重载的优点:
如果用重载,则在父类里要对应每一个子类都重载一个取得边数的方法;
如果用多态,则父类只提供取得边数的接口,至于取得哪个形状的边数,怎样取得,在子类里各自实现(重写)。
分享到:
相关推荐
在面向对象编程语言中,如Java、C#等,重载(Overloading)、重写(Overriding)、覆盖(也称为重写)以及多态(Polymorphism)是几个非常重要的概念。它们之间既有关联又有区别,本文将详细解释这些概念,并探讨...
在面向对象编程中,重载、覆盖、多态和函数隐藏是几个重要的概念,它们共同作用于类的继承体系中,影响程序的行为和扩展性。下面将详细解释这些概念,并通过C++中的代码示例来加深理解。 首先,函数重载...
本文将深入探讨它们在继承、覆盖、多态和抽象类这几个关键概念上的异同。 首先,让我们从继承说起。继承是面向对象编程的核心特性,允许子类从父类中继承属性和方法。在Java中,类的继承使用关键字`extends`,而C#...
Java中的多态主要体现在以下几个方面: - **子类型的多态**:这是最常见的多态形式,指的是一个对象可以通过其基类或接口来引用。 - **接口的多态**:通过接口来实现多态。 - **重写(Override)**:子类重写父类的...
继承有以下几个特点: * 子类继承父类的所有成员变量和方法 * 子类可以重写父类的方法 * 子类可以添加新的成员变量和方法 * 子类可以 override 父类的方法 继承的应用 继承的应用非常广泛,例如: * 在游戏开发...
方法覆盖遵循几个基本规则: 1. 方法名和参数列表必须完全一致,否则不是覆盖而是定义了一个新的方法。 2. 子类方法的访问修饰符可以与父类中的不同,但子类方法的访问范围必须大于或等于父类方法的访问范围。 3. ...
编译时多态主要体现在方法的重载(Overloading),即在同一个类中可以有多个同名方法,但参数列表不同。编译器会根据传入参数的类型和数量来决定调用哪个方法。运行时多态则基于方法的重写(Overriding),子类可以...
为了实现多态,Java提供了几个关键的要求: 1. **派生类对象的方法调用必须通过一个基类类型的变量进行**:这意味着在调用多态方法时,必须使用父类的引用变量指向子类对象。 2. **调用的方法必须在派生类中被定义*...
### C++ 中重写、重载与重定义的区别 在 C++ 编程语言中,重写(Override)、重载(Overload)以及重定义(Redefine 或 Hide)是面向对象编程中非常重要的概念。这三个概念虽然在字面上相似,但它们在实际应用中的...
在VS2010中,创建多态实例的过程通常包括以下几个步骤: 1. 定义基类:首先,我们需要定义一个基类,该类中包含一些虚方法或属性。 ```csharp public class BaseClass { public virtual void Method() { Console...
在Java中,多态性有以下几个关键要素: 1. 继承:一个类可以继承另一个类的属性和方法,子类继承父类后,可以拥有父类的所有非私有成员。这样,子类的对象就可以被当作父类的对象使用,这就是多态的基础。 2. 抽象...
案例中可能包含一个基类(如:Animal),以及几个继承自基类的子类(如:Dog、Cat)。基类中通常会定义一些公共方法,比如`MakeSound()`,在基类中它可能只是简单地打印出"动物叫声"。在子类中,`MakeSound()`方法会...
2. 重载多态:在Java中,同一个类可以有多个方法使用相同的名称,只要它们的参数列表不同(参数的个数或类型不同)。这样,编译器可以依据上下文区分不同的方法,实现了方法的重载。 3. 参数多态:这是一种通用的...
在本文中,我们将通过几个类的示例和讲解来理解 Java 多态性。首先,我们定义了四个类:A、B、C 和 D,其中 B 是 A 的子类,C 和 D 是 B 的子类。每个类中都定义了一个名为 show 的方法,用于输出字符串。 在 main ...
可以用这几个关键词来概括:多态、动态链接、向上转型。向上转型是指父类类型的引用指向子类对象。这种方法可以降低程序的耦合性,即调用者不必关心调用的是哪个对象,只需要针对接口编程就可以了,被调用者对于调用...
继承的几个关键特性包括: 1. **单一继承**:Java支持单根继承,即一个子类只能有一个直接父类。 2. **多层继承**:一个父类可以有多个子类,子类也可以成为其他子类的父类,形成继承链。 3. **抽象类和接口**:...
1. **方法的覆盖(Override)**:派生类可以重写基类中的非final、非静态方法,以实现不同的功能。这使得通过基类引用调用方法时,实际执行的是派生类中的方法。 2. **向上转型(Upcasting)**:派生类对象可以通过...
多态是超类通过方泌签名,向子类提供了一个同接口,由于类来完善或者覆盖它而实现的。 4.灵活性。多态在应用中体现了灵活多样的操作,提高了使用效率。 5.简化性。多态简化了对软件的代码编写和修改过程,尤其是在...
在Java、C#、Python等面向对象的语言中,多态主要体现在以下几个方面: 1. 方法重载(Overloading):在同一个类中,方法名相同但参数列表不同的多个方法。编译器根据传入的参数类型和数量来决定调用哪个方法,这在...
多态有两种形式:编译时多态(静态多态,通过方法重载实现)和运行时多态(动态多态,通过方法重写实现)。 在Java中,多态的实现依赖于以下几点: 1. **抽象类和接口**:抽象类定义了子类必须实现的接口,而接口则...