重载
重载,从简单说,就是函数或者方法有相同的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。在java中同一个类中的2个或2个以上的方法可以有同一个名字,只要它们的参数声明不同即可。
1.C++中运算符的重载
<返回类型说明符> operator <运算符符号>(<参数表>)
{
<函数体>
}
2.一般的重载
public class OverloadDemo {
void test(){ //test()方法第一次重载,没有参数
System.out.println("No parameters");
}
void test(int a){ //test()方法第二次重载,一个整型参数
System.out.println("a: "+a);
}
void test(int a,int b){ //test()方法第三次重载,两个整型参数
System.out.println("a and b: "+a+" "+b);
}
double test(double a){ //test()方法第四次重载,一个双精度型参数
System.out.println("double a: "+a);
return a*a; //返回a*a的值
}
}
结果:
public class Overload {
public static void main(String args[]){
OverloadDemo ob=new OverloadDemo();
double result;
ob.test(); //定义的是test()方法
ob.test(10); //定义的是test(int a)方
ob.test(10,20); //定义的是test(int a,int b)方法
result=ob.test(123.23); //定义的是test(double a)方法
System.out.println("result of ob.test(123.23): "+result); //输出result的值
}
}
运行结果: No parameters
a: 10
a and b: 10 20
double a: 123.23
result of ob.test(123.23): 15185.6329
多态
多态是同一个行为具有不同表现形式或形态的能力
多态就是同一个接口,使用不同的实例而执行不同操作
多态是在不同继承关系的类对象,去调同一函数,产生了不同的行为。
C++中
但是构成多态还有两个条件:
- 调用函数的对象必须是指针或者引用。
- 被调用的函数必须是虚函数,且完成了虚函数的重写。
当上面的代码被编译和执行时,它会产生下列结果:
Parent class area
Parent class area
导致错误输出的原因是,调用函数 area() 被编译器设置为基类中的版本,这就是所谓的静态多态,或静态链接 - 函数调用在程序执行前就准备好了。有时候这也被称为早绑定,因为 area() 函数在程序编译期间就已经设置好了。
但现在,让我们对程序稍作修改,在 Shape 类中,area() 的声明前放置关键字 virtual,如下所示:
修改后,当编译和执行前面的实例代码时,它会产生以下结果:
Rectangle class area
Triangle class area
此时,编译器看的是指针的内容,而不是它的类型。因此,由于 tri 和 rec 类的对象的地址存储在 *shape 中,所以会调用各自的 area() 函数。
正如您所看到的,每个子类都有一个函数 area() 的独立实现。这就是多态的一般使用方式。有了多态,您可以有多个不同的类,都带有同一个名称但具有不同实现的函数,函数的参数甚至可以是相同的。
虚函数
虚函数 是在基类中使用关键字 virtual 声明的函数。在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数。
我们想要的是在程序中任意点可以根据所调用的对象类型来选择调用的函数,这种操作被称为动态链接,或后期绑定。
纯虚函数
您可能想要在基类中定义虚函数,以便在派生类中重新定义该函数更好地适用于对象,但是您在基类中又不能对虚函数给出有意义的实现,这个时候就会用到纯虚函数。
我们可以把基类中的虚函数 area() 改写如下:
= 0 告诉编译器,函数没有主体,上面的虚函数是纯虚函数。
java中
分为编译时多态和运行时多态
执行以上程序,输出结果为:
吃鱼
抓老鼠
吃骨头
看家
吃鱼
抓老鼠