重写(override)
1、重写一般用于子类继承父类时,重写(重新实现)父类中的方法。
2、重写方法的参数列表必须完全与被重写方法相同,否则则是重载(overload)
3、重写方法的访问修饰符必须大于被重写的方法的修饰符。其中:public>protected>default>private (具体各修饰符的访问权限见下表)
作用域
|
当前类
|
同包
|
子类
|
其他
|
public
|
√
|
√
|
√
|
√
|
protected
|
√
|
√
|
√
|
×
|
default
|
√
|
√
|
×
|
×
|
private
|
√
|
×
|
×
|
×
|
4、重写方法的返回值必须和被重写的方法的返回值一致。
5、重写的方法如果有抛出异常,必须和被重写的方法所抛出的异常一致,或者是其子类。
6、被重写的方法不能为private,否则其子类中只是新定义了一个方法,并没有重写。
7、静态方法不能重写(下面会举例说明)
重写的例子:
package com.Howard.test01;
/**
* 测试重写
* B类继承了A并重写了方法。测试后可发现实现了多态
* @author Howard
* 2017年2月9日
*/
public class overrideTest {
public static void main(String[] args) {
A test01 = new A();
A test02 = new B();
test01.print();
test02.print();
}
}
class A{
public void print(){
System.out.println("A 类的方法");
}
}
class B extends A{
//重写
public void print(){
System.out.println("B(继承了A) 类的方法");
}
}
说明第6和第7点不能重写:
package com.Howard.test01;
/**
* 测试重写
* 被重写的方法不能为private,否则其子类中只是新定义了一个方法,并没有重写。
* 由下面method3可看出 D类的method3无法加上@Override注解 证明并不能被重写
* 静态方法不能重写
* 由下面method2可看出 D类的method2无法加上@Override注解 证明并不能被重写
* 另 由运行结果也可以看出 静态方法并不能重写 并不能实现多态
* @author Howard
* 2017年2月9日
*/
public class overrideTest02 {
public static void main(String[] args) {
C test01 = new C();
C test02 = new D();
test01.method1();
test02.method1();
test01.method2();
test02.method2();
}
}
class C{
public void method1(){
System.out.println("C 类的方法method1");
}
public static void method2(){
System.out.println("C 类的方法method2");
}
private void method3(){
System.out.println("C 类的方法method3");
}
}
class D extends C{
//重写
@Override
public void method1(){
System.out.println("D 类的方法method1");
}
//@Override
public static void method2(){
System.out.println("D 类的方法method2");
}
//@Override
private void method3(){
System.out.println("D 类的方法method3");
}
}
重载(overload)
1、一般用于在一个类内实现若干个方法,这些方法名相同,但是参数形式不同。
2、在使用重载时只能通过相同的方法名、不同的参数形式实现。不同的参数类型可以是不同的参数类型、不同的参数个数、不同的参数顺序(但参数类型必须不不一样)
3、不能通过访问权限、返回类型、抛出异常来判断重载。
4、方法的异常类型和数目不会对重载造成影响。
package com.Howard.test01;
/**
* 简单测试重载(overload)
* 参数个数或参数类型或参数顺序不同 参数顺序不同必须保证参数类型不同
* 与修饰符和返回值无关
* @author Howard
* 2017年2月9日
*/
public class overloadTest {
public static void main(String[] args) {
E e = new E();
System.out.println(e.method());
System.out.println(e.method(0));
System.out.println(e.method(0, 1.0F));
System.out.println(e.method(1.0F, 0));
System.out.println(e.method(0, 'a'));
}
}
class E{
public int method(){
System.out.println("调用无参方法,返回int");
return 1;
}
public int method(int i){
System.out.println("调用带int参方法"+i+",返回int");
return 2;
}
public int method(int i,float j){
System.out.println("调用带int、float参方法"+i+" "+j+",返回int");
return 3;
}
public int method(float j,int i){
System.out.println("调用带float、int参方法"+j+" "+i+",返回int");
return 4;
}
float method(int i,char a){
System.out.println("调用带int、char参方法"+i+" "+a+",返回float");
return 5.0F;
}
}
重载(Overload)和重写(Override)的区别
方法的重载和重写都是实现多态的方式。区别在于前者实现的是编译时的多态性,而后者是实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载。重载对返回类型没有要求。重写发生在子类与父类之间,重写要求子类被重写的方法与父类的方法有相同的名称,且比父类更好访问(修饰符),不能比父类被重写方法声明更多异常。重写要求放回类型必须相同。
另:构造器不能被继承 故构造器只能重载不能重写。
顺便说下
多态:
实现多态需要做两件事:1. 方法重写(子类继承父类并重写父类中已有的或抽象的方法);2. 对象造型 (用父类型引用引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为)。