方法重载:
在同一个类中,不同的方法,他们的功能是一样的,我们使用了“相同的”名称来表示,但是他们的形参列表不同,可能是个数不同,可能是类型不同,这样的两个或多个方法,称为方法的重载。和返回值类型无关。
例如:
public static void main(String[] args){
int max1 = max(2,5);//max1=5
double max2 = max(2.1,5.5);//max2=5.5
int max3 = max(2,5,3);//max3=5
}
int max(int a, int b){
return a>b?a:b;
}
double max(double a, double b){//类型不同
return a>b?a:b;
}
int max(int a, int b, int c){//个数不同
int m = a>b ? a : b;
return m > c ? m : c;
}
//返回值不同,形参列表相同,编译错误,因为重写要求形参列表必须不同,与返回值无关
/*double max(int a, int b){
return a>b?a:b;
}*/
方法的重写(Override):
-
1、什么情况下需要重写?
- 当子类继承了父类的某个方法,但是这个方法的实现(方法体)的代码不适用于子类的功能特征,那么子类可以选择进行重写。
-
2、重写的要求?
-
(1)方法名称:必须相同
-
(2)形参列表:必须相同
- 如果形参列表不同,那么就是构成重载,而不是重写。
-
(3)返回值类型:
- 如果基本数据类型(8种)和void:要求必须相同
- 如果是引用数据类型:要求子类重写的数据类型<=父类原数据类型(我们认为子类的类型是<父类的类型,从事物的分类范围来说的)
-
(4)权限修饰符:
- A: 不能私有的。 如果是跨包,还不能是缺省的。因为它们在子类中不可见,所以无法进行重写。
- B:而且要求:子类重写的修饰符>=父类原方法修饰符
-
(5)其他修饰符
- A:不能static
- B:不能final
-
class Graphic{//图形类型
//所有的图形都应该具备一个功能:可以求面积
protected double getArea(){
return 0.0;//这里只是为了保证编译不报错
}
}
class Circle extends Graphic{//圆,图形的一种
private double radius;//圆的半径
public Circle(){
//什么都没写,会默认调用super()方法
}
public Circle(double radius) {
super();
this.radius = radius;
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
//重写父类的getArea()
public double getArea() {
return Math.PI * radius * radius;
}
//错误示例:方法名称不一样,就不是重写,这是一个全新的扩展的方法
//编译不报错,但不是重写,是一个新方法
public double getMianJi(){
return Math.PI * radius * radius;
}
//以下示例,属于重载
//子类有两个getArea方法,一个是从父类继承的,一个是自己声明的
//编译不报错,对本类方法进行了重载
public double getArea(double r) {
return Math.PI * radius * radius;
}
//编译不通过,即不是重载,也不是重写
/*public void getArea() {
double area = Math.PI * radius * radius;
System.out.println("area = " + area);
}*/
}