含义理解
重载
1.发生在同意作用域内,例如,同一个类中或者同一个接口中
方法名要相同
形参组成不同:包括形参类型,个数
覆盖
1.不同作用范围内:继承别的类,实现接口
2. 既然是覆盖,当然外观要看起来一摸一样才行:
方法名相同:
形参组成相同(类型、个数均相同)
返回类型相同
隐藏
同覆盖类似,但特指类方法(静态方法)
示例分析
先定义两个类如下:
class Super{
int x=0;
static void name(){
System.out.println("Super");
}
void move(int dx){x+=dx;}
int getX(){return x;}
}
class Sub extends Super{
float x=0.0f;
void move(int dx){move((float)dx);
System.out.println("Sub move");}
void move(float dx){x+=dx;}
int getX(){return (int)Math.floor(x);}
static void name(){
System.out.println("Sub");
}
}
- 其中Super类是Sub的超类,而Sub类的两个move方法便是move(float)对move(int)的重载
- Sub中的move(int)是对Super类中的move(int)方法的覆盖.覆盖可以对超类方法进行功能的扩充
隐藏测试
还是上面的代码,我们进行以下测试
public static void main(String[] args) {
Super asuper = new Sub();
asuper.name();
asuper.move(2);
}
如果单看字类和超类的name()方法,完全满足覆盖的条件,但是由于name是类方法(static方法),在调用时的输出为:
Super
Sub move
可知,name方法调用的是超类中的,而正常的覆盖方法move是子类中的.此时我们称超类的name方法为隐藏方法.
执行过程:
首先会确定类类型:即Super,来在编译时确定要使用的类方法;然后确定实例类型:即Sub,来确定在运行时执行哪个实例方法.