当前位置: 技术问答>java相关
请大大侠详细解释一下override和overload的概念,以及多态的概念
来源: 互联网 发布时间:2017-04-27
本文导语: 请大大侠详细解释一下override和overload的概念,以及多态的概念 | 方法重载(overload) 方法重写(override) ------------------------ 方法重载的规则是: 一、参数列表必须不同,个数的不同完全可以...
请大大侠详细解释一下override和overload的概念,以及多态的概念
|
方法重载(overload)
方法重写(override)
------------------------
方法重载的规则是:
一、参数列表必须不同,个数的不同完全可以,如果个数相同则参数类型的不同不能引起歧意,例如int 和long,float和double就不能作为唯一的类型不同;
二、返回值可以不同,但是不能是重载时唯一的不同点(这点和c++中不同,c++中返回类型必须一致)。
-----------------------
方法重写发生在类继承时,子类可以重写一个父类中已有的方法,必须在返回类型和参数列表一样时才能说是重写,否则就是重载,java中方法重写的一个重要而且容易被忽略的规则是重写的方法的访问权限不能比被重写的方法的访问权限低!
重写的另一个规则是重写的方法不能比被重写的方法抛弃(throws)更多种类的异常,其抛弃的异常只能少,或者是其子类,不能以抛弃异常的个数来判断种类,而应该是异常类层次结果上的种类。
方法重写(override)
------------------------
方法重载的规则是:
一、参数列表必须不同,个数的不同完全可以,如果个数相同则参数类型的不同不能引起歧意,例如int 和long,float和double就不能作为唯一的类型不同;
二、返回值可以不同,但是不能是重载时唯一的不同点(这点和c++中不同,c++中返回类型必须一致)。
-----------------------
方法重写发生在类继承时,子类可以重写一个父类中已有的方法,必须在返回类型和参数列表一样时才能说是重写,否则就是重载,java中方法重写的一个重要而且容易被忽略的规则是重写的方法的访问权限不能比被重写的方法的访问权限低!
重写的另一个规则是重写的方法不能比被重写的方法抛弃(throws)更多种类的异常,其抛弃的异常只能少,或者是其子类,不能以抛弃异常的个数来判断种类,而应该是异常类层次结果上的种类。
|
1. override / overload
假如有
class A {
void m1() {..}
protected void m2() {System.out.println("m2() of A");}
public void m3() {...}
}
那么
class SubA extends A {
//这是重载
void m1(String s) {..}
//这是重构(重写/覆写)
protected void m2() {System.out.println("m2() of SubA");}
//这是错误的
// void m3() {...}
}
2. 多态
interface I {
void testM();
}
class Imp1 implements I {
public void testM() {
System.out.println("i am Imp1");
}
}
class Imp2 implements I {
public void testM() {
System.out.println("i am Imp2");
}
}
public class TestCls {
public static void test(I itf) { //注意这里的参数类型是接口
itf.testM();
}
public static void main(String[] args) {
Imp1 i1 = new Imp1();
Imp2 i2 = new Imp2();
//注意,这里可以传任何实现了接口I 的类的实例
test(i1); // print: i am Imp1
test(i2); // print: i am Imp2
}
}
虽然test(I itf)参数接收类型为I,但是
test(i1) test(i2)输出结果却根据具体实现而不同,这就是多态的体现
具体,参考thinking in java
假如有
class A {
void m1() {..}
protected void m2() {System.out.println("m2() of A");}
public void m3() {...}
}
那么
class SubA extends A {
//这是重载
void m1(String s) {..}
//这是重构(重写/覆写)
protected void m2() {System.out.println("m2() of SubA");}
//这是错误的
// void m3() {...}
}
2. 多态
interface I {
void testM();
}
class Imp1 implements I {
public void testM() {
System.out.println("i am Imp1");
}
}
class Imp2 implements I {
public void testM() {
System.out.println("i am Imp2");
}
}
public class TestCls {
public static void test(I itf) { //注意这里的参数类型是接口
itf.testM();
}
public static void main(String[] args) {
Imp1 i1 = new Imp1();
Imp2 i2 = new Imp2();
//注意,这里可以传任何实现了接口I 的类的实例
test(i1); // print: i am Imp1
test(i2); // print: i am Imp2
}
}
虽然test(I itf)参数接收类型为I,但是
test(i1) test(i2)输出结果却根据具体实现而不同,这就是多态的体现
具体,参考thinking in java