在我csdn博客上有,http://blog.csdn.net/baidu_26654149/article/details/44461099。在这里再贴下。
Overload和Override的区别?
答:Overload是重载,Override是重写(也称覆盖)。都是类的多态性的体现。
共同点:方法名称都相同。
不同点:1.Overload是发生在同一个类中,Override是发生在子类和父类之间;
2.Overload要求参数列表不同,而Override要求参数列表完全相同;
3.Overload对于方法前面的修饰符没有限制,而Override则对这些修饰符的使用有限制(参见下边的“两小一大原则”);
4.Overload时编译器在编译期间就可以确定调用那一个方法,而Override则有可能在运行期间才能确定。
Override(重写)注意点:要遵守“两小一大”原则。
“两小”指:1.子类方法返回值类型应小于或等于父类方法返回值类型;
2.子类方法声明抛出的异常应小于或等于父类方法声明抛出的异常;
“一大”指:子类方法的访问权限应大于或等于父类访问权限。重写方法和被重写方法要么都是 类方法要么都是实例方法,切忌一个类方法一个实例方法。
特别指出:被private修饰的方法是不能被重写的。
语言的表达总是那么的不能一目了然,上几个最简单的代码说明吧:
// 重载Overload
class OverLoad
{
public static void main (String [] args)
{
// 无参数方法
show();
// 一个参数的方法
show("我要重载");
// 两个参数的方法
show(12,"我还要重载");
}
public static void show()
{
System.out.println("后面两个要重载我");
}
public static void show(String a)
{
System.out.println(a);
}
public static void show(int a , String s)
{
System.out.println(a+"..."+s);
}
}
// 运行结果:
// 后面两个要重载我
// 我要重载
// 12...我还要重载
//--------------------------------------------
// 重写Override
class OverRide
{
public static void main (String [] args)
{
SuperClass s = new SubClass();
//静态方法被隐藏,父类仍可调用。
s.name();
//调用的是父类方法,因为父类和子类的say方法的参数列表不一致,故不能被覆盖
s.say();
// 下面一行出错
// s.say(20);
// 实例方法被覆盖,调用的是子类方法
s.work();
}
}
class SuperClass
{
static void name()
{
System.out.println("superfather") ;
}
public void say()
{
System.out.println("父类有话说");
}
public void work()
{
System.out.println("父类在工作");
}
}
class SubClass extends SuperClass
{
static void name()
{
System.out.println("subson") ;
}
public void say(int a)
{
System.out.println("子类说的是:"+a);
}
public void work()
{
System.out.println("子类在工作");
}
}
// 运行结果:
superfather
父类有话说
子类在工作 |